web-dev-qa-db-fra.com

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

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

931
Akshay

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

564
Bombe

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

Lorsque vous travaillez avec des chaînes et des classes de chiffrement, veillez à toujours spécifier le codage dans lequel vous voulez que la représentation en octet soit. Si vous utilisez simplement string.getBytes(), il utilisera la valeur par défaut de la plateforme. (Toutes les plates-formes n'utilisent pas les mêmes valeurs par défaut)

import Java.security.*;

..

byte[] bytesOfMessage = yourString.getBytes("UTF-8");

MessageDigest md = MessageDigest.getInstance("MD5");
byte[] thedigest = md.digest(bytesOfMessage);

Si vous avez beaucoup de données, jetez un œil à la méthode .update(byte[]) qui peut être appelée à plusieurs reprises. Ensuite, appelez .digest() pour obtenir le hachage résultant.

663
koregan

Vous pouvez également consulter la classe DigestUtils du codec Apache commons project, qui fournit des méthodes très pratiques pour créer des condensés MD5 ou SHA.

252
lutzh

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

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;
}
251
user49913

Trouvé ceci:

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;
}

sur le site ci-dessous, je ne prends aucun crédit pour cela, mais c’est une solution qui fonctionne!. identique à PHP a . source: http://m2tec.be/blog/2010/02/03/Java-md5-hex-0093

153
dac2009

Voici comment je l'utilise:

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));

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

84
adranale

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

Importez-le simplement dans votre projet et utilisez-le.

String Url = "your_url";

System.out.println( DigestUtils.md5Hex( Url ) );

et voila.

82
Eugene

J'ai trouvé que c'était la manière la plus claire et concise de le faire:

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

Vous avez trouvé cette solution beaucoup plus propre en termes de récupération d'une représentation String d'un hachage 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));
    }
}

Le code a été extrait de ici .

32
Heshan Perera

Une autre option consiste à utiliser les méthodes Guava Hashing :

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

Pratique si vous utilisez déjà du goyave (ce qui devrait être le cas si vous ne l'êtes pas).

31
andrewrjones

Une autre implémentation:

import javax.xml.bind.DatatypeConverter;

String hash = DatatypeConverter.printHexBinary( 
           MessageDigest.getInstance("MD5").digest("SOMESTRING".getBytes("UTF-8")));
30
stacker

J'ai une classe (hachage) pour convertir du texte brut en hachage dans les formats: md5 ou sha1, tout en respectant 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 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");
    }
}

Test avec JUnit et PHP

Script PHP:

<?php

echo 'MD5 :' . md5('Hello World') . "\n";
echo 'SHA1:' . sha1('Hello World') . "\n";

Script de sortie PHP:

MD5 :b10a8db164e0754105b7a99be72e3fe5
SHA1:0a4d55a8d778e5022fab701977c5d840bbc486d0

Utilisation de l'exemple et du test avec JUnit:

    public class HashTest {

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

}

Code dans GitHub

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

28
fitorec

Ma réponse peu révélatrice:

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;
}
22
marioosh

Pas besoin de faire trop compliqué. DigestUtils fonctionne bien et vous met à l'aise tout en travaillant avec hash md5.

DigestUtils.md5Hex(_hash);

ou

DigestUtils.md5(_hash);

Soit vous pouvez utiliser d’autres méthodes de chiffrement telles que sha ou md.

19
Fatih Karatana

La réponse de Bombe est correcte, mais notez que, sauf si vous devez absolument utiliser MD5 (par exemple, vous êtes forcé d'interopérabilité), un meilleur choix est SHA1, car MD5 présente des faiblesses pour une utilisation à long terme.

Je devrais ajouter que SHA1 a aussi des vulnérabilités théoriques, mais pas aussi graves. L’état actuel des connaissances en matière de 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. Donc, en fonction de vos besoins, il serait judicieux de configurer votre algorithme de hachage de manière à pouvoir le remplacer à l'avenir.

16
frankodwyer

Il existe une classe DigestUtils dans Spring aussi:

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. 

15
Raul Luna

Vous pouvez essayer de suivre. Voir détails et codes de téléchargement ici: http://jkssweetlife.com/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();
}
}
14
ylu

Autre implémentation: Fast MD5 Implementation in Java

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

Je ne sais pas si cela convient à quiconque lit ceci, mais j’ai juste eu le problème que je voulais

  • télécharger un fichier depuis une URL donnée et
  • compare son MD5 à une valeur connue.

Je voulais le faire avec les classes JRE uniquement (pas Apache Commons ou similaire). Une recherche rapide sur le Web ne m’a pas montré d’exemples de fragments de code faisant les deux en même temps, mais uniquement chaque tâche séparément. Comme cela nécessite de lire deux fois le même fichier, j'ai pensé qu'il serait utile d'écrire du code unifiant les deux tâches, en calculant la somme 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(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)
        );
}
9
kriegaex

Jetez un coup d’œil au lien suivant: l’exemple obtient un hachage MD5 d’une image fournie: Hache MD5 d’une image

6
Thomas

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

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

return UUID.nameUUIDFromBytes(md5Bytes).toString();
6
Mihai Danila

MD5 convient parfaitement si vous n'avez pas besoin de la meilleure sécurité, et si vous vérifiez, par exemple, l'intégrité des fichiers, la sécurité n'est pas une considération. Dans ce cas, envisagez quelque chose de plus simple et plus rapide, tel que Adler32, qui est également pris en charge par les bibliothèques Java.

5
Mike
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();
4
Giancarlo Romeo

essaye ça:

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 "";
    }
}
4
Marcelo Lopes
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)
3
HimalayanCoder

celui-ci donne l'exact md5 que vous obtenez avec la fonction md5 de mysql ou mp5, etc. C'est celui que j'utilise (vous pouvez changer en fonction de vos besoins)

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;            
    }

}
3
Aurangzeb

Contrairement à PHP où vous pouvez faire un hachage MD5 de votre texte en appelant simplement md5, c'est-à-dire md5($text), en Java, cela s'est compliqué un peu. 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 md5hashing dans votre classe principale, comme indiqué ci-dessous. 

public static String md5hashing(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;     
    }

Appelez maintenant la fonction à tout moment, comme indiqué ci-dessous.

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

Vous pouvez voir ici que hashtext est ajouté avec un zéro pour le faire correspondre au hachage md5 en PHP.

3
Geordy James

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

def md5(text: String) : String = Java.security.MessageDigest.getInstance("MD5").digest(text.getBytes()).map(0xFF & _).map { "%02x".format(_) }.foldLeft(""){_ + _}
2
Priyank Desai

Vous pouvez générer un hachage MD5 pour un texte donné en utilisant les méthodes de la classe MessageDigest du paquetage Java.security. Ci-dessous l'extrait de code complet,

import Java.security.MessageDigest;
import Java.security.NoSuchAlgorithmException;
import javax.xml.bind.DatatypeConverter;

public class MD5HashGenerator 
{

   public static void main(String args[]) throws NoSuchAlgorithmException
   {
       String stringToHash = "MyJavaCode"; 
       MessageDigest messageDigest = MessageDigest.getInstance("MD5");
       messageDigest.update(stringToHash.getBytes());
       byte[] digiest = messageDigest.digest();
       String hashedOutput = DatatypeConverter.printHexBinary(digiest);
       System.out.println(hashedOutput);
   }
}

La sortie de la fonction MD5 est un hachage de 128 bits représenté par 32 nombres hexadécimaux.

Si vous utilisez une base de données telle que MySQL, vous pouvez également le faire d'une manière plus simple. La requête Select MD5(“text here”) renverra le hachage MD5 du texte entre crochets. 

0
Prasanna L M
 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));
 }
}

Il existe un article sur Codingkit à ce sujet. Découvrez: http://codingkit.com/a/Java/2013/1020/2216.html

0
shouyu