Hashing MD5 in Java

Java Top

Ho appena annunciato il nuovo corso Learn Spring , incentrato sui fondamenti di Spring 5 e Spring Boot 2:

>> SCOPRI IL CORSO

1. Panoramica

MD5 è una funzione hash crittografica ampiamente utilizzata, che produce un hash di 128 bit.

In questo articolo, vedremo diversi approcci per creare hash MD5 utilizzando varie librerie Java .

2. MD5 utilizzando MessageDigest Class

Esiste una funzionalità di hashing nella classe java.security.MessageDigest . L'idea è di creare prima un'istanza di MessageDigest con il tipo di algoritmo che desideri utilizzare come argomento:

MessageDigest.getInstance(String Algorithm)

E poi continua ad aggiornare il digest del messaggio usando la funzione update () :

public void update(byte [] input)

La funzione sopra può essere chiamata più volte quando si dice che si sta leggendo un file lungo. Quindi finalmente dobbiamo usare la funzione digest () per generare un codice hash:

public byte[] digest()

Di seguito è riportato un esempio che genera un hash per una password e quindi la verifica:

@Test public void givenPassword_whenHashing_thenVerifying() throws NoSuchAlgorithmException { String hash = "35454B055CC325EA1AF2126E27707052"; String password = "ILoveJava"; MessageDigest md = MessageDigest.getInstance("MD5"); md.update(password.getBytes()); byte[] digest = md.digest(); String myHash = DatatypeConverter .printHexBinary(digest).toUpperCase(); assertThat(myHash.equals(hash)).isTrue(); }

Allo stesso modo, possiamo anche verificare il checksum di un file:

@Test public void givenFile_generatingChecksum_thenVerifying() throws NoSuchAlgorithmException, IOException { String filename = "src/test/resources/test_md5.txt"; String checksum = "5EB63BBBE01EEED093CB22BB8F5ACDC3"; MessageDigest md = MessageDigest.getInstance("MD5"); md.update(Files.readAllBytes(Paths.get(filename))); byte[] digest = md.digest(); String myChecksum = DatatypeConverter .printHexBinary(digest).toUpperCase(); assertThat(myChecksum.equals(checksum)).isTrue(); }

Dobbiamo essere consapevoli che MessageDigest non è thread-safe . Di conseguenza, dovremmo usare una nuova istanza per ogni thread.

3. MD5 utilizzando Apache Commons

La classe org.apache.commons.codec.digest.DigestUtils rende le cose molto più semplici.

Vediamo un esempio per l'hashing e la verifica della password:

@Test public void givenPassword_whenHashingUsingCommons_thenVerifying() { String hash = "35454B055CC325EA1AF2126E27707052"; String password = "ILoveJava"; String md5Hex = DigestUtils .md5Hex(password).toUpperCase(); assertThat(md5Hex.equals(hash)).isTrue(); }

4. MD5 utilizzando Guava

Di seguito è riportato un altro approccio che possiamo seguire per generare checksum MD5 utilizzando com.google.common.io.Files.hash :

@Test public void givenFile_whenChecksumUsingGuava_thenVerifying() throws IOException { String filename = "src/test/resources/test_md5.txt"; String checksum = "5EB63BBBE01EEED093CB22BB8F5ACDC3"; HashCode hash = com.google.common.io.Files .hash(new File(filename), Hashing.md5()); String myChecksum = hash.toString() .toUpperCase(); assertThat(myChecksum.equals(checksum)).isTrue(); }

Notare che Hashing.md5 è deprecato. Tuttavia, come indica la documentazione ufficiale, il motivo è piuttosto quello di consigliare di non utilizzare MD5 in generale per problemi di sicurezza. Ciò significa che possiamo ancora utilizzare questo metodo se, ad esempio, abbiamo bisogno di integrarci con il sistema legacy che richiede MD5. Altrimenti, è meglio considerare opzioni più sicure, come SHA-256.

5. conclusione

Esistono diversi modi nell'API Java e in altre API di terze parti come Apache commons e Guava per generare l'hash MD5. Scegli con saggezza in base ai requisiti del progetto e alle dipendenze che il tuo progetto deve seguire.

Come sempre, il codice è disponibile su Github.

Fondo Java

Ho appena annunciato il nuovo corso Learn Spring , incentrato sui fondamenti di Spring 5 e Spring Boot 2:

>> SCOPRI IL CORSO