domingo, 7 de julio de 2013

Funciones de Resumen MD5 y SHA en JAVA


A las funciones hash  también se les llama funciones picadillofunciones resumen o funciones de digest. Los hash o funciones de resumen son algoritmos que consiguen crear a partir de una entrada (ya sea un texto, una contraseña o un archivo, por ejemplo) una salida alfanumérica de longitud normalmente fija que representa un resumen de toda la información que se le ha dado (es decir, a partir de los datos de la entrada crea una cadena que solo puede volverse a crear con esos mismos datos).

Las funciones hash son útiles para almacenar passwords  en bases de datos, verificar la integridad de ficheros y también se aplican en procesos de firma digital.

Para generar estas cadenas de resumen utilizaremos la clase MessageDigest de Java.

Los algoritmos que implementaremos son los siguientes:
*MD2
*MD5
*SHA-1
*SHA-256
*SHA-384
*SHA-512

En el código a continuación se  observa que se crea un arreglo con los diferentes algoritmos. El método generador de hashes es estático y recibe como parámetro la cadena que se va a resumir y un entero que corresponde al indice del arreglo de algoritmos.


import java.io.IOException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/**
 * @author marxs7 Less is better
 */
public class Hash{
    //algoritmos
    public static String[] algoritmos={"MD2","MD5","SHA-1","SHA-256","SHA-384","SHA-512"};

    /***
     * Convierte un arreglo de bytes a String usando valores hexadecimales
     * @param digest arreglo de bytes a convertir
     * @return String creado a partir de digest
     */
    private static String toHexadecimal(byte[] digest){
        String hash = "";
        for(byte aux : digest) {
            int b = aux & 0xff;
            if (Integer.toHexString(b).length() == 1) hash += "0";
            hash += Integer.toHexString(b);
        }
        return hash;
    }

    /***
     * Encripta una cadena mediante algoritmo de resumen de mensaje.
     * @param cadena texto a encriptar
     * @param algoritmo algoritmo de encriptacion, puede ser: MD2, MD5, SHA-1, SHA-256, SHA-384, SHA-512
     * @return mensaje encriptado
     */
    public static String getHash(String cadena, int tipoAlgoritmo){
        byte[] digest = null;
        byte[] buffer = cadena.getBytes();
        try {
            MessageDigest messageDigest = MessageDigest.getInstance(algoritmos[tipoAlgoritmo]);
            messageDigest.reset();
            messageDigest.update(buffer);
            digest = messageDigest.digest();
        } catch (NoSuchAlgorithmException ex) {
            System.out.println("Error creando Hash");
        }
        return toHexadecimal(digest);
    }
    //El codigo comentado es solo para probar la funcionalidad.
     /* public static void main(String[] args){
          System.out.println("hola"+ " MD2 "+ getHash("hola",0));
          System.out.println("hola"+ " MD5 "+ getHash("hola",1));
          System.out.println("hola"+ " SHA-1 "+ getHash("hola",2));
          System.out.println("hola"+ " SHA-256 "+ getHash("hola",3));
          System.out.println("hola"+ " SHA-384 "+ getHash("hola",4));
          System.out.println("hola"+ " SHA-512 "+ getHash("hola",5));
      }*/
}

A partir de esta clase podemos crear una interfaz para hacer más fácil el uso de esta funcionalidad. En mi caso la aplicación recibe una cadena y al seleccionar algún algoritmo en el combo, muestra la cadena resultante. 

Descargar Aplicación. 18Kb
Descargar Código Fuente. Proyecto NetBeans 37 Kb









3 comentarios:

  1. Super el tema y me gusta la interfaz, no sabia que se podía hacer eso en java

    ResponderEliminar
    Respuestas
    1. Amigo, puedes hacer casi cualquier cosa con Java, saludos.

      Eliminar
  2. Hay una website que me ha servido de mucha utilidad al momento de generar hashes simultáneos como md5, sha1, sha256 incluyendo la función crypt. Pueden revisarla aquí http://www.kaarosu.com

    ResponderEliminar