Comment générer un hachage MD5?


Réponses:


602

Vous en avez besoin java.security.MessageDigest.

Appel MessageDigest.getInstance("MD5") pour obtenir une instance MD5 que MessageDigestvous pouvez utiliser.

Le calcul du hachage en effectuant l'une des actions suivantes:

  • Alimentez l'intégralité de l'entrée en tant que byte[] et calculez le hachage en une seule opération avec md.digest(bytes).
  • Nourrir l' MessageDigestun byte[]morceau à la fois en appelant md.update(bytes). Lorsque vous avez terminé d'ajouter des octets d'entrée, calculez le hachage avec md.digest() .

Le byte[]retourné par md.digest()est le hachage MD5.


144
Une chose qui n'est pas mentionnée ici et qui m'a pris par surprise. Les classes MessageDigest ne sont PAS thread-safe. S'ils doivent être utilisés par différents threads, créez-en simplement un nouveau, au lieu d'essayer de les réutiliser.
mjuarez

39
Il utilise plusieurs méthodes pour muter son état interne. Comment le manque de sécurité des fils peut-il être surprenant?
Bombe

90
@Bombe: pourquoi devrions-nous nous attendre à devoir connaître l'état interne de MessageDigest?
Dan Barowy

28
@DanBarowy bien, vous êtes muter (ie appeler des méthodes qui ne renvoient pas les valeurs , mais provoquent d' autres méthodes pour renvoyer des valeurs différentes) ainsi jusqu'à preuve du contraire , vous devriez toujours supposer qu'il est thread-safe de le faire.
Bombe

3
@Traubenfuchs MessageDigestvous permet de saisir les données par blocs. Ce ne serait pas possible avec une méthode statique. Bien que vous puissiez affirmer qu'ils auraient dû en ajouter un de toute façon pour plus de commodité lorsque vous pouvez transmettre toutes les données à la fois.
user253751

690

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

Lorsque vous travaillez avec des chaînes et les classes de chiffrement, assurez-vous de toujours spécifier l'encodage dans lequel vous souhaitez que la représentation en octets soit utilisée. Si vous l'utilisez, string.getBytes()elle utilisera la plate-forme par défaut. (Toutes les plateformes 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 .update(byte[])méthode qui peut être appelée à plusieurs reprises. Appelez ensuite .digest()pour obtenir le hachage résultant.


"LATIN1"! = "ASCII" (ou "US-ASCII"). ASCII est un jeu de caractères 7 bits, Latin1 est un jeu de caractères 8 bits. Ils ne sont pas les mêmes.
Bombe

8
(voir joelonsoftware.com/articles/Unicode.html pour une bien meilleure justification et explication)
Piskvor a quitté le bâtiment le

14
Cette rubrique est également utile si vous devez convertir les octets résultants en chaîne hexadécimale.
2012

1
Alors comment convertir ce chiffre en chaîne pour que nous puissions l'insérer dans mysql?
Humphrey

2
Mieux encore, dans la mesure du possible yourString.getBytes(StandardCharsets.UTF_8). Cela empêche la manipulation d'un fichier UnsupportedEncodingException.
Hummeling Engineering BV

267

Si vous voulez réellement que la réponse soit une chaîne par opposition à 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;
}

12
@BalusC: faux, la méthode BigInteger.toString renvoie le nombre complet dans la base spécifiée. 0x0606 sera imprimé en 606, seuls les zéros de fin sont omis,
Spidey

11
Nitpick mineur: m.reset () n'est pas nécessaire juste après avoir appelé getInstance. Plus mineur: «votre texte ici» nécessite des guillemets doubles.
David Leppik

À partir de Java 11, vous pouvez utiliser à la hashtext = "0".repeat(32 - hashtext.length()) + hashtextplace de la while, afin que les éditeurs ne vous avertissent pas que vous effectuez une concaténation de chaînes dans une boucle.
tom

Au lieu de m.update (plainxt.getBytes ()); Je recommanderais de spécifier l'encodage. tels que m.update (plainxt.getBytes ("UTF-8")); getBytes () ne garantit pas l'encodage et peut varier d'un système à l'autre, ce qui peut entraîner des résultats MD5 différents entre les systèmes pour la même chaîne.
user1819780

256

Vous pouvez également consulter 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.


2
En particulier, les méthodes qui renvoient des représentations codées "sûres" des données d'octets sous forme de chaîne.
Rob

4
Cependant, il n'y a pas de moyen facile d'intégrer la classe DigestUtils dans votre projet sans ajouter une tonne de bibliothèques ou porter la classe "par main" qui nécessite au moins deux classes supplémentaires.
iuiz

Je ne le trouve pas non plus dans les dépôts maven. Grrrr.
sparkyspider

5
Devrait être dans les référentiels Maven centraux, sauf si je deviens fou: groupId = commons-codec artifactId = commons-codec version = 1.5
Nick Spacek

160

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 n'en prends aucun crédit, mais c'est une solution qui fonctionne! Pour moi, beaucoup d'autres codes ne fonctionnaient pas correctement, j'ai fini par manquer des 0 dans le hachage. Celui-ci semble être le même que PHP. source: http://m2tec.be/blog/2010/02/03/java-md5-hex-0093


15
Vous devez spécifier l'encodage à utiliser getBytes(), sinon votre code obtiendra des résultats différents sur différentes plates-formes / paramètres utilisateur.
Paŭlo Ebermann

@ PaŭloEbermann fait MessageDigest.getInstance ("MD5"); pas assez? J'ai essayé d'ajouter "MD5" dans getBytes () mais cela a renvoyé une erreur
Blaze Tama

2
@BlazeTama "MD5" n'est pas un encodage, c'est un algorithme de résumé de message (et non un qui devrait être utilisé dans de nouvelles applications). Un codage est une paire d'algorithmes qui transforme les octets en chaînes et les chaînes en octets. Un exemple serait "UTF-8", "US-ASCII", "ISO-8859-1", "UTF-16BE" et similaires. Utilisez le même encodage que toutes les autres parties qui calculent un hachage de cette chaîne, sinon vous obtiendrez des résultats différents.
Paŭlo Ebermann

6
Pour un exemple du jeu de caractères ... (utilisez UTF-8, c'est le meilleur et le plus compatible à mon avis) ...byte[] array = md.digest(md5.getBytes(Charset.forName("UTF-8")));
Richard

Comme ce n'est pas ma solution et que je n'ai pas testé tous les scénarios moi-même, je vais le laisser inchangé, bien que je pense que spécifier l'encodage, etc. est probablement une bonne idée.
dac2009

88

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ù se trouve Hex: org.apache.commons.codec.binary.Hexdu projet Apache Commons .


14
Si vous utilisez Apache Commons Codec vous pouvez quand même utiliser: commons.apache.org/codec/api-release/org/apache/commons/codec/...
squiddle

13
Je remplacerais la dernière ligne par ceci:String result = Hex.encodeHexString(resultByte);
bleuâtre

84

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

Importez-le simplement dans votre projet et utilisez

String Url = "your_url";

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

Et voila.


1
Il s'agit de la méthode qui fournit la même valeur de retour que la fonction MySQL md5 (str). Beaucoup d'autres réponses ont renvoyé d'autres valeurs.
rwitzel

1
Cela ne fonctionne pas correctement sur Android, car Android regroupe le codec commun 1.2, pour lequel vous avez besoin de cette solution: stackoverflow.com/a/9284092/2413303
EpicPandaForce

76

J'ai trouvé que c'était la façon 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()));

3
Génial. Il ne tombe pas dans le piège de couper les zéros de tête.
Markus Pscheidt

2
Attention, cela ne fonctionnera pas pour Android si vous utilisez un niveau API <19, mais il vous suffit de modifier la deuxième ligne avec md5.update (string.getBytes ("UTF-8")); Cela ajoutera une autre exception vérifiée à gérer, cependant ...
Fran Marzoa

34

Trouvé cette solution qui est beaucoup plus propre en termes de récupération d'une représentation String à partir 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 d' ici .


2
Pourquoi cette réponse -1 alors que l'autre réponse, plus courte et moins descriptive a +146?
Nilzor

4
Agréable en utilisant BigInteger pour obtenir une valeur hexadécimale +1
Dave.B

5
Je viens de découvrir que dans certains cas, cela ne génère que 31 caractères de long MD5, pas 32 comme il se doit
kovica

3
@kovica c'est parce que les zéros de départ sont tronqués si je me souviens bien .. String.format("%032x", new BigInteger(1, hash)); Cela devrait résoudre ce problème. 'hachage' est l'octet [] du hachage.
Heshan Perera

Cette réponse a un bug avec le type charset!
Dawid Drozd

31

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

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

Pratique si vous utilisez déjà la goyave (si vous ne l'êtes pas, vous devriez probablement l'être).


3
ou en utilisant l'une des méthodes de raccourci:Hashing.md5().hashString("my string").asBytes();
Kurt Alfred Kluever

4
@KurtAlfredKluever n'oubliez pas d'insérer le jeu de caractères comme 'Hashing.md5 (). HashString ("ma chaîne", Charsets.UTF_8) .asBytes ()'
Justin

31

Une autre implémentation:

import javax.xml.bind.DatatypeConverter;

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

2
Je n'ai vu qu'une seule ligne qui n'utilise pas de bibliothèque externe.
holmis83

À moins que je ne me trompe, cela revient toujours en majuscule qui ne s'alignera pas avec les md5 fabriqués sans utiliser d'hex. Pas même vraiment sûr que c'est un vrai md5
walshie4

2
@ walshie4 il n'y a pas de MD5 sans hex (voir ietf.org/rfc/rfc1321.txt ), pour le mettre en minuscules, ajoutez simplement .toLower (). Comparez les résultats aux exemples dans par exemple en.wikipedia.org/wiki/MD5 alors vous aurez une meilleure chance de croire que le code de la bibliothèque Javas est correct.
stacker

28

J'ai une classe (Hash) pour convertir du texte brut en hachage dans les formats: md5 ou sha1, simillar que php fonctionne ( 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 PHP de sortie:

MD5 :b10a8db164e0754105b7a99be72e3fe5
SHA1:0a4d55a8d778e5022fab701977c5d840bbc486d0

Utiliser l'exemple et tester 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


Comme l'a dit @CedricSimon, c'est exactement ce que je cherchais. Upvote here .. Merci!
Joabe Lucena

24

Pas besoin de compliquer les choses.
DigestUtils fonctionne bien et vous rend confortable lorsque vous travaillez avec des md5hachages.

DigestUtils.md5Hex(_hash);

ou

DigestUtils.md5(_hash);

Soit vous pouvez utiliser toute autre méthode de cryptage telle que shaou md.


22

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

et String.format("%1$032X", big)d'avoir un format majuscule
alex


17

Vous pouvez essayer de suivre. Voir les détails et télécharger les codes 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();
}
}

16

La réponse de Bombe est correcte, cependant, notez qu'à moins que vous ne deviez absolument utiliser MD5 (par exemple forcé sur vous pour l'interopérabilité), un meilleur choix est SHA1 car MD5 a des faiblesses pour une utilisation à long terme.

Je dois ajouter que SHA1 a également des vulnérabilités théoriques, mais pas aussi graves. L'état actuel de la technique 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, selon vos besoins, il serait judicieux de rendre votre algorithme de hachage configurable afin qu'il puisse être remplacé à l'avenir.


Pourriez-vous m'indiquer quelques ressources, où je peux lire sur les mérites et les faiblesses relatifs de chacun?
Akshay

Le mieux que vous puissiez faire pour le moment est probablement d'utiliser SHA1 et d'être prêt à le remplacer à l'avenir. Vous pouvez utiliser des fonctions plus récentes mais elles n'ont pas encore fait l'objet de nombreuses recherches. Vous pouvez suivre les ressources de sécurité en ligne pour savoir quand cela changera - par exemple le blog de Bruce Schneier.
frankodwyer

7
SHA1 est exagéré sauf si vous voulez un hachage cryptographiquement sécurisé, c'est-à-dire que vous ne voulez pas que le hachage aide à reconstruire le message d'origine, ni que vous souhaitez qu'un attaquant intelligent crée un autre message qui correspond au hachage. Si l'original n'est pas un secret et que le hachage n'est pas utilisé pour la sécurité, MD5 est rapide et facile. Par exemple, Google Web Toolkit utilise des hachages MD5 dans les URL JavaScript (par exemple, foo.js? Hash = 12345).
David Leppik

12

Une autre implémentation: Fast MD5 Implementation in Java

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

1
Il s'agit d'une bibliothèque solide et autonome avec des dépendances minimales. Bon produit.
Ajax

Je l'ai trouvé très utile. Il a fallu 15357 ms pour un fichier de 4,57 Go tandis que l'implémentation Java intégrée a pris 19094 ms.
bkrish

11

Je ne sais pas si cela est pertinent pour quiconque lit ceci, mais je viens de rencontrer 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 avec des classes JRE uniquement (pas d'Apache Commons ou similaire). Une recherche rapide sur le Web ne m'a pas montré d'exemples d'extraits de code faisant les deux en même temps, uniquement chaque tâche séparément. Parce que cela nécessite de lire deux fois le même fichier, j'ai pensé qu'il pourrait être utile d'écrire du code qui unifie les deux tâches, calculant la somme de contrôle à la volée lors du téléchargement du fichier. Voici mon résultat (désolé si ce n'est pas du Java parfait, mais je suppose que vous avez quand même l'idée):

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

1
Oh BTW, avant que quiconque sauf moi ne remarque à quel point ma connaissance de JRE est vraiment mauvaise: je viens de découvrir DigestInputStream et DigestOutputStream . Je vais modifier ma solution d'origine pour refléter ce que je viens d'apprendre.
kriegaex

6

Jetez un œil au lien suivant, l'exemple obtient un hachage MD5 d'une image fournie: Hash MD5 d'une image


6

Pour ce que ça vaut, je suis tombé dessus parce que je veux synthétiser des GUID à partir d'une clé naturelle pour un programme qui installera des composants COM; Je souhaite créer une taille afin de ne pas gérer le cycle de vie du GUID. J'utiliserai MD5, puis j'utiliserai 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 jolie chaîne à partir des octets MD5.

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

en fait, il accepte non seulement le tableau d'octets MD5 (taille == 16). Vous pouvez passer un tableau d'octets de n'importe quelle longueur. Il sera converti en tableau d'octets MD5 au moyen de MD5 MessageDigest(voir le code source nameUUIDFromBytes () )
Lu55

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

6

Contrairement à PHP où vous pouvez faire un hachage MD5 de votre texte en appelant simplement la fonction md5, c'est md5($text)-à- dire qu'en Java, cela a été rendu 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é, créez d'abord une fonction nommée à l' md5hashingintérieur de 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 chaque fois que vous en avez besoin, comme indiqué ci-dessous.

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

Ici, vous pouvez voir que le hashtext est ajouté avec un zéro pour le faire correspondre avec le hachage md5 en PHP.


5

MD5 est parfaitement bien si vous n'avez pas besoin de la meilleure sécurité, et si vous faites quelque chose comme la vérification de 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.


2
Qu'est-ce qui vous fait penser que l'intégrité des fichiers n'est pas un problème de sécurité?
Jeremy Huiskamp

5

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

}

4

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

2
C'est probablement la pire solution car elle supprime les zéros de tête.
Jannick

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

1
Est-ce la langue Kotlin?
Isuru

3
@Isuru ressemble à Scala
Gildor

4

Vous pouvez générer un hachage MD5 pour un texte donné en utilisant les méthodes de la MessageDigestclasse du java.securitypackage. Voici 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.

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


2

Voici pourquoi je suis venu ici - une fonction scala pratique 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(""){_ + _}

0
 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 y a un article sur Codingkit à ce sujet. Consultez: http://codingkit.com/a/JAVA/2013/1020/2216.html

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.