2010-09-20 22 views
13

So che ci sono molti argomenti simili, ma ancora ... qualcuno può fornirmi un esempio funzionante di metodo che genera la stringa MD5.
Attualmente sto usando MessageDigest, e sto facendo quanto segue per ottenere una stringaConverti array MD5 in String java

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

Credo che ci sia un modo migliore per farlo.
Grazie in anticipo!

+0

Quale classe BASE64Encoder è questo? –

+0

Devi amare Google! :-) –

+0

Mi dispiace .... eccolo import sun.misc.BASE64Encoder; – Andrew

risposta

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

nota: md5 non è considerato come un buon algoritmo di hash più, considerare la scelta SHAs

+15

FYI: MD5 è un algoritmo di hashing, non un cifrario. Pertanto, non * crittografa * i dati. Piuttosto, * hash * dati. –

+0

Grazie! Funziona bene per me – Andrew

+0

@Adam Paynter Grazie, ho modificato il commento –

16

userei commons-codec

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

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

+1

DigestUtils è la soluzione migliore su questa pagina. :) –

+0

Sebbene sia bello utilizzare il codice della libreria piuttosto che scrivere il proprio algoritmo, esso presenta lo svantaggio che l'intera libreria deve essere inclusa nella distribuzione, il che è un peccato per un solo metodo. Ovviamente, se vengono usate anche molte altre classi e metodi, questo è l'ideale, ma probabilmente non sarà così. – 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(); 

Questo presuppone che il MD5 venga stampato come una stringa esadecimale, non codificato in BASE64. Questo è il modo in cui viene normalmente rappresentato. soluzione successiva

+0

Solo una parola di avvertimento se le persone usano questa soluzione. Non consente gli zeri iniziali che possono eliminare i controlli hash. Quindi 0x0E verrà stampato come E e 0x00 sarà ridotto a un solo 0. Un lavoro di base è di testare la lunghezza di ogni risultato e anteporre uno zero quando la lunghezza è 1. –

+0

@MechIntel Hai perfettamente ragione. Ho appena aggiornato la risposta. Grazie per il testa a testa! – Grodriguez

1

che ho visto:

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

Questo metodo otterrà lo stesso risultato di quello che si ottiene usando il programma 'md5' nel terminale * nix e, abbastanza chiaro! – Marvin