lunes, 27 de noviembre de 2017

Cifrado Hash


La tecnología relacionada e la seguridad web es uno de los pambitos más importantes y estudiados del desarrollo de software, pues  la cantidad de información que se mueve cada día por la web es mucha. Por ello se han desarrollado métodos que aseguran la calidad cada vez más complejos y eficaces. Uno de los más utilizados es la función criptográfica hash, el cual es un algoritmo matemático que transforma cualquier bloque arbitrario de datos en una nueva serie de caracteres con una longitud fija. Independientemente de la longitud de los datos de entrada, el valor hash de salida tendrá siempre la misma longitud.

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. Cifrar una huella digital se conoce como firma digital. Una función hash es un algoritmo matemático que nos da un resultado B al aplicarlo a un valor inicial A.

Propiedades que debe cumplir un hash Sea cual sea la longitud del texto base A, la longitud de su hash resultante B siempre va a ser la misma. Para cada entrada A, la función generará una salida B única. Dado un texto base, es fácil y rápido (para un ordenador) calcular su número resumen. Es imposible reconstruir el texto base a partir del número resumen.

Ejemplo:

public class Empleado {
    int        IDempleado;
    String     nombre;
    Departamento dept;

    // Métodos de la Clase 

    @Override
    public int hashCode() {
        int hash = 1;
        hash = hash * 17 + IDempleado;
        hash = hash * 31 + nombre.hashCode();
        hash = hash * 13 + ((dept == null) ? 0 : dept.hashCode());
        return hash;
    }
}

La encriptación hash supone un gran avance en la materia de seguridad web debido a su fácil implementación y ejecución, ademas de ser un método seguro a la hora de realizar transacciones por internet, ya sea recuperando una contraseña o pagando por un producto en una tienda virtual.

Referencias:

Anónimo. (2017). Función Hash. 27/11/2017, de Wikipedia Sitio web: https://es.wikipedia.org/wiki/Funci%C3%B3n_hash

Donohue, B.. (2014). ¿Qué Es Un Hash Y Cómo Funciona?. 27/11/2017, de Kaspersky Sitio web: https://latam.kaspersky.com/blog/que-es-un-hash-y-como-funciona/2806/

sábado, 25 de noviembre de 2017

JUnit


JUnit 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

domingo, 19 de noviembre de 2017

RMI

Existen una gran cantidad de mecanismos ofrecidos por java que simplifican y optimizan tareas en las aplicaciones en gran medida. Dentro de los sistemas distribuidos, unos de los más importantes es el Remote Method Invocation (RMI),  en el cual se puede invocar un método de manera remota. Es una manera sencilla para la comunicación de servidores de aplicaciones distribuidas que estén basados en Java.

Debido a que esta basado exclusivamente en java, su uso resulta de gran facilidad, pues proporciona el paso de objetos por referencia, el cual no esta permitido en otros métodos similares, recolección de basura distribuida y el paso de tipos arbitrarios.

El uso de RMI supone exportar un objeto el cual estará disponible en la red con un programa que permanecerá en espera en un puerto. El cliente puede invocar los métodos que tenga dicho objeto en la red de acuerdo a los siguiente pasos: encapsulamiento, invocación del método, regreso del valor de retorno en caso de que haya y por último el cliente recibe la respuesta y continúa como si la invocación hubiera sido local.

La arquitectura del RMI se divide en cuatro capas. La primera capa es la de aplicación y se corresponde con la implementación real de las aplicaciones cliente y servidor. La segunda capa es la correspondiente al proxy, interactúa con la capa de aplicación y es en donde están todas las llamadas a objetos remotos. La tercer capa es la de referencia remota y es la responsable de la semántica de las invocaciones. Por último, la capa de transporte se encarga de llevar la información de una máquina a otra mediante el protocolo JRMP. 

Es así como se lleva a cabo uno de los mecanismos más fáciles de implementar y cuyo utilidad es muy basta, pues el cliente tiene el acceso de objetos y sus métodos de un servidor, ejecutándolo como si fuera local.

domingo, 12 de noviembre de 2017

Kerberos


La expansión de las utilidades de las redes ha permitido que hayan ciertas actividades cuya ejecución resulte mucho más rápida que si se hiciera personalmente. El uso de la web para realizar pagos y transacciones es uno de los usos más importantes dentro de estas redes, sin embargo, en siempre resultaba inseguro llevarla a cabo, por esta razón se implementó el sistema de kerberos, un protocolo de autenticación de redes de ordenador creado por el MIT que permite a dos ordenadores en una red insegura demostrar su identidad mutuamente de manera segura.

El sistema de kerberos no utiliza varios servicios para autenticar por medio de usuario y contraseña, si no que implementa un cifrado asimétrico o asimétrico y a un tercero para realizar dicha tarea de autenticación. Esta petición puede ser enviada por el programa de conexión para que sea transparente al usuario o puede ser enviada por otro programa después de que el usuario se registre.

El funcionamiento es el siguiente: el cliente se autentica a sí mismo contra el AS, así demuestra al TGS que está autorizado para recibir un ticket de servicio (y lo recibe) y ya puede demostrar al SS que ha sido aprobado para hacer uso del servicio kerberizado.

Sin embargo, Kerberos se vuelve vulnerable cada vez que un usuario en la red se valida contra un servicio no kerberizado y envía una contraseña en la red en texto plano. Por lo tanto no se recomienda el uso de servicios no kerberizados. Estos servicios incluyen Telnet y FTP. Se acepta el uso de otro tipo de protocolos encriptados, tales como SSH o servicios seguros SSL, pero no es ideal.


Kerberos es uno de los sistemas más utilizados por su versatilidad y seguridad a la hora de autenticar e un usuario y darle los servicios que necesite sin que, en las mayoría de las ocasiones, sea inseguro realizar alguna transacción por Internet. Este es el objetivo de todos los sistemas parecidos a este, garantizar la seguridad de la información de aquellos que utilizan estos servicios.

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.