2010-09-20 17 views
13

Wiem, że istnieje wiele podobnych tematów, ale mimo to ... czy ktoś może podać mi działający przykład metody generującej ciąg MD5.
obecnie używam MessageDigest, a ja w następujący sposób, aby uzyskać ciągKonwertuj tablicę MD5 na String java

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

Chyba jest jakiś lepszy sposób to zrobić.
Z góry dziękuję!

+0

Która klasa BASE64Encoder to jest? –

+0

Musisz kochać Google! :-) –

+0

Niestety .... tutaj jest import sun.misc.BASE64Encoder; – Andrew

Odpowiedz

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

uwaga: MD5 nie jest uważany za dobrego algorytmu hash już, warto wybrać Shas

+15

FYI: MD5 to algorytm haszujący, a nie szyfr. Dlatego nie * zaszyfruje * danych. Raczej to * hashe * dane. –

+0

Dzięki! Działa dobrze dla mnie – Andrew

+0

@Adam Paynter Dzięki, edytowałem komentarz –

16

użyję commons-codec

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

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

+1

DigestUtils to najlepsze rozwiązanie na tej stronie. :) –

+0

Mimo, że wspaniale jest używać kodu bibliotecznego zamiast pisać własny algorytm, wadą jest to, że cała biblioteka musi być zawarta w dystrybucji, co jest hańbą ze względu na tylko jedną metodę. Oczywiście, jeśli jest używanych wiele innych klas i metod, jest to idealne, ale prawdopodobnie tak się nie stanie. – 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(); 

Zakłada się, że chcesz, aby twój MD5 był drukowany jako łańcuch szesnastkowy, a nie kodowany przez BASE64. Tak jest zwykle reprezentowany.

+0

Tylko słowo ostrzeżenia, jeśli ludzie używają tego rozwiązania. Nie pozwala na wywoływanie zera, które może zrzucić kontrole hash. Tak więc 0x0E będzie drukowane tylko jako E, a 0x00 zostanie rozebrane do pojedynczego 0. Podstawowym zadaniem jest przetestowanie długości każdego wyniku i przyjęcie zera, gdy długość wynosi 1. –

+0

@MechIntel Masz całkowitą rację. Właśnie zaktualizowałem odpowiedź. Dziękuję za wzloty! – Grodriguez

1

Widziałem następne rozwiązanie:

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

Ta metoda otrzyma w rzeczywistości taki sam wynik, jaki uzyskasz za pomocą programu 'md5' na terminalu * nix i wystarczająco wyraźnie! – Marvin