2010-09-20 38 views
13

Sé que hay muchos temas similares, pero aun así ... ¿alguien puede proporcionarme un ejemplo de método de trabajo que genere MD5 String?
Actualmente estoy usando MessageDigest, y yo estoy haciendo lo siguiente para obtener una cadenaConvertir array MD5 a String java

sun.misc.BASE64Encoder().encode(messageDigest.digest()) 

supongo que hay alguna forma mejor de hacerlo.
¡Gracias de antemano!

+0

Qué clase Base64Encoder es esto? –

+0

¡Tienes que amar a Google! :-) –

+0

Lo siento ... aquí está import sun.misc.BASE64Encoder; – Andrew

Respuesta

10
MessageDigest md = MessageDigest.getInstance("MD5"); 
byte[] arr = md.digest(bytesOfMessage); 
return Base64.getEncoder().encodeToString(arr); 

nota: MD5 no se considera como buena algoritmo de hash más, considerar la elección de SHA

+15

FYI: MD5 es un algoritmo hash, no un cifrado. Por lo tanto, no * encripta * datos. Más bien, * hashes * datos. –

+0

¡Gracias! Funciona bien para mí – Andrew

+0

@ Adam Paynter Gracias, he editado el comentario –

16

que haría uso de commons-codec

  • Base 64 - Base64.encodeBase64(digestBytes)
  • Hex-string - Hex.encodeHex(digestBytes)
+4

org.apache.commons.codec.digest.DigestUtils –

+1

DigestUtils es la mejor solución en esta página. :) –

+0

Aunque es genial usar el código de la biblioteca en lugar de escribir su propio algoritmo, tiene la desventaja de que toda la biblioteca debe incluirse en la distribución, lo que es una pena por el solo hecho de un método. Obviamente, si se usan muchas otras clases y métodos, entonces esto es ideal, pero probablemente este no sea el caso en general. – darrenp

4
// Convert to hex string 
StringBuffer sb = new StringBuffer(); 
for (int i = 0; i < messageDigest.length; i++) { 
    if ((0xff & messageDigest[i]) < 0x10) { 
     sb.append('0'); 
    } 
    sb.append(Integer.toHexString(0xff & messageDigest[i])); 
} 
String md5 = sb.toString(); 

Esto supone que realmente desea imprimir su MD5 como una cadena hexadecimal, no codificada en BASE64. Esa es la forma en que normalmente se representa.

+0

Solo una palabra de advertencia si las personas usan esta solución. No permite ceros a la izquierda que pueden arrojar verificaciones de hash. Entonces 0x0E se imprimirá simplemente como E y 0x00 se reducirá a solo 0. Un trabajo básico es comprobar la longitud de cada resultado y anteponer un cero cuando la longitud es 1. –

+0

@MechIntel Usted tiene toda la razón. Acabo de actualizar la respuesta. ¡Gracias por el aviso! – Grodriguez

1

que he visto solución de próxima:

byte[] digest = md.digest(someDataByteArray); 
    StringBuilder hex = new StringBuilder(); 
    for (byte b : digest) { 
     hex.append(String.format("%02x", b)); 
    } 
+0

Este método obtendrá en realidad el mismo resultado que el que obtiene al usar el programa 'md5' en el terminal * nix, ¡y lo suficientemente claro! – Marvin