Publicidad

martes, 8 de enero de 2013

Hashing en MD5 usando Java

Hoy estaba programando la aplicación para Android, la cual usa una base de datos que he creado. Esta base de datos, guarda la contraseña de cada usuario, con lo cual, se me planteó la duda... ¿Cómo he de cifrarla contraseña?

Después de buscar un rato, e informarme un poco, decidí usar MD5. 

Aunque muchos de vosotros conozcáis como es un MD5, os haré una brevísima explicación. Para todos aquellos que quieran profundizar más en el asunto, podéis pasaros por la Wikipedia (Wikipedia:MD5) y hecharle un vistazo, entre otras muchas fuentes.

MD5 en criptografía es la abreviatura de Message-Digest Algorith 5, dicho de otra manera, Algoritmo de Resumen 5.

Esta codificación es de 128 bits y no ofrece un nivel elevado de seguridad comparado con otros algoritmos, aún así, queda un mensaje cifrado de 32 dígitos hexadecimales. Realmente MD5, no es un algoritmo de cifrado, lo que hace es "resumir" el texto o palabra proporcionado. Tal y como comento unas líneas más arriba, MD5 no es la mejor opción, puesto que ya esta algo "obsoleto", por ello, os recomiendo SHA256 o SHA512, los cuales son más fuertes que MD5.

Pero para el uso que actualmente quiero darle, es mas que suficiente.

Explicado un poco el MD5 os dejo la clase que yo me he creado para mi proyecto. Sencillo, y fácil de usar.


01 import java.security.MessageDigest;
02 import java.security.NoSuchAlgorithmException;
03 
04 public class MD5Converter {
05 
06  public MD5Converter() {
07   
08  }
09 
10  private static final Object[] CONSTS_HEX = {
11   '0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f' };
12  
13  public static String Encripatar (String mensaje)
14  {
15   try {
16    MessageDigest md = MessageDigest.getInstance("MD5");
17    byte[] bytes = md.digest(mensaje.getBytes());
18 
19    StringBuilder sb = new StringBuilder(2*bytes.length);
20    for(int i = 0; i< bytes.length;i++)
21    {
22     int bajo = (int)(bytes[i] & 0x0f);
23     int alto = (int)((bytes[i] & 0xf0) >>4);
24     sb.append(CONSTS_HEX[alto]);
25     sb.append(CONSTS_HEX[bajo]);
26 
27    }
28    return sb.toString();
29    
30   } catch (NoSuchAlgorithmException e) {
31    
32    return null;
33   }
34   
35  }
36 }


Tal como podéis observar, el algoritmo tiene una array con los valores Hexadecimales, y consta de un método publico, llamado Encriptar, el cual recibe el texto a encriptar devolviendo dicho texto ya encriptado, en caso de fallo, devuelve un null

Os dejo el enlace al repositorio donde podréis encontrar dicha clase, lista para usar en vuestros proyectos.


Código en Github


Quisiera agradecer a +Sergi Martínez  por la revisión rápida que me ha hecho al post, el cual, gracias a él ahora es un poquito mejor.

No hay comentarios:

Publicar un comentario