2010-09-20 11 views
13

Je sais qu'il y a beaucoup de sujets similaires, mais quand même ... quelqu'un peut-il me fournir un exemple de méthode qui génère la chaîne MD5.
J'utilise actuellement MessageDigest, et je fais ce qui suit pour obtenir une chaîneConvertir le tableau MD5 en String java

sun.misc.BASE64Encoder().encode(messageDigest.digest()) 

Je crois qu'il ya une meilleure façon de le faire.
Merci d'avance!

+0

Quelle classe Base64Encoder est-ce? –

+0

Tu dois aimer Google! :-) –

+0

Désolé .... ici, c'est import sun.misc.BASE64Encoder; – Andrew

Répondre

10
MessageDigest md = MessageDigest.getInstance("MD5"); 
byte[] arr = md.digest(bytesOfMessage); 
return Base64.getEncoder().encodeToString(arr); 

Note: md5 est pas considéré comme un bon algorithme de hachage plus, pensez à choisir SHAs

+15

FYI: MD5 est un algorithme de hachage, pas un chiffrement. Par conséquent, il ne * crypte * pas les données. Au contraire, il * hache * les données. –

+0

Merci! Fonctionne bien pour moi – Andrew

+0

@Adam Paynter Merci, j'ai modifié le commentaire –

16

J'utilise commons-codec

  • base64 - Base64.encodeBase64(digestBytes)
  • Hex-string - Hex.encodeHex(digestBytes)
+4

org.apache.commons.codec.digest.DigestUtils –

+1

DigestUtils est la meilleure solution sur cette page. :) –

+0

Bien que ce soit génial d'utiliser le code de la bibliothèque plutôt que d'écrire votre propre algorithme, cela présente le désavantage que toute la bibliothèque doit être incluse dans la distribution, ce qui est dommage pour une seule méthode. Évidemment, si beaucoup d'autres classes et méthodes sont utilisées aussi, c'est idéal, mais ce ne sera probablement pas le cas en général. – darrenp

4
// Convert to hex string 
StringBuffer sb = new StringBuffer(); 
for (int i = 0; i < messageDigest.length; i++) { 
    if ((0xff & messageDigest[i]) < 0x10) { 
     sb.append('0'); 
    } 
    sb.append(Integer.toHexString(0xff & messageDigest[i])); 
} 
String md5 = sb.toString(); 

Cela suppose que vous voulez réellement que votre MD5 soit imprimé en tant que chaîne hexadécimale, et non codé en BASE64. C'est comme ça qu'on le représente normalement.

+0

Juste un mot d'avertissement si les gens utilisent cette solution. Cela n'autorise pas les zéros en tête qui peuvent rejeter les contrôles de hachage. Donc, 0x0E sera simplement imprimé comme E et 0x00 sera réduit à 0. Un travail de base consiste à tester la longueur de chaque résultat et à ajouter un zéro lorsque la longueur est 1. –

+0

@MechIntel Vous avez complètement raison. Je viens de mettre à jour la réponse. Merci pour les heads up! – Grodriguez

1

Je l'ai vu la solution suivante:

byte[] digest = md.digest(someDataByteArray); 
    StringBuilder hex = new StringBuilder(); 
    for (byte b : digest) { 
     hex.append(String.format("%02x", b)); 
    } 
+0

Cette méthode obtiendra en fait le même résultat que ce que vous obtenez en utilisant le programme 'md5' dans le terminal * nix, et, assez clair! – Marvin