Hashing SHA-256 et SHA3-256 en Java

Haut Java

Je viens d'annoncer le nouveau cours Learn Spring , axé sur les principes de base de Spring 5 et Spring Boot 2:

>> VOIR LE COURS

1. Vue d'ensemble

Le SHA (Secure Hash Algorithm) est l'une des fonctions de hachage cryptographiques les plus populaires. Un hachage cryptographique peut être utilisé pour créer une signature pour un texte ou un fichier de données. Dans ce tutoriel, voyons comment nous pouvons effectuer des opérations de hachage SHA-256 et SHA3-256 à l'aide de diverses bibliothèques Java.

L'algorithme SHA-256 génère un hachage de 256 bits (32 octets) presque unique et de taille fixe. Il s'agit d'une fonction à sens unique, le résultat ne peut donc pas être déchiffré à sa valeur d'origine.

Actuellement, le hachage SHA-2 est largement utilisé car il est considéré comme l'algorithme de hachage le plus sécurisé dans l'arène cryptographique.

SHA-3 est le dernier standard de hachage sécurisé après SHA-2. Comparé à SHA-2, SHA-3 fournit une approche différente pour générer un hachage unidirectionnel unique, et il peut être beaucoup plus rapide sur certaines implémentations matérielles. Semblable à SHA-256, SHA3-256 est l'algorithme de longueur fixe de 256 bits dans SHA-3.

Le NIST a publié SHA-3 en 2015, il n'y a donc pas autant de bibliothèques SHA-3 que SHA-2 pour le moment. Ce n'est qu'au JDK 9 que les algorithmes SHA-3 étaient disponibles dans les fournisseurs par défaut intégrés.

Maintenant, commençons par SHA-256.

2. Classe MessageDigest en Java

Java fournit une classe MessageDigest intégrée pour le hachage SHA-256:

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

Cependant, ici, nous devons utiliser un convertisseur d'octet en hexadécimal personnalisé pour obtenir la valeur hachée en hexadécimal:

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(); }

Nous devons être conscients que MessageDigest n'est pas thread-safe . Par conséquent, nous devrions utiliser une nouvelle instance pour chaque thread.

3. Bibliothèque de goyaves

La bibliothèque Google Guava fournit également une classe utilitaire pour le hachage.

Tout d'abord, définissons la dépendance:

 com.google.guava guava 20.0 

Maintenant, voici comment nous pouvons utiliser Guava pour hacher une chaîne:

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

4. Codecs Apache Commons

De même, nous pouvons également utiliser les codecs Apache Commons:

 commons-codec commons-codec 1.11 

Voici la classe utilitaire - appelée DigestUtils - qui prend en charge le hachage SHA-256:

String sha256hex = DigestUtils.sha256Hex(originalString);

5. Bibliothèque du château gonflable

5.1. Dépendance de Maven

 org.bouncycastle bcprov-jdk15on 1.60 

5.2. Hashing à l'aide de la bibliothèque du château gonflable

L'API Bouncy Castle fournit une classe utilitaire pour convertir des données hexadécimales en octets et inversement.

Cependant, il est nécessaire de remplir d'abord un condensé à l'aide de l'API Java intégrée:

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

Continuons maintenant avec SHA3-256. Le hachage SHA3-256 en Java n'est rien de tout à fait différent de SHA-256.

6.1. Classe MessageDigest en Java

À partir de JDK 9, nous pouvons simplement utiliser l'algorithme intégré SHA3-256:

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

6.2. Codecs Apache Commons

Apache Commons Codecs fournit un wrapper DigestUtils pratique pour la classe MessageDigest . Cette bibliothèque a commencé à prendre en charge SHA3-256 depuis la version 1.11, et elle nécessite également JDK 9+:

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

6.3. Keccak-256

Keccak-256 est un autre algorithme de hachage SHA3-256 populaire. Actuellement, il sert d'alternative à la norme SHA3-256. Keccak-256 offre le même niveau de sécurité que le SHA3-256 standard, et il ne diffère de SHA3-256 que sur la règle de remplissage. Il a été utilisé dans plusieurs projets blockchain, tels que Monoro.

Encore une fois, nous devons importer la bibliothèque du château gonflable pour utiliser le hachage 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);

Nous pouvons également utiliser l'API Bouncy Castle pour effectuer le hachage:

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

7. Conclusion

Dans cet article rapide, nous avons examiné quelques façons d'implémenter le hachage SHA-256 et SHA3-256 en Java, en utilisant à la fois des bibliothèques intégrées et tierces.

Le code source des exemples ci-dessus se trouve sur le projet GitHub.

Fond Java

Je viens d'annoncer le nouveau cours Learn Spring , axé sur les principes de base de Spring 5 et Spring Boot 2:

>> VOIR LE COURS