sábado, 25 de noviembre de 2017

JUnit

Unit es un marco de pruebas unitarias para el lenguaje de programación Java. Juega un papel crucial en el desarrollo impulsado por pruebas, y es una familia de marcos de pruebas unitarias conocidas colectivamente como xUnit.

JUnit promueve la idea de "primero probar y luego codificar", que hace hincapié en la configuración de los datos de prueba para una pieza de código que se puede probar primero y luego implementar. Este enfoque es como "prueba un poco, codifica un poco, prueba un poco, codifica un poco". Aumenta la productividad del programador y la estabilidad del código del programa, lo que a su vez reduce el estrés en el programador y el tiempo dedicado a la depuración.

Para su implementación se dará como ejemplo el siguiente código.
Las pruebas de software son uno de los procesos y actividades más importantes a la hora de desarrollar proyectos relacionados con la ingeniería de software, pues de estas depende la calidad que el proyecto posea. Por tanto, la utilización de métodos que faciliten, optimicen y sobretodo automatice dicho proceso de pruebas supone una gran mejoría en el desarrollo del proyecto y su calidad final.

Crear un nuevo archivo llamado Calculator.java
public class Calculator {
public int evaluate(String expression) {
int sum = 0;
for (String summand: expression.split("\\+"))
sum += Integer.valueOf(summand);
return sum;
}
}
Crear una prueba:
import static org.junit.Assert.assertEquals;
import org.junit.Test;

public class CalculatorTest {
  @Test
  public void evaluatesExpression() {
    Calculator calculator = new Calculator();
    int sum = calculator.evaluate("1+2+3");
    assertEquals(6, sum);
  }
}
Ejecutar con la siguiente línea:
javac -cp .;junit-4.XX.jar;hamcrest-core-1.3.jar CalculatorTest.java

Es necesario hacer múltiples pruebas en las que incluyan resultados fallidos.


Las pruebas de software son uno de los procesos y actividades más importantes a la hora de desarrollar proyectos relacionados con la ingeniería de software, pues de estas depende la calidad que el proyecto posea. Por tanto, la utilización de métodos que faciliten, optimicen y sobretodo automatice dicho proceso de pruebas supone una gran mejoría en el desarrollo del proyecto y su calidad final.

Referencias:
Anónimo. (2009). Unit Testing and JUnit. 25/11/2017, de Indraprastha Institute of Information Technology Sitio web: https://www.iiitd.edu.in/~jalote/jalotesebook/JaloteSEbook/tmp/UnitTesting.pdf

Augusto, F. (2012). Getting started. 25/11/2017, de GitHub Sitio web: https://github.com/junit-team/junit4/wiki/getting-started 

lunes, 20 de noviembre de 2017

Función Hash

Introducción

Una función hash es método para generar claves o llaves que representen de manera unívoca a un documento o conjunto de datos. Es una operación matemática que se realiza sobre este conjunto de datos de cualquier longitud, y su salida es una huella digital, de tamaño fijo e independiente de la dimensión del documento original. El contenido es ilegible.7
Es posible que existan huellas digitales iguales para objetos diferentes, porque una función hash tiene un número de bits definido. En el caso del SHA-1, tiene 160bits, y los posibles objetos a resumir no tienen un tamaño límite. A partir de un hash o huella digital, no podemos recuperar el conjunto de datos originales. Los más conocidos son el MD5 y el SHA-1, aunque actualmente no son seguros utilizarlos ya que se han encontrado colisiones. Cifrar una huella digital se conoce como firma digital.

Desarrollo
Requisitos que deben cumplir las funciones hash.
Imposibilidad de obtener el texto original a partir de la huella digital.
Imposibilidad de encontrar un conjunto de datos diferentes que tengan la misma huella digital (aunque como hemos visto anteriormente es posible que este requisito no se cumpla).
Poder transformar un texto de longitud variable en una huella de tamaño fijo (como el SHA-1 que es de 160bits).
Facilidad de empleo e implementación.
Ejemplos de funciones hash

MD5
Es una función hash de 128 bits. Como todas las funciones hash, toma unos determinados tamaños a la entrada, y salen con una longitud fija (128bits). El algoritmo MD5 no sirve para cifrar un mensaje. La información original no se puede recuperar, ya que está específicamente diseñado para que a partir de una huella hash no se pueda recuperar la información. Actualmente esta función hash no es segura utilizarla, nunca se debe usar.

SHA-1
Es parecido al famoso MD5, pero tiene un bloque de 160bits en lugar de los 128bits del MD5. La función de compresión es más compleja que la función de MD5, por tanto, SHA-1 es más lento que MD5 porque el número de pasos son de 80 (64 en MD5) y porque tiene mayor longitud que MD5 (160bits contra 128bits).

SHA-1 es más robusto y seguro que MD5, pero ya se han encontrado colisiones, por tanto, actualmente esta función hash no es segura utilizarla, nunca se debe usar.

SHA-2
Las principales diferencias con SHA-1 radica en en su diseño y que los rangos de salida han sido incrementados. Dentro de SHA-2 encontramos varios tipos, el SHA-224, SHA-256, SHA-384 y SHA-512. El más seguro, es el que mayor salida de bits tiene, el SHA-512, que tiene 80 rondas (pasos), como el SHA-1 pero se diferencia de éste en:
Tamaño de salida 512 por los 160 de SHA-1.
Tamaño del bloque, tamaño de la palabra y tamaño interno que es el doble que SHA-1.
Como ocurre con todos los cifrados y hash, cuanto más seguro, más lento su procesamiento y uso, debemos encontrar un equilibrio entre seguridad y velocidad.

Software
Si quieres comprobar o realizar la función hash a un archivo o texto, podréis encontrar el md5sum y el sha1sum por defecto instalados en sistemas operativos Linux. Si utilizas un sistema operativo Microsoft Windows podéis bajar el Snap MD5 que es un todo en uno (tiene para MD5 y para SHA-1).

Conclusión
Las funciones HASH (MD5, SHA-1, etc.) pueden usarse además para autenticar a dos usuarios.
Como carecen de una clave privada no pueden usarse de forma directa para estos propósitos, no obstante existen algoritmos que permiten añadirles esta función.
Entre ellos está HMAC, una función que usando los HASH vistos y una clave secreta autentica a dos usuarios mediante sistemas de clave secreta, las funciones MAC (Message Authentication Code) y HMAC se dedican a la autenticación y firma digital.
HMAC se usa en plataformas IP seguras como por ejemplo en Secure Socket Layer, SSL.

Referencias
http://redyseguridad.fi-p.unam.mx/proyectos/criptografia/criptografia/index.php/5-criptografia-asimetrica-o-de-clave-publica/55-funciones-hash/551-introduccion
https://www.gaussianos.com/algoritmos-hash-i-introduccion/
Stallings William, ¨Cryptography and network security: Principles and practice¨, 2da edición.

https://www.ibm.com/support/knowledgecenter/es/SSGR73_7.5.1/com.ibm.wci.doc/ref_DigesHash.html

jueves, 16 de noviembre de 2017

API RMI

Introducción
Los sistemas distribuidos requieren que las operaciones corran en diferentes hosts. Es un mecanismo necesario en la actualidad, debido a todas las innovaciones tecnológicas a las que estamos acostumbrado, esto como hemos visto antes se soporta con java sockets.
El uso de sockets permite la elaboración de aplicaciones distribuidas. Sin embargo, en ocasiones, son necesarios enfoques con un mayor grado de abstracción que el proporcionado por éstos. Al utilizar sockets, las aplicaciones deben desarrollar sus propios mecanismos para manejar de forma eficiente los mensajes intercambiados, con la consecuente complicación que esto conlleva.
En Java encontramos una herramienta que nos permite ejecutar código de forma remota (basándose en el principio que usa Remote Procedure Calling), a la cual se le denomina RMI (Remote Method Invocation) la cual nos permite ejecutar remotamente métodos de objetos ubicados en un servidor.

Desarrollo
La API RMI (Remote Method Invacation) proporciona un mecanismo para facilitar la elaboración de aplicaciones distribuidas. Integrado dentro de la jerarquía de paquetes oficiales del lenguaje de programación Java, se adapta perfectamente al modelo de programación de dicho lenguaje.

RMI integra este concepto en el lenguaje de programación Java, de manera que el manejo de objetos en aplicaciones distribuidas mantenga la semántica propia de los objetos locales de Java. En consecuencia, RMI puede ser fácilmente integrada con otras APIs de dicho lenguaje.

El uso de interfaces remotas proporciona una serie de ventajas, como son: las implementaciones de los métodos no son visibles por los clientes y no hace falta comunicar a los clientes cambios realizados en las implementaciones de los métodos.

RMI es, entonces, un paquete de Java que nos brinda la oportunidad de manejar objetos (lo que incluye también a sus métodos) de manera remota para hacer uso de líneas de código de un servidor haciendo parecer que dichas líneas de código se ejecutan en la máquina cliente de manera local. Para que esto se logre, existe algo denominado stub.

Un stub permite que la ejecución de una función invocada de manera remota pueda ser simulada localmente. En el caso del servidor, su stub se conoce como skeleton. 
Para que la comunicación entre el cliente y el servidor se pueda llevar a cabo, es necesario que se implemente, ya sea por el cliente o por el servidor, determinadas interfaces. Esto ayuda en el sentido de que se evita que se defina localmente la clase remota, lo cual hace el cliente al definir la interfaz y no la clase remota.

Mecanismo de RMI (Procesos fundamentales)
Cliente: Proceso que invoca un método en un objeto remoto.
Servidor: Proceso que posee el objeto remoto.
Registro de objetos: Se usa para el registro de objetos, para obtener acceso a objetos remotos utilizando su nombre.

Arquitectura
El sistema RMI consta de tres capas.
La capa sub/skeleton: Es la interfaz entre la capa de aplicación y el resto del sistema RMI. Transmite datos desde la capa remota a través de un flujo ordenado. Este flujo emplea un mecanismo llamado serialización, el cual habilita los objetos java a ser transmitidos entre espacio de direcciones.
Tareas que realiza el sub:
·         Iniciar una llamada a un objeto remoto
·         Ordenar los argumentos del flujo
·         Informar a la capa de referencia remota que la llamada sebe ser hecha
·         Retomar el valor o excepción de un flujo
·         Decodificar el flujo de datos
·         Hacer la llamada de la implementación del objeto remoto actual

La capa de referencia visual.
La capa de transporte.



Conclusión
Los orígenes de RMI se remontan a la invención de la tecnología RPC (Remote Procedure Calling). Aquí lo que buscamos es poder utilizar código de forma remota, lo que nos lleva, evidentemente, a la transferencia de datos. RMI, siendo una tecnología de Java, nos facilita el trabajo de implementar código que nos permita manejar objetos remotamente. Su arquitectura simula la arquitectura cliente-servidor, sin embargo, en este caso tenemos un componente más: registry, el cual nos permite crear relaciones objeto-servidor que le facilitan al cliente encontrar el objeto que requiere utilizar. 

A diferencia de Socket Datagrama o Socket Stream, resulta mucho más fácil codificar en RMI. Así, si deseamos hacer una aplicación distribuida, RMI puede representar una excelente opción. Por último, cabe destacar la gran utilidad que tiene el stub dentro de toda esta gestión, ya que nos permite visualizar una aplicación como si la estuviéramos ejecutando localmente cuando en realidad se está ejecutando remotamente.

Referencias
Acervos Digitales UDLAP (2017). Remote Method Invocation. Obtenido de http://catarina.udlap.mx/u_dl_a/tales/documentos/msp/picen_x_pg/capitulo3.pdf
González, A. (2017). Universidad Técnica Féderico Santa María. Obtenido de http://profesores.elo.utfsm.cl/~agv/elo330/2s05/projects/CesarVasquez/sitio_web/que_es.html

UNAM. (2017). Programación Avanzada. Obtenido de Posgrado en Ciencia e Ingeniería de la Computación: http://lya.fciencias.unam.mx/jloa/rmi.pdf

domingo, 12 de noviembre de 2017

Kerberos

Introducción
La seguridad e integridad de sistemas dentro de una red puede ser complicada. Puede ocupar el tiempo de varios administradores de sistemas sólo para mantener la pista de cuáles servicios se estan ejecutando en una red y la manera en que estos servicios son usados. Más aún, la autenticación de los usuarios a los servicios de red puede mostrarse peligrosa cuando el método utilizado por el protocolo es inherentemente inseguro, como se evidencia por la transferencia de contraseñas sin encriptar sobre la red bajo los protocolos FTP y Telnet. Kerberos es una forma eliminar la necesidad deaquellos protocolos que permiten métodos de autenticación inseguros, y de esta forma mejorar la seguridad general de la red.

Desarrollo
Kerberos es un protocolo de seguridad creado por MIT que usa una criptografía de claves simétricas para validar usuarios con los servicios de red — evitando así tener que enviar contraseñas a través de la red. Al validar los usuarios para los servicios de la red por medio de Kerberos, se frustran los intentos de usuarios no autorizados que intentan interceptar contraseñas en la red.

El servicio Kerberos es una arquitectura cliente-servidor que proporciona seguridad a las transacciones en las redes. El servicio ofrece una sólida autenticación de usuario y también integridad y privacidad. La autenticacióngarantiza que las identidades del remitente y del destinatario de las transacciones de la red sean verdaderas. El servicio también puede verificar la validez de los datos que se transfieren de un lugar a otro (integridad) y cifrar los datos durante la transmisión (privacidad). Con el servicio Kerberos, puede iniciar sesión en otros equipos, ejecutar comandos, intercambiar datos y transferir archivos de manera segura. Además, Kerberos proporciona servicios de autorización, que permiten a los administradores restringir el acceso a los servicios y los equipos. Asimismo, como usuario de Kerberos, puede regular el acceso de otras personas a su cuenta.

El servicio Kerberos es un sistema de inicio de sesión único. Esto significa que sólo debe autenticarse con el servicio una vez por sesión, y todas las transacciones realizadas posteriormente durante la sesión se aseguran de manera automática. Una vez que el servicio lo autenticó, no necesita volver a autenticarse cada vez que utiliza un comando basado en Kerberos, como ftp o rsh, o accede a datos en un sistema de archivos NFS. Por lo tanto, no es necesario que envíe la contraseña a través de la red, donde puede ser interceptada, cada vez que utiliza estos servicios.

Conclusión
En resumen, Kerberos es una solución para ciertos problemas de seguridad de la red. Provee las herramientas de autenticación y criptografía reforzada a través de la red para ayudar a asegurar que los sistemas de información de una empresa o corporación están bien resguardados.
Sin embargo, y aunque se trate de un sistema robusto, no está exento de ciertos problemas, tanto de seguridad como de implementación, que han hecho que este sistema no esté todo lo extendido que debería.


Referencias
https://docs.oracle.com/cd/E24842_01/html/E23286/intro-5.html
http://web.mit.edu/rhel-doc/4/RH-DOCS/rhel-rg-es-4/ch-kerberos.html
https://www.cisco.com/c/es_mx/support/docs/security-vpn/kerberos/16087-1.pdf

domingo, 5 de noviembre de 2017

Socket Stream

El uso de sockets permite a dos programas ( ya sea entre dos o más computadoras) intercambiar un flujo de datos, constituyen el mecanismo para la entrega de paquetes de datos provenientes de la tarjeta de red a los procesos o hilos apropiados.

Un socket queda definido por un par de direcciones IP local y remota, un protocolo de transporte y un par de números de puerto local y remoto.


Un Socket Es una interfaz de entrada ­salida de datos que permite la intercomunicación entre procesos. Los procesos pueden estar ejecutándose en el mismo o en distintos sistemas, unidos mediante una red.

Existen dos tipos de sockets, por una parte, Sockets Stream, los más utilizados, hacen uso del protocolo TCP, el cual nos provee un flujo de datos bidireccional, secuenciado, sin duplicación de paquetes y libre de errores, los datos se transfieren sin encuadrarlos en registros o bloques. Si se rompe la conexión entre los procesos, éstos serán informados. A diferencia de los socket datagrama,  donde se transmiten paquetes individuales de información y no garantiza que los paquetes llegarán en alguna forma en particular.

el siguien es un ejemplo del uso de sockets stream en un servidor:



String hostName = args[0];
int portNumber = Integer.parseInt(args[1]);

try (
    Socket echoSocket = new Socket(hostName, portNumber);
    PrintWriter out =
        new PrintWriter(echoSocket.getOutputStream(), true);
    BufferedReader in =
        new BufferedReader(
            new InputStreamReader(echoSocket.getInputStream()));
    BufferedReader stdIn =
        new BufferedReader(
            new InputStreamReader(System.in))
)

Los sockets Stream y los datagrama tienen usos muy similares, mientras que uno notifica siexiste algún error a costa de mayor procesamiento, el otro es mucho más rápido y no garantiza que el destinatario reciba los paquetes.


 Cada uno de estos sockets pueden ser utilizados según las necesidades y funciones que vayan a desarrollar dentro de la red.

miércoles, 25 de octubre de 2017

Algoritmos de Cifrado

Los sistemas de cifrado asimétrico fueron creados con la finalidad de dar solución al problema de intercambio de la clave secreta de los sistemas de cifrado simétricos, el cifrado asimétrico también conocido como de doble clave o de clave pública consiste en utilizar dos claves, una para cifrar y otra para descifrar.
La clave que se utiliza para cifrar el mensaje es la clave pública del receptor, y es pública porque es conocida por más personas que sólo el emisor y el receptor de un determinado mensaje. El descifrado se lleva a cabo por el receptor y lo hace con su clave privada, lo que implica que ya no hay un intercambio de claves ya que cuando un mensaje es cifrado con la clave pública del receptor, se está asegurando que sólo él puede descifrar el mensaje con su clave privada que se supone sólo está en su poder.
La clave pública de cada persona es derivada de su clave privada mediante funciones de un sentido, es decir que son fáciles de calcular en una dirección pero muy difíciles de calcular a la inversa, lo que hace posible que la clave para cifrar se haga pública.
Es una práctica común utilizar los dos tipos de cifrado (simétrico y asimétrico) al momento de implementar un sistema criptográfico, con ello se busca aprovechar las mayores cualidades de cada uno; por un lado se intercambia de forma segura la clave con el cifrado asimétrico y por el otro el proceso cifrado/descifrado se realiza con rapidez y eficiencia con el cifrado simétrico.
El emisor utiliza una clave secreta para cifrar el MCla y por tanto un algoritmo simétrico, también cifra dicha clave pero con un algoritmo asimétrico y con la clave pública del receptor, con el objetivo de que solo éste pueda recuperarla ya que él es el único que tiene la clave privada para hacerlo, una vez que el receptor descifre la clave secreta podrá descifrar el mensaje con dicha clave.
Erika Aguillón Martínez. (2012). Fundamentos de Criptografía. octubre 25,2017, de UNAM 
Sitio web: http://redyseguridad.fi-p.unam.mx/proyectos/criptografia/criptografia/index.php/2-tecnicas-clasicas-de-cifrado/23-numero-de-claves/233-sistemas-de-dos-claves-cifradores-asimetricos