Hash SHA-256 e SHA3-256 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

SHA (Secure Hash Algorithm) è una delle popolari funzioni di hash crittografico. Un hash crittografico può essere utilizzato per creare una firma per un testo o un file di dati. In questo tutorial, diamo un'occhiata a come possiamo eseguire operazioni di hashing SHA-256 e SHA3-256 utilizzando varie librerie Java.

L'algoritmo SHA-256 genera un hash a 256 bit (32 byte) quasi unico e di dimensioni fisse. Questa è una funzione unidirezionale, quindi il risultato non può essere decrittografato al valore originale.

Attualmente, l'hashing SHA-2 è ampiamente utilizzato in quanto è considerato l'algoritmo di hashing più sicuro nell'arena crittografica.

SHA-3 è l'ultimo standard di hashing sicuro dopo SHA-2. Rispetto a SHA-2, SHA-3 fornisce un approccio diverso per generare un hash unidirezionale univoco e può essere molto più veloce su alcune implementazioni hardware. Simile a SHA-256, SHA3-256 è l'algoritmo a lunghezza fissa a 256 bit in SHA-3.

NIST ha rilasciato SHA-3 nel 2015, quindi non ci sono così tante librerie SHA-3 come SHA-2 per il momento. È solo JDK 9 che gli algoritmi SHA-3 erano disponibili nei provider predefiniti incorporati.

Ora iniziamo con SHA-256.

2. Classe MessageDigest in Java

Java fornisce la classe MessageDigest incorporata per l'hashing SHA-256:

MessageDigest digest = MessageDigest.getInstance("SHA-256"); byte[] encodedhash = digest.digest( originalString.getBytes(StandardCharsets.UTF_8));

Tuttavia, qui dobbiamo utilizzare un convertitore da byte a esadecimale personalizzato per ottenere il valore hash in esadecimale:

private static String bytesToHex(byte[] hash) { StringBuilder hexString = new StringBuilder(2 * hash.length); for (int i = 0; i < hash.length; i++) { String hex = Integer.toHexString(0xff & hash[i]); if(hex.length() == 1) { hexString.append('0'); } hexString.append(hex); } return hexString.toString(); }

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

3. Libreria Guava

La libreria Google Guava fornisce anche una classe di utilità per l'hashing.

Per prima cosa, definiamo la dipendenza:

 com.google.guava guava 20.0 

Ora, ecco come possiamo usare Guava per hash una stringa:

String sha256hex = Hashing.sha256() .hashString(originalString, StandardCharsets.UTF_8) .toString();

4. Codec Apache Commons

Allo stesso modo, possiamo anche utilizzare i codec Apache Commons:

 commons-codec commons-codec 1.11 

Ecco la classe di utilità, chiamata DigestUtils , che supporta l'hashing SHA-256:

String sha256hex = DigestUtils.sha256Hex(originalString);

5. Biblioteca del castello gonfiabile

5.1. Dipendenza da Maven

 org.bouncycastle bcprov-jdk15on 1.60 

5.2. Hashing utilizzando la libreria Bouncy Castle

L'API Bouncy Castle fornisce una classe di utilità per convertire i dati esadecimali in byte e viceversa.

Tuttavia, è necessario prima popolare un digest utilizzando l'API Java incorporata:

MessageDigest digest = MessageDigest.getInstance("SHA-256"); byte[] hash = digest.digest( originalString.getBytes(StandardCharsets.UTF_8)); String sha256hex = new String(Hex.encode(hash));

6. SHA3-256

Ora continuiamo con SHA3-256. L'hash SHA3-256 in Java non è molto diverso da SHA-256.

6.1. MessageDigest Classe in Java

A partire da JDK 9, possiamo semplicemente utilizzare l'algoritmo SHA3-256 integrato:

final MessageDigest digest = MessageDigest.getInstance("SHA3-256"); final byte[] hashbytes = digest.digest( originalString.getBytes(StandardCharsets.UTF_8)); String sha3Hex = bytesToHex(hashbytes);

6.2. Codec Apache Commons

Apache Commons Codecs fornisce un comodo wrapper DigestUtils per la classe MessageDigest . Questa libreria ha iniziato a supportare SHA3-256 dalla versione 1.11 e richiede anche JDK 9+:

String sha3Hex = new DigestUtils("SHA3-256").digestAsHex(originalString);

6.3. Keccak-256

Keccak-256 è un altro popolare algoritmo di hashing SHA3-256. Attualmente funge da alternativa allo standard SHA3-256. Keccak-256 offre lo stesso livello di sicurezza dello standard SHA3-256 e differisce da SHA3-256 solo per la regola di riempimento. È stato utilizzato in diversi progetti blockchain, come Monoro.

Ancora una volta, dobbiamo importare la libreria Bouncy Castle per utilizzare l'hashing Keccak-256:

Security.addProvider(new BouncyCastleProvider()); final MessageDigest digest = MessageDigest.getInstance("Keccak-256"); final byte[] encodedhash = digest.digest( originalString.getBytes(StandardCharsets.UTF_8)); String sha3Hex = bytesToHex(encodedhash);

Possiamo anche utilizzare l'API Bouncy Castle per eseguire l'hashing:

Keccak.Digest256 digest256 = new Keccak.Digest256(); byte[] hashbytes = digest256.digest( originalString.getBytes(StandardCharsets.UTF_8)); String sha3Hex = new String(Hex.encode(hashbytes));

7. Conclusione

In questo breve articolo, abbiamo esaminato alcuni modi per implementare l'hash SHA-256 e SHA3-256 in Java, utilizzando librerie integrate e di terze parti.

Il codice sorgente degli esempi precedenti può essere trovato nel progetto GitHub.

Fondo Java

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

>> SCOPRI IL CORSO