Oferta de temporada, cualquier libro a US$5

sábado, 4 de junio de 2011

Contraseñas encriptadas con Java

¿Quién no ha querido encriptar texto o archivo? Hay diversas maneras para hacer eso, por ejemplo, utilizando un diccionario donde se reemplazara cada caracter por un código.. y para poder desencriptarlo se debería utilizar el mismo diccionario para revertir el proceso. Pero si el diccionario cae en manos de alguien que no queremos que lo sepa, entonces estamos en peligro.
Cuando yo programaba en pascal, mi encriptación favorita era invirtiendo los bits... pero cualquiera también puede invertir los bits y listo.
Pero ya gente experta logró algoritmos de encriptación populares. Los más conocidos: MD5 y SHA.
En este post hablaremos cómo encriptar texto, sobretodo las contraseñas, utilizando MD5 o SHA.

La historia de la criptografía es bastante larga e interesante, pero para nuestro día a día, solo necesitamos cómo utilizar las bibliotecas existentes en el mercado.
Hace un tiempo, hice un post de ello (MD5 en Java) que consistía en utilizar el mismo API de Java para generar MD5.Pero ahora mostraré una biblioteca muy útil proporcionada por la fundación ASF.

Commons Codec

Podemos descargar su biblioteca desde aquí http://commons.apache.org/codec/download_codec.cgi
Descomprimimos el archivo y tomamos el .jar llamado commons-codec-1.5.jar y lo agregamos al proyecto. En NetBeans solo le damos clic derecho en Libraries del Proyecto y seleccionamos el .jar.

La clase DigestUtils es nuestra clase principal para utilizar los diferentes algoritmos de encriptación.

MD5

        String texto="Saludos desde Apuntesdejava.com";
        String encriptMD5=DigestUtils.md5Hex(texto);
        System.out.println("md5:"+encriptMD5);
La salida resultante es:
md5:e5adf3f9fe476c7816eacd3873f5b51f

Para comprobarlo, yo utilizo la consola de MySQL

SHA-HEX

Similar al MD5, solo es otro método
        String texto="Saludos desde Apuntesdejava.com";
        String encript=DigestUtils.shaHex(texto);
        System.out.println("shaHex:"+encript);
La salida resultante es:
shaHex:2b05363b154309d7fc069cd922f316fa3f3ff866
Y en MySQL:

SHA-256 / 512

Para el SHA 256 se utiliza el método DigestUtils.sha256, y para 512, se utiliza DigestUtils.sha512. Los resultados son como siguen:
sha-256:9a4557a0f654365312b430b80f0da46be2c3a9db6a083f545145398fc66c92d8
sha-512:4c0a2187e03531011c7787752b66e8848a5f146e8aa08e5b5615030c5daa9cd756150e225943b5182de2434d925a4d6889b2d129ed87f23943bce9a8342b02bd
Como podemos ver.. a mayor bits, mayor confiabilidad.

Su contraparte, en MySQL, se utiliza la función sha2(). Ojo, esta función recién está disponible en la versión 5.5.5.