¿Cómo puedo generar un hash MD5?

¿Hay algún método para generar hash MD5 de una cadena en Java?

java.security.MessageDigest es tu amigo. Llame a getInstance("MD5") para obtener un resumen del mensaje MD5 que puede usar.

La clase MessageDigest puede proporcionarle una instancia del resumen MD5.

Cuando trabaje con cadenas y las clases de cifrado, asegúrese de especificar siempre la encoding en la que desea la representación de bytes. Si solo utiliza string.getBytes() , usará la plataforma predeterminada. (No todas las plataformas usan los mismos valores predeterminados)

 import java.security.*; .. byte[] bytesOfMessage = yourString.getBytes("UTF-8"); MessageDigest md = MessageDigest.getInstance("MD5"); byte[] thedigest = md.digest(bytesOfMessage); 

Si tiene muchos datos, eche un vistazo al .update(byte[]) que puede .update(byte[]) repetidamente. Luego, llame a .digest() para obtener el hash resultante.

También es posible que desee consultar la clase DigestUtils del proyecto de códec Apache commons , que proporciona métodos muy convenientes para crear resúmenes MD5 o SHA.

Si realmente quieres que la respuesta vuelva como una cadena en lugar de una matriz de bytes, siempre puedes hacer algo como esto:

 String plaintext = "your text here"; MessageDigest m = MessageDigest.getInstance("MD5"); m.reset(); m.update(plaintext.getBytes()); byte[] digest = m.digest(); BigInteger bigInt = new BigInteger(1,digest); String hashtext = bigInt.toString(16); // Now we need to zero pad it if you actually want the full 32 chars. while(hashtext.length() < 32 ){ hashtext = "0"+hashtext; } 

Encontró esto:

 public String MD5(String md5) { try { java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5"); byte[] array = md.digest(md5.getBytes()); StringBuffer sb = new StringBuffer(); for (int i = 0; i < array.length; ++i) { sb.append(Integer.toHexString((array[i] & 0xFF) | 0x100).substring(1,3)); } return sb.toString(); } catch (java.security.NoSuchAlgorithmException e) { } return null; } 

en el sitio a continuación, no me atribuyo ningún mérito, ¡pero es una solución que funciona! Para mí, muchos otros códigos no funcionaban correctamente. Terminé perdiendo 0 en el hash. Este parece ser el mismo que tiene PHP. fuente: http://m2tec.be/blog/2010/02/03/java-md5-hex-0093

Así es como lo uso:

 final MessageDigest messageDigest = MessageDigest.getInstance("MD5"); messageDigest.reset(); messageDigest.update(string.getBytes(Charset.forName("UTF8"))); final byte[] resultByte = messageDigest.digest(); final String result = new String(Hex.encodeHex(resultByte)); 

donde Hex es: org.apache.commons.codec.binary.Hex del proyecto Apache Commons .

Acabo de descargar commons-codec.jar y obtuve un php perfecto como md5. Aquí hay un manual .

Solo importelo a su proyecto y use

 String Url = "your_url"; System.out.println( DigestUtils.md5Hex( Url ) ); 

Y ahí lo tienes.

He encontrado que esta es la forma más clara y concisa de hacerlo:

 MessageDigest md5 = MessageDigest.getInstance("MD5"); md5.update(StandardCharsets.UTF_8.encode(string)); return String.format("%032x", new BigInteger(1, md5.digest())); 

Encontré esta solución que es mucho más limpia en términos de obtener una representación de Cadena de un hash MD5.

 import java.security.*; import java.math.*; public class MD5 { public static void main(String args[]) throws Exception{ String s="This is a test"; MessageDigest m=MessageDigest.getInstance("MD5"); m.update(s.getBytes(),0,s.length()); System.out.println("MD5: "+new BigInteger(1,m.digest()).toString(16)); } } 

El código fue extraído de aquí .

Otra opción es utilizar los métodos de Hashing de guayaba :

 Hasher hasher = Hashing.md5().newHasher(); hasher.putString("my string"); byte[] md5 = hasher.hash().asBytes(); 

Útil si ya está usando guayaba (que si no es así, probablemente debería hacerlo).

Otra implementación:

 import javax.xml.bind.DatatypeConverter; String hash = DatatypeConverter.printHexBinary( MessageDigest.getInstance("MD5").digest("SOMESTRING".getBytes("UTF-8"))); 

Tengo una Clase (Hash) para convertir texto sin formato en hash en formatos: md5 o sha1, simillar esas funciones php ( md5 , sha1 ):

 public class Hash { /** * * @param txt, text in plain format * @param hashType MD5 OR SHA1 * @return hash in hashType */ public static String getHash(String txt, String hashType) { try { java.security.MessageDigest md = java.security.MessageDigest.getInstance(hashType); byte[] array = md.digest(txt.getBytes()); StringBuffer sb = new StringBuffer(); for (int i = 0; i < array.length; ++i) { sb.append(Integer.toHexString((array[i] & 0xFF) | 0x100).substring(1,3)); } return sb.toString(); } catch (java.security.NoSuchAlgorithmException e) { //error action } return null; } public static String md5(String txt) { return Hash.getHash(txt, "MD5"); } public static String sha1(String txt) { return Hash.getHash(txt, "SHA1"); } } 

Probando con JUnit y PHP

Script de PHP:

  

Script PHP de salida:

 MD5 :b10a8db164e0754105b7a99be72e3fe5 SHA1:0a4d55a8d778e5022fab701977c5d840bbc486d0 

Usando ejemplos y pruebas con JUnit:

  public class HashTest { @Test public void test() { String txt = "Hello World"; assertEquals("b10a8db164e0754105b7a99be72e3fe5", Hash.md5(txt)); assertEquals("0a4d55a8d778e5022fab701977c5d840bbc486d0", Hash.sha1(txt)); } } 

Código en GitHub

https://github.com/fitorec/java-hashes

Mi respuesta no muy reveladora:

 private String md5(String s) { try { MessageDigest m = MessageDigest.getInstance("MD5"); m.update(s.getBytes(), 0, s.length()); BigInteger i = new BigInteger(1,m.digest()); return String.format("%1$032x", i); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return null; } 

No es necesario que sea demasiado complicado. DigestUtils funciona bien y te hace sentir cómodo mientras trabajas con hash md5.

 DigestUtils.md5Hex(_hash); 

o

 DigestUtils.md5(_hash); 

O puede usar cualquier otro método de encriptación como sha o md.

La respuesta de Bombe es correcta, sin embargo, tenga en cuenta que a menos que sea absolutamente necesario usar MD5 (por ejemplo, forzado a interoperabilidad), una mejor opción es SHA1 ya que MD5 tiene debilidades para el uso a largo plazo.

Debo agregar que SHA1 también tiene vulnerabilidades teóricas, pero no tan severas. El estado actual de la técnica en hash es que hay una cantidad de funciones hash de reemplazo posibles, pero ninguna ha surgido como la mejor práctica estándar para reemplazar SHA1. Por lo tanto, dependiendo de sus necesidades, sería recomendable que configure su algoritmo hash para que pueda ser reemplazado en el futuro.

También hay una clase DigestUtils en Spring :

http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/util/DigestUtils.html

Esta clase contiene el método md5DigestAsHex() que hace el trabajo.

Puedes intentar seguir. Vea los detalles y descargue los códigos aquí: http://www.luyue.org/java-hashgenerator-md5-sha-1/

 import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class MD5Example { public static void main(String[] args) throws Exception { final String inputString = "Hello MD5"; System.out.println("MD5 hex for '" + inputString + "' :"); System.out.println(getMD5Hex(inputString)); } public static String getMD5Hex(final String inputString) throws NoSuchAlgorithmException { MessageDigest md = MessageDigest.getInstance("MD5"); md.update(inputString.getBytes()); byte[] digest = md.digest(); return convertByteToHex(digest); } private static String convertByteToHex(byte[] byteData) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < byteData.length; i++) { sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1)); } return sb.toString(); } } 

Otra implementación: implementación rápida de MD5 en Java

 String hash = MD5.asHex(MD5.getHash(new File(filename))); 

No sé si esto es relevante para cualquiera que lea esto, pero tuve el problema que quería

  • descargar un archivo de una URL dada y
  • compare su MD5 con un valor conocido.

Quería hacerlo solo con clases de JRE (sin Apache Commons o similar). Una búsqueda web rápida no me mostró ejemplos de fragmentos de código haciendo ambas cosas al mismo tiempo, solo cada tarea por separado. Como esto requiere leer el mismo archivo dos veces, calculé que valdría la pena escribir algún código que unificara ambas tareas, calculando la sum de verificación sobre la marcha mientras se descarga el archivo. Este es mi resultado (lo siento si no es Java perfecto, pero supongo que se entiende la idea de todos modos):

 import java.io.FileOutputStream; import java.io.IOException; import java.math.BigInteger; import java.net.URL; import java.nio.ByteBuffer; import java.nio.channels.Channels; import java.nio.channels.ReadableByteChannel; import java.nio.channels.WritableByteChannel; import java.security.DigestOutputStream; // new import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; void downloadFile(String fromURL, String toFile, BigInteger md5) throws IOException, NoSuchAlgorithmException { ReadableByteChannel in = Channels.newChannel(new URL(fromURL).openStream()); MessageDigest md5Digest = MessageDigest.getInstance("MD5"); WritableByteChannel out = Channels.newChannel( //new FileOutputStream(toFile)); // old new DigestOutputStream(new FileOutputStream(toFile), md5Digest)); // new ByteBuffer buffer = ByteBuffer.allocate(1024 * 1024); // 1 MB while (in.read(buffer) != -1) { buffer.flip(); //md5Digest.update(buffer.asReadOnlyBuffer()); // old out.write(buffer); buffer.clear(); } BigInteger md5Actual = new BigInteger(1, md5Digest.digest()); if (! md5Actual.equals(md5)) throw new RuntimeException( "MD5 mismatch for file " + toFile + ": expected " + md5.toString(16) + ", got " + md5Actual.toString(16) ); } 

Eche un vistazo al siguiente enlace, el Ejemplo obtiene un Hash MD5 de una imagen suministrada: MD5 Hash de una imagen

Por lo que vale, me encontré con esto porque quiero sintetizar GUID desde una clave natural para un progtwig que instalará componentes COM; Quiero sintetizar para no administrar el ciclo de vida GUID. Usaré MD5 y luego usaré la clase UUID para obtener una cadena. (http://stackoverflow.com/questions/2190890/how-can-i-generate-guid-for-a-string-values/12867439 plantea este problema).

En cualquier caso, java.util estadounidense puede obtener una buena cadena de los bytes MD5.

 return UUID.nameUUIDFromBytes(md5Bytes).toString(); 

MD5 está perfectamente bien si no necesita la mejor seguridad, y si está haciendo algo así como verificar la integridad del archivo, entonces la seguridad no es una consideración. En tal caso, es posible que desee considerar algo más simple y rápido, como Adler32, que también es compatible con las bibliotecas de Java.

prueba esto:

 public static String getHashMD5(String string) { try { MessageDigest md = MessageDigest.getInstance("MD5"); BigInteger bi = new BigInteger(1, md.digest(string.getBytes())); return bi.toString(16); } catch (NoSuchAlgorithmException ex) { Logger.getLogger(MD5Utils.class .getName()).log(Level.SEVERE, null, ex); return ""; } } 
 import java.security.*; import javax.xml.bind.*; byte[] bytesOfMessage = yourString.getBytes("UTF-8"); MessageDigest md = MessageDigest.getInstance("MD5"); byte[] bytesOfDigest = md.digest(bytesOfMessage); String digest = DatatypeConverter.printHexBinary(bytesOfDigest).toLowerCase(); 

este da el md5 exacto a medida que obtienes de la función md5 de mysql o de las funciones md5 de php, etc. Esta es la que yo uso (puedes cambiar de acuerdo a tus necesidades)

 public static String md5( String input ) { try { java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5"); byte[] array = md.digest(input.getBytes( "UTF-8" )); StringBuffer sb = new StringBuffer(); for (int i = 0; i < array.length; i++) { sb.append( String.format( "%02x", array[i])); } return sb.toString(); } catch ( NoSuchAlgorithmException | UnsupportedEncodingException e) { return null; } } 

A diferencia de PHP, donde puedes hacer un cifrado md5 de tu texto simplemente llamando a la función md5, es decir md5($text) , en java se hizo un poco complicado. Normalmente lo implementé llamando a una función que devuelve el texto hash md5. Así es como lo implementé. Primero crea una función llamada md5encryption dentro de tu clase principal como se muestra a continuación.

 public static String md5encryption(String text) { String hashtext = null; try { String plaintext = text; MessageDigest m = MessageDigest.getInstance("MD5"); m.reset(); m.update(plaintext.getBytes()); byte[] digest = m.digest(); BigInteger bigInt = new BigInteger(1,digest); hashtext = bigInt.toString(16); // Now we need to zero pad it if you actually want the full 32 chars. while(hashtext.length() < 32 ){ hashtext = "0"+hashtext; } } catch (Exception e1) { // TODO: handle exception JOptionPane.showMessageDialog(null,e1.getClass().getName() + ": " + e1.getMessage()); } return hashtext; } 

Ahora llame a la función cuando lo necesite como se indica a continuación.

 String text = textFieldName.getText(); String pass = md5encryption(text); 

Aquí puede ver que hashtext se agrega con un cero para que coincida con el cifrado md5 en PHP.

 import java.security.MessageDigest val digest = MessageDigest.getInstance("MD5") //Quick MD5 of text val text = "MD5 this text!" val md5hash1 = digest.digest(text.getBytes).map("%02x".format(_)).mkString //MD5 of text with updates digest.update("MD5 ".getBytes()) digest.update("this ".getBytes()) digest.update("text!".getBytes()) val md5hash2 = digest.digest().map(0xFF & _).map("%02x".format(_)).mkString //Output println(md5hash1 + " should be the same as " + md5hash2) 

Esto es para lo que vine aquí: una práctica función de escalado que devuelve cadena de hash MD5:

 def md5(text: String) : String = java.security.MessageDigest.getInstance("MD5").digest(text.getBytes()).map(0xFF & _).map { "%02x".format(_) }.foldLeft(""){_ + _} 
  import java.math.BigInteger; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; /** * MD5 encryption * * @author Hongten * */ public class MD5 { public static void main(String[] args) { System.out.println(MD5.getMD5("123456")); } /** * Use md5 encoded code value * * @param sInput * clearly * @ return md5 encrypted password */ public static String getMD5(String sInput) { String algorithm = ""; if (sInput == null) { return "null"; } try { algorithm = System.getProperty("MD5.algorithm", "MD5"); } catch (SecurityException se) { } MessageDigest md = null; try { md = MessageDigest.getInstance(algorithm); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } byte buffer[] = sInput.getBytes(); for (int count = 0; count < sInput.length(); count++) { md.update(buffer, 0, count); } byte bDigest[] = md.digest(); BigInteger bi = new BigInteger(bDigest); return (bi.toString(16)); } } 

Hay un artículo sobre Codingkit sobre eso. Consulte: http://codingkit.com/a/JAVA/2013/1020/2216.html

 private String hashuj(String dane) throws ServletException{ try { MessageDigest m = MessageDigest.getInstance("MD5"); byte[] bufor = dane.getBytes(); m.update(bufor,0,bufor.length); BigInteger hash = new BigInteger(1,m.dige`enter code here`st()); return String.format("%1$032X", hash); } catch (NoSuchAlgorithmException nsae) { throw new ServletException("Algorytm szyfrowania nie jest obsługiwany!"); } }