Вы находитесь на странице: 1из 23

SISTEMA DE ENVIO Y RECEPCION DE MENSAJERIA

ENCRIPTADA MEDIANTE SOCKETS CON CONEXIÓN A


BASE DE DATOS EN MySQL

ANALISIS DE ALGORÍTMOS Y ESTRATEGIAS DE


PROGRAMACIÓN

LUIS ENRIQUE GUTIÉRREZ DAMIÁN

INGENIERÍA DE SISTEMAS COMPUTACIONALES

ING. MANUEL MONDRAGÓN VILELA


INTRODUCCION

En el presente trabajo de investigación y desarrollo se implementa un sistema de comunicación

bidireccional (envío y recepción) de mensajería utilizando un método de encriptación propio,

utilizando como medio de conexión el ya conocido sistema “Sockets” de java además de lo

anteriormente citado, también contara con un número limitado de usuarios que podrán acceder al

sistema, los cuales formaran parte de la base de datos de administradores del sistemas.
DESCRIPCIÓN DEL PROBLEMA

Hoy en día se ha vuelto muy importante la efectividad en los procesos y más aún si estos están
programados en un computador, pues estos garantiza óptimos resultados y mayor respaldo de la
información con la que se está trabajando es por ello, que nace el concepto de “sistemas
distribuidos”, como su propio nombre lo sostiene, es un sistema que trabaja de forma paralela o
distribuida las tareas que está encargado de ejecutar, garantizando así mayor eficiencia en el
trabajo, en cuanto a tiempo, seguridad, etc.

Que acompañado de la optimización constante de cierto producto o trabajo hacen que dicho
producto se vuelva más efectivo y por ende más valorado en el mercado.

OBJETIVOS

Implementar y optimizar la primera entrega del programa que ya se había trabajado, teniendo en
cuenta para el desarrollo del nuevo software puntos como los algoritmos distribuidos, mejorar el
método de encriptación usado en la primera entrega, validación de usuarios a la base de datos.

Estos 3 grandes e importantes puntos a tener en cuenta al desarrollar el programa son los que se
deben cumplir, trazar un estándar y procurar superarlo, ya que exigencias de este tamaño son con
los que convivirá el egresado de la carrera de Ing. De sistemas Computacionales.

Análisis teórico:
Para entender lo que se trabajó tanto en el programa1, como en el programa2 se debe entender y
tener en cuenta los sgtes. Conceptos:

SHA256:

Es un algoritmo de encripta miento, tal y como se señala en el sgte párrafo, podemos ver que los
autores del libro califican al Algoritmo SHA256 como “confiable”:

“Este documento presenta una arquitectura de carpetas de implementación de hardware SHA256


para la informática móvil confiable”

Young, M., Liu, P., & Lin, D. (2008). Information Security and Cryptology. Begin China: Springer.

Sockets y Stream (canal):

“Para un cliente, el proceso de usar Sokets en java consta de 3 pasos:

1.- Crear el Socket a partir de la dirección de la maquina servidor y el puerto asociado al proceso
de la maquina al que queremos conectarnos (correo, HTTP, FTP, etc.)

2.-Conseguir los Streams de lectura y escritura, asociados al Socket.

3.-Cerra el Socket del mimo modo que hacíamos con los Streams. De hecho, cerrando un Streams
Asociado al Socket, también cerrara el Socket.”

Caballé, S., & Xhafa, F. (2007). Aplicaciones Distribuidas en Java con tecnologia RMI. Madrid:
Publicaciones Delta.
Análisis practico:
VISTA GENERAL NRO 1 DEL “PROGRAMA1” (ANTES DE SER OPTIMIZADO)

Como se observa el programa1 está compuesto por 2 formularios JFrame, los cuales contienen en
su interior la conexión socket con las líneas de código que permite encriptar el mensaje en
SHA256.

VISTA GENERAL N°2 DEL “PROGRAMA1” (ANTES DE SER OPTIMIZADO)

Como se observa el programa1 ha procedido a encriptar el mensaje contenido en el Textfield del


Jframe “Cliente” y mostrarlo en el JtextArea del Jframe “Servidor” esto mediante un método de
encripta miento SHA256 (ya visto anteriormente en clase).
DESCRIPCION GENERAL DEL “PROGRAMA 1”:

El programa1 básicamente está compuesto por 2 formularios Jframe (Cliente y servidor), los cuales
contienen en su interior la conexión socket con las líneas de código que permite encriptar el
mensaje en SHA256.

A continuación se presenta el código que contiene el Jframe “Servidor”:

package EjercicioSocket;

import java.io.DataInputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JTextArea;

public class JfrmServidor extends javax.swing.JFrame implements Runnable{


JTextArea txtmensajes;

public JfrmServidor() {
initComponents();
txtmensajes=new JTextArea();
txtmensajes.setBounds(40,30,400,400);
add(txtmensajes);

setLayout(null);
setSize(500, 500);
//setVisible(true);
setLocationRelativeTo(null);
Thread hilo=new Thread(this);
hilo.start();
}

@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 400, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 300, Short.MAX_VALUE)
);

pack();
}// </editor-fold>

public static void main(String args[]) {

/* Set the Nimbus look and feel */


//<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
/* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
* For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
*/
try {
for (javax.swing.UIManager.LookAndFeelInfo info :
javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException ex) {

java.util.logging.Logger.getLogger(JfrmServidor.class.getName()).log(java.util.logging.Level.SEVERE
, null, ex);
} catch (InstantiationException ex) {

java.util.logging.Logger.getLogger(JfrmServidor.class.getName()).log(java.util.logging.Level.SEVERE
, null, ex);
} catch (IllegalAccessException ex) {

java.util.logging.Logger.getLogger(JfrmServidor.class.getName()).log(java.util.logging.Level.SEVERE
, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {

java.util.logging.Logger.getLogger(JfrmServidor.class.getName()).log(java.util.logging.Level.SEVERE
, null, ex);
}
//</editor-fold>

/* Create and display the form */


java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new JfrmServidor().setVisible(true);

}
});
}

@Override
public void run() {
try {
ServerSocket servidor=new ServerSocket(6500);
Socket cliente;

while(true){
cliente=servidor.accept();
DataInputStream flujo=new DataInputStream(cliente.getInputStream());
String mensaje=flujo.readUTF();
txtmensajes.append("\n"+mensaje);
cliente.close();
if(mensaje.equalsIgnoreCase("FIN"))
servidor.close();
break;
}
} catch (IOException ex) {
Logger.getLogger(JfrmServidor.class.getName()).log(Level.SEVERE, null, ex);
}

// Variables declaration - do not modify


// End of variables declaration
}
A continuación se presenta el código que contiene el Jframe “Cliente”:

package EjercicioSocket;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.io.DataOutputStream;

import java.net.Socket;

import javax.swing.JButton;

import javax.swing.JTextField;

public class JfrmCliente extends javax.swing.JFrame implements ActionListener{

JTextField txtmensaje;

JButton btnenviar;

JButton btnexaminar;

public JfrmCliente() {

initComponents();

txtmensaje=new JTextField();

txtmensaje.setBounds(10,10,200,30);

add(txtmensaje);

btnenviar=new JButton();

btnenviar.setText("Enviar");
btnenviar.setBounds(20,50,100,30);

btnenviar.addActionListener(this);

add(btnenviar);

setLayout(null);

setSize(250,150);

//setVisible(true);

setLocationRelativeTo(null);

/**

* This method is called from within the constructor to initialize the form.

* WARNING: Do NOT modify this code. The content of this method is always

* regenerated by the Form Editor.

*/

@SuppressWarnings("unchecked")

// <editor-fold defaultstate="collapsed" desc="Generated Code">

private void initComponents() {

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());

getContentPane().setLayout(layout);

layout.setHorizontalGroup(

layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 400, Short.MAX_VALUE)

);

layout.setVerticalGroup(

layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGap(0, 300, Short.MAX_VALUE)

);

pack();

}// </editor-fold>

/**

* @param args the command line arguments

*/

public static void main(String args[]) {

try {

for (javax.swing.UIManager.LookAndFeelInfo info :


javax.swing.UIManager.getInstalledLookAndFeels()) {

if ("Nimbus".equals(info.getName())) {

javax.swing.UIManager.setLookAndFeel(info.getClassName());

break;

} catch (ClassNotFoundException ex) {

java.util.logging.Logger.getLogger(JfrmCliente.class.getName()).log(java.util.logging.Level.SEVERE,
null, ex);
} catch (InstantiationException ex) {

java.util.logging.Logger.getLogger(JfrmCliente.class.getName()).log(java.util.logging.Level.SEVERE,
null, ex);

} catch (IllegalAccessException ex) {

java.util.logging.Logger.getLogger(JfrmCliente.class.getName()).log(java.util.logging.Level.SEVERE,
null, ex);

} catch (javax.swing.UnsupportedLookAndFeelException ex) {

java.util.logging.Logger.getLogger(JfrmCliente.class.getName()).log(java.util.logging.Level.SEVERE,
null, ex);

//</editor-fold>

/* Create and display the form */

java.awt.EventQueue.invokeLater(new Runnable() {

public void run() {

new JfrmCliente().setVisible(true);;

});

@Override

public void actionPerformed(ActionEvent ae) {

if(ae.getSource()==btnenviar){
try{

Socket cliente=new Socket("192.168.1.11", 6500);

DataOutputStream flujo= new DataOutputStream(cliente.getOutputStream());

flujo.writeUTF(txtmensaje.getText());

cliente.close();

}catch(Exception e){

System.out.println("Error en cliente"+e.getMessage());

// Variables declaration - do not modify

// End of variables declaration

*Cabe mencionar que los objetos contenidos en los Jframe están creados a partir de código.
VISTA GENERAL NRO 1 DEL “PROGRAMA2” (DESPUES DE SER OPTIMIZADO)

Se aprecia la conexión a la base de datos desarrollada en MySQL Workbrench llamada


“administradores”.

La Base de datos desarrollada en MySQLWorkBrench la cual contiene datos de los


administradores de nuestro programa.
Como se observa el programa2 está compuesto en 2 Proyectos, los cuales contienen en su
interior, 2 Paquetes respectivamente, El Paquete “Cliente”, que contiene:

Archivo.java (JFrame)

Que en su interior contiene 2 Button (Seleccionar Archivo y Enviar) ,1 Jlabel (Donde aparecerá la
ruta de ubicación del archivo)

CorregirRuta.java (Clase)

En su interior se encuentran las líneas de código que harán que la ruta sea manipulada de una
manera más eficiente para el programa (esta acción se hace apoyándose en la efectividad de la
clase “StringTokenizer”).
EnviarArchivo.java (Clase)

Sin duda una de las clases más importantes de este proyecto es aquí donde se crean objetos que
contendrán la dirección IP de la maquina a la cual se va a enviar el archivo, también el puerto por
el cual vamos a hacer la llamada a la maquina servidor, se recomienda colocar como puertos a los
mayores de 1024 ya que los inferiores a estos números son usados por diferentes programas, es
decir mientras más alto sea tu número de puerto es mejor (garantiza la disponibilidad del puerto)
siempre teniendo en cuenta que el número máximo de puerto que contiene una pc es 49151.

PruebaSocket.java (Clase)

Aquí es donde inicializa todo el programa instanciadolo cada vez que corremos el programa.
El Paquete “Servidor”, que contiene:

Servidor.java (Clase)

Esta clase debe ser corrida en la máquina que recepcióna el mensaje (archivo.txt), ya que aquí
también se inicializa el mismo número de puerto que la maquina emisora del mensaje, aquí se
aprecia el uso de métodos como el ReadUTF que sirve para leer archivos de tipo
DataInputStream, también métodos como FileOutputStream, BufferedOutputStream,
manipulación de Byte[] (Arreglo de bytes) y su conversión a String, para posterior mente aplicar
la conversión del contenido del archivo a otra cadena que será su equivalencia encriptada
utilizando la librería proporcionada en clase (encriptación para el método MD5), entre otras
métodos.
Corriendo el Programa2:
Antes:

Se abre ambos proyectos en netbeans, solo para cuestiones de simulación enviaremos el


archivo.txt a la misma máquina, si deseamos hacerlo a otra máquina solo sería cuestión editar la
dirección IP de la máquina que recepcionará al archivo (siempre que ambas se encuentren en la
misma red), esto en la clase “enviarArchivo.java” del paquete Cliente.
Luego de abrir los proyectos, procederé a crear un archivo llamado “Prueba.txt” que contendrá la
palabra “Hola” (En una unidad de almacenamiento extraíble, USB “F:”).

Durante:

Seguidamente ejecutare la Clase Servidor.

Esto hará que se muestre el siguiente mensaje “Servidor Iniciado”.


También el siguiente mensaje en el panel de salida del netbeans.

Una vez que tenemos el “Servidor Iniciado”, y gracias a nuestro método “aceept ();” el servidor
estará única y exclusivamente abocado a recepcionar el mensaje que le enviara la maquina
“Cliente”, posterior a esta acción, Al correr el Archivo.java (que es el formulario de la clase Cliente),
se inicia mostrando 2 botones, el primero que es para seleccionar el archivo a enviar y el segundo
que será para proceder a enviar tal archivo (observamos como mejora la ventana grafica desde la
cual se seleccionara el archivo).
Una vez seleccionado el archivo a enviar se muestra la ubicación del archivo en el “JLabel” que no
se aprecia sino hasta seleccionado el archivo.
Por ultimo observamos que se transfirió con éxito el archivo a la ruta especificada de forma interna
en el programa, cabe resaltar que se observó que si un archivo con el nombre ya existe este no se
enviara, como también una falencia al escribir el nombre al archivo, aspectos que se mejoraran
para el día de la exposición (semana 8).

Resultados del análisis.


Y solo para verificar la veracidad de la operación de nuestro programa nos dirigimos a la siguiente
página web la cual nos descifra una cadena en MD5.

https://md5online.es/

Corroborando que fue exitoso el trabajo de nuestro programa.


CONCLUSIONES

Como conclusión principal podría hablar del KAYZEN (principio de mejora continua), es decir, aun
habiendo optimizado el programa, implementando otro algoritmo de encriptación, una estructura
más robusta y desarrollada en el interior del programa, se siguen presentando ligeros pero
importantes aspectos a mejorar, entonces se podría decir que el desarrollo de software está
asociado a un trabajo de mejora continua, esto partiendo de un análisis permanente y estudio de
métodos y manejos de objetos en el lenguaje de programación en el que se trabaja.

También podría citar como una conclusión el uso necesario de un trabajo debidamente
estructurado tomándonos el tiempo necesario para analizar cada línea de código y su lógica, solo
de esta manera se puede entender, mejorar, rediseñar, y reemplazar líneas de código dentro del
programa.

Otra conclusión seria la importancia del rol que cumplen en el aspecto de seguridad informática,
los algoritmos de encriptación, como también la importancia de estándares dentro de los mismos.
918a050d-1720-4cab-97f3-c6aedc27e4ba

Вам также может понравиться