Comment puis-je générer un hash MD5?

Existe-t-il une méthode pour générer un hachage MD5 d’une chaîne en Java?

java.security.MessageDigest est votre ami. Appelez getInstance("MD5") pour obtenir un résumé de message MD5 que vous pouvez utiliser.

La classe MessageDigest peut vous fournir une instance du résumé MD5.

Lorsque vous travaillez avec des chaînes et des classes de chiffrement, veillez à toujours spécifier l’encodage dans ssortingng.getBytes() vous souhaitez que la représentation en octets soit utilisée. Si vous utilisez simplement ssortingng.getBytes() elle utilisera la plate-forme par défaut. (Toutes les plates-formes n’utilisent pas les mêmes valeurs par défaut)

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

Si vous avez beaucoup de données, examinez la .update(byte[]) qui peut être appelée à plusieurs resockets. Ensuite, appelez .digest() pour obtenir le hachage résultant.

Vous pouvez également regarder la classe DigestUtils du projet de codec apache commons , qui fournit des méthodes très pratiques pour créer des résumés MD5 ou SHA.

Si vous souhaitez que la réponse soit une chaîne plutôt qu’un tableau d’octets, vous pouvez toujours faire quelque chose comme ceci:

 Ssortingng 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); Ssortingng hashtext = bigInt.toSsortingng(16); // Now we need to zero pad it if you actually want the full 32 chars. while(hashtext.length() < 32 ){ hashtext = "0"+hashtext; } 

Trouvé ceci:

 public Ssortingng MD5(Ssortingng md5) { try { java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5"); byte[] array = md.digest(md5.getBytes()); SsortingngBuffer sb = new SsortingngBuffer(); 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; } 

sur le site ci-dessous, je ne prends aucun crédit pour cela, mais c'est une solution qui fonctionne! Pour moi, beaucoup d'autres codes ne fonctionnaient pas correctement, j'ai perdu des 0 dans le hash. Celui-ci semble être le même que PHP. source: http://m2tec.be/blog/2010/02/03/java-md5-hex-0093

Voici comment je l’utilise:

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

où Hex est: org.apache.commons.codec.binary.Hex du projet Apache Commons .

Je viens de télécharger commons-codec.jar et j’ai un PHP parfait comme md5. Voici le manuel .

Il suffit de l’importer dans votre projet et de l’utiliser

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

Et voila.

J’ai trouvé que c’était la façon la plus claire et la plus concise de le faire:

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

Nous avons trouvé cette solution qui est beaucoup plus propre en termes d’obtention d’une représentation sous forme de chaîne à partir d’un hachage MD5.

 import java.security.*; import java.math.*; public class MD5 { public static void main(Ssortingng args[]) throws Exception{ Ssortingng 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()).toSsortingng(16)); } } 

Le code a été extrait d’ ici .

Une autre option consiste à utiliser les méthodes de hachage de goyave :

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

Pratique si vous utilisez déjà Guava (qui si vous ne l’êtes pas, vous devriez probablement l’être).

Une autre implémentation:

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

J’ai une classe (Hash) pour convertir du texte brut en hash dans les formats: md5 ou sha1, simillar les fonctions php ( md5 , sha1 ):

 public class Hash { /** * * @param txt, text in plain format * @param hashType MD5 OR SHA1 * @return hash in hashType */ public static Ssortingng getHash(Ssortingng txt, Ssortingng hashType) { try { java.security.MessageDigest md = java.security.MessageDigest.getInstance(hashType); byte[] array = md.digest(txt.getBytes()); SsortingngBuffer sb = new SsortingngBuffer(); 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"); } } 

Tests avec JUnit et PHP

Script PHP:

  

Script PHP en sortie:

 MD5 :b10a8db164e0754105b7a99be72e3fe5 SHA1:0a4d55a8d778e5022fab701977c5d840bbc486d0 

Utilisation de l'exemple et des tests avec JUnit:

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

Code dans GitHub

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

Ma réponse pas très révélasortingce:

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

Pas besoin de le rendre trop compliqué. DigestUtils fonctionne bien et vous met à l’aise lorsque vous travaillez avec des hachages md5.

 DigestUtils.md5Hex(_hash); 

ou

 DigestUtils.md5(_hash); 

Soit vous pouvez utiliser toute autre méthode de chiffrement telle que sha ou md.

La réponse de Bombe est correcte, mais notez qu’à moins que vous ne deviez absolument utiliser MD5 (par exemple, vous êtes contraint à l’interopérabilité), un meilleur choix est SHA1 car MD5 présente des faiblesses pour une utilisation à long terme.

Je dois append que SHA1 a également des vulnérabilités théoriques, mais pas aussi sévères. L’état actuel du hachage est qu’il existe un certain nombre de fonctions de hachage de remplacement candidates, mais aucune n’est encore apparue comme la meilleure pratique standard pour remplacer SHA1. Ainsi, en fonction de vos besoins, il serait judicieux de configurer votre algorithme de hachage afin de pouvoir le remplacer ultérieurement.

Il existe également une classe DigestUtils au spring :

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

Cette classe contient la méthode md5DigestAsHex() qui effectue le travail.

Vous pouvez essayer de suivre. Voir les détails et les codes de téléchargement ici: http://www.luyue.org/java-hashgenerator-md5-sha-1/

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

Autre implémentation: Implémentation rapide de MD5 en Java

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

Je ne sais pas si cela est pertinent pour quiconque lit ceci, mais je viens d’avoir le problème que je voulais

  • télécharger un fichier à partir d’une URL donnée et
  • comparer son MD5 à une valeur connue.

Je voulais le faire uniquement avec les classes JRE (pas d’Apache Commons ou similaire). Une recherche rapide sur le Web ne m’a pas montré des extraits de code à la fois, à la fois séparément. Parce que cela nécessite de lire le même fichier deux fois, je me suis dit que cela pourrait valoir le coup d’écrire du code qui unifie les deux tâches, en calculant la sum de contrôle à la volée lors du téléchargement du fichier. Ceci est mon résultat (désolé si ce n’est pas parfait Java, mais je suppose que vous avez l’idée quand même):

 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(Ssortingng fromURL, Ssortingng 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.toSsortingng(16) + ", got " + md5Actual.toSsortingng(16) ); } 

Jetez un oeil au lien suivant, l’exemple obtient un hachage MD5 d’une image fournie: MD5 Hash d’une image

Pour ce que cela vaut, je suis tombé sur cela parce que je veux synthétiser des GUID à partir d’une clé naturelle pour un programme qui va installer des composants COM; Je souhaite rationaliser afin de ne pas gérer le cycle de vie GUID. Je vais utiliser MD5, puis utiliser la classe UUID pour en extraire une chaîne. (http://stackoverflow.com/questions/2190890/how-can-i-generate-guid-for-a-ssortingng-values/12867439 soulève ce problème).

Dans tous les cas, java.util.UUID peut vous procurer une belle chaîne à partir des octets MD5.

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

MD5 convient parfaitement si vous n’avez pas besoin de la meilleure sécurité, et si vous faites quelque chose comme vérifier l’intégrité des fichiers, la sécurité n’est pas une considération. Dans ce cas, vous voudrez peut-être envisager quelque chose de plus simple et plus rapide, comme Adler32, qui est également pris en charge par les bibliothèques Java.

essaye ça:

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

celui-ci donne le md5 exact que vous obtenez de la fonction md5 de mysql ou des fonctions md5 de php, etc. C’est celui que j’utilise (vous pouvez changer selon vos besoins)

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

Contrairement à PHP, où vous pouvez faire un chiffrement md5 de votre texte en appelant simplement la fonction md5, c’est-à-dire md5($text) , en java, cela a été un peu compliqué. Je l’ai généralement implémenté en appelant une fonction qui renvoie le texte de hachage md5. Voici comment je l’ai implémenté: Commencez par créer une fonction nommée md5encryption dans votre classe principale, comme indiqué ci-dessous.

 public static Ssortingng md5encryption(Ssortingng text) { Ssortingng hashtext = null; try { Ssortingng 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.toSsortingng(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; } 

Appelez maintenant la fonction quand vous en avez besoin, comme indiqué ci-dessous.

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

Ici, vous pouvez voir que hashtext est ajouté avec un zéro pour le rendre compatible avec le cryptage 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(_)).mkSsortingng //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(_)).mkSsortingng //Output println(md5hash1 + " should be the same as " + md5hash2) 

Voici ce que je suis venu ici pour une fonction scala pratique qui renvoie une chaîne de hachage MD5:

 def md5(text: Ssortingng) : Ssortingng = 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(Ssortingng[] args) { System.out.println(MD5.getMD5("123456")); } /** * Use md5 encoded code value * * @param sInput * clearly * @ return md5 encrypted password */ public static Ssortingng getMD5(Ssortingng sInput) { Ssortingng 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)); } } 

Il y a un article sur Codingkit à ce sujet. Check out: http://codingkit.com/a/JAVA/2013/1020/2216.html

 private Ssortingng hashuj(Ssortingng 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 Ssortingng.format("%1$032X", hash); } catch (NoSuchAlgorithmException nsae) { throw new ServletException("Algorytm szyfrowania nie jest obsługiwany!"); } }