web-dev-qa-db-fra.com

Obtenir la chaîne MD5 de Message Digest

Je comprends comment cela fonctionne, mais si je souhaite imprimer le MD5 en tant que chaîne, comment procéder 

public static void getMD5(String fileName) throws Exception{
    InputStream input =  new FileInputStream(fileName);
    byte[] buffer = new byte[1024];

    MessageDigest hash = MessageDigest.getInstance("MD5");
    int read;
    do {
        read = input.read(buffer);
        if (read > 0) {
            hash.update(buffer, 0, read);
        }
    } while (read != -1);
    input.close();
}
30
Tom

Essaye ça 

StringBuffer hexString = new StringBuffer();
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] hash = md.digest();

for (int i = 0; i < hash.length; i++) {
    if ((0xff & hash[i]) < 0x10) {
        hexString.append("0"
                + Integer.toHexString((0xFF & hash[i])));
    } else {
        hexString.append(Integer.toHexString(0xFF & hash[i]));
    }
}
20
ashishjmeshram

Vous pouvez l'obtenir en écrivant moins:

String hex = (new HexBinaryAdapter()).marshal(md5.digest(YOUR_STRING.getBytes()))
74
arutaku
    String input = "168";
    MessageDigest md = MessageDigest.getInstance("MD5");
    byte[] md5sum = md.digest(input.getBytes());
    String output = String.format("%032X", new BigInteger(1, md5sum));

ou

DatatypeConverter.printHexBinary( MessageDigest.getInstance("MD5").digest("a".getBytes("UTF-8")))
22
stacker

Vous pouvez également utiliser la bibliothèque Apache Commons Codec . Cette bibliothèque inclut les méthodes public static String md5Hex(InputStream data) et public static String md5Hex(byte[] data) dans la classe DigestUtils . Inutile de l'inventer vous-même;)

21
mmjmanders

Tout d’abord, vous devez obtenir la sortie byte[] de la MessageDigest:

byte[] bytes = hash.digest();

Cependant, vous ne pouvez pas facilement imprimer ceci (avec, par exemple, new String(bytes)) car il va contenir du binaire qui n'aura pas de bonnes représentations en sortie. Vous pouvez le convertir en hexadécimal pour un affichage comme ceci:

StringBuilder sb = new StringBuilder(2 * bytes.length);
for (byte b : bytes) {
    sb.append("0123456789ABCDEF".charAt((b & 0xF0) >> 4));
    sb.append("0123456789ABCDEF".charAt((b & 0x0F)));
}
String hex = sb.toString();
7
WhiteFang34

Avec le tableau d'octets, résulte du résumé du message:

...
byte hashgerado[] = md.digest(entrada);
...

for(byte b : hashgerado)
    System.out.printf("%02x", Byte.toUnsignedInt(b));

Résultat (par exemple):
89e8a9f68ad3c4bba9b9d3581cf5201d

3
carlao2005
/**
 * hashes:
 * e7cfa2be5969e235138356a54bad7fc4
 * 3c9ec110aa171b57bb41fc761130822c
 *
 * compiled with Java 8 - 12 Dec 2015
 */
public static String generateHash() {
    long r = new Java.util.Random().nextLong();
    String input = String.valueOf(r);
    String md5 = null;

    try {
        Java.security.MessageDigest digest = Java.security.MessageDigest.getInstance("MD5");
        //Update input string in message digest
        digest.update(input.getBytes(), 0, input.length());
        //Converts message digest value in base 16 (hex)
        md5 = new Java.math.BigInteger(1, digest.digest()).toString(16);
    }
    catch (Java.security.NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    return md5;
}
2
blueberry0xff

FYI ...

Dans certaines situations, cela n'a pas fonctionné pour moi

md5 = new Java.math.BigInteger(1, digest.digest()).toString(16);

mais cela a

StringBuilder sb = new StringBuilder();

for (int i = 0; i < digest.length; i++) {
    if ((0xff & digest[i]) < 0x10) {
        sb.append("0").append(Integer.toHexString((0xFF & digest[i])));
    } else {
        sb.append(Integer.toHexString(0xFF & digest[i]));
    }
}

String result = sb.toString();
1
Will Berger

Appelez hash.digest() pour terminer le processus. Il retournera un tableau d'octets. 

Vous pouvez créer une chaîne à partir d'un byte[] à l'aide d'un constructeur String. Toutefois, si vous souhaitez une chaîne hexagonale, vous devez parcourir le tableau d'octets manuellement et définir les caractères.

0
brain

Chemin le plus court:

String toMD5(String input) {
    MessageDigest md = MessageDigest.getInstance("MD5");
    byte[] raw = md.digest(input.getBytes());
    return DatatypeConverter.printHexBinary(raw);
}

N'oubliez pas de gérer l'exception.

0
Nguyen Le Vu Long