java - with - spring md5 hash




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

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


C'est ce que je suis venu ici pour une fonction pratique de scala qui retourne 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(""){_ + _}

Contrairement à PHP où vous pouvez faire un chiffrement md5 de votre texte en appelant simplement la fonction md5($text) c.-à-d. md5($text) , 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 md5encryption dans votre classe principale comme indiqué ci-dessous.

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

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

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

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


J'ai juste téléchargé commons-codec.jar et j'ai obtenu un php parfait comme md5. Voici manual .

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

String Url = "your_url";

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

Et voila.


J'ai trouvé cette solution qui est beaucoup plus propre en termes d'obtention d'une représentation de chaîne à 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' here .


J'ai une classe (Hash) pour convertir du texte brut en hash dans les formats: md5 ou sha1, simillar que 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";

Sortie du script PHP:

MD5 :b10a8db164e0754105b7a99be72e3fe5
SHA1:0a4d55a8d778e5022fab701977c5d840bbc486d0

Utiliser un 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


Je ne sais pas si cela est pertinent pour quiconque lit ceci, mais j'ai juste eu le problème que je voulais

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

Je voulais le faire avec des classes JRE seulement (pas de communes Apache ou similaire). Une recherche rapide sur le Web ne m'a pas montré les exemples de code faisant les deux en même temps, seulement chaque tâche séparément. Parce que cela nécessite de lire deux fois le même fichier, je me suis dit qu'il valait peut-être la peine d'écrire du code qui unifie les deux tâches, en calculant la somme de contrôle à la volée lors du téléchargement du fichier. C'est mon résultat (désolé si ce n'est pas Java parfait, 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)
        );
}

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

Lorsque vous travaillez avec des chaînes de caractères et les classes crypto, assurez-vous de toujours spécifier le codage dans string.getBytes() vous souhaitez string.getBytes() la représentation en octets. Si vous utilisez simplement string.getBytes() il utilisera la valeur par défaut de la plate-forme. (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 oeil à la .update(byte[]) qui peut être appelée à plusieurs reprises. Puis appelez .digest() pour obtenir le hachage résultant.


La réponse de Bombe est correcte, mais notez que sauf si vous devez absolument utiliser MD5 (par exemple vous forcer pour l'interopérabilité), un meilleur choix est SHA1 car MD5 a 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 de la technique de hachage est qu'il existe un certain nombre de fonctions de hachage de remplacement candidates, mais aucune n'a encore émergé comme la meilleure pratique standard pour remplacer SHA1. Donc, en fonction de vos besoins, il serait judicieux de configurer votre algorithme de hachage afin qu'il puisse être remplacé à l'avenir.


Ma réponse pas très 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;
}

Pas besoin de le rendre trop compliqué. DigestUtils fonctionne très bien et vous rend confortable lorsque vous travaillez avec des hachages md5.

DigestUtils.md5Hex(_hash);

ou

DigestUtils.md5(_hash);

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


Si vous voulez réellement la réponse en tant que 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;
}

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! Pour moi beaucoup d'autre code ne fonctionnait pas correctement, j'ai fini par manquer 0 dans le hachage. Celui-ci semble être le même que celui de PHP. source: http://m2tec.be/blog/2010/02/03/java-md5-hex-0093


Une autre mise en œuvre:

import javax.xml.bind.DatatypeConverter;

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

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à la goyave (et si vous ne l'utilisez pas, vous devriez probablement l'être).


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 condensés MD5 ou SHA.


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

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


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

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)




hashcode