SHA-256 Hachage en Java

SHA-256 et SHA3-256 Hashing en Java

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 didacticiel, voyons comment nous pouvons effectuer des opérations de hachage SHA-256 et SHA3-256 à l'aide de diverses bibliothèques Java.

L'algorithmeSHA-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é à la 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é du secteur cryptographique.

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

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.

Lectures complémentaires:

Hashing sensible à la localité en Java à l'aide de Java-LSH

Guide rapide et pratique sur l'application de l'algorithme de hachage sensible à la localisation en Java à l'aide de la bibliothèque java-lsh.

Read more

MD5 Hashing en Java

Un bref résumé vous montre comment traiter le hachage MD5 en Java.

Read more

Un guide pour HashSet en Java

Une introduction rapide mais complète à HashSet en Java.

Read more

2. ClasseMessageDigest en Java

Java fournit la classeMessageDigest 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 personnalisé octet en hexadécimal pour obtenir la valeur hachée en hexadécimal:

private static String bytesToHex(byte[] hash) {
    StringBuffer hexString = new StringBuffer();
    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();
}

3. Bibliothèque de goyave

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

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


    com.google.guava
    guava
    20.0

Maintenant, voici comment 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éeDigestUtils - qui prend en charge le hachage SHA-256:

String sha256hex = DigestUtils.sha256Hex(originalString);

5. Bibliothèque du château gonflable

5.1. Dépendance 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 d'utilitaires permettant de convertir des données hexadécimales en octets et inversement.

Cependant, il est nécessaire de renseigner un résumé à 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. SHA3-256 Le hachage en Java n’est pas très différent de SHA-256.

6.1. ClasseMessageDigest en Java

Starting from JDK 9, nous pouvons simplement utiliser l'algorithme SHA3-256 intégré:

final MessageDigest digest = MessageDigest.getInstance(SHA3_256);
final byte[] hashbytes = digest.digest(
  originalString.getBytes(StandardCharsets.UTF_8));
String sha3_256hex = bytesToHex(hashbytes);

6.2. Codecs Apache Commons

Apache Commons Codecs fournit un wrapperDigestUtils pratique pour la classeMessageDigest. Cette bibliothèque a commencé à prendre en charge SHA3-256 depuis la version1.11 et aussirequires JDK 9+:

String sha3_256hex = new DigestUtils(SHA3_256).digestAsHex(originalString);

6.3. Keccak-256

Keccak-256 est un autre algorithme de hachage populaire SHA3-256. Actuellement, il constitue une alternative à la norme SHA3-256. Keccak-256 offre le même niveau de sécurité que le SHA3-256 standard et diffère de celui-ci uniquement par la règle de remplissage. Il a été utilisé dans plusieurs projets blockchain, tels queMonoro.

De nouveau, nous devons importer la bibliothèque de Bouncy Castle 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 sha3_256hex = bytesToHex(encodedhash);

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

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

7. Conclusion

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

Le code source des exemples ci-dessus se trouve sur lesGitHub project.