image de l'auteur
By mkyong | Dernière mise à jour : 16 juin 2020
Vu : 440 801 | +436 pv/w

En Java, nous pouvons utiliser MessageDigest pour obtenir un SHA-256 ou SHA3-256 algorithme de hachage pour hacher une chaîne de caractères.

 MessageDigest md = MessageDigest.getInstance("SHA3-256"); byte result = md.digest(input);

Cet article montre comment utiliser les algorithmes Java SHA-256 et SHA3-256 pour générer une valeur de hachage à partir d’une chaîne donnée et une somme de contrôle à partir d’un fichier.

Note
Le hachage est une fonction de compression à sens unique pour convertir des entrées de différentes longueurs en une sortie de longueur fixe (valeur de hachage).

SHA-2 et SHA-3

1.1 Le SHA-2 (Secure Hash Algorithm 2) est défini dans la norme FIPS PUB 180-4. Le SHA-2 est un algorithme de hachage largement utilisé, conçu par la National Security Agency (NSA).

Java prend en charge les algorithmes suivants SHA-2 :

  • SHA-224
  • SHA-256
  • SHA-384
  • SHA-512
  • SHA-512/224
  • SHA-512/256

La SHA-256 produit une sortie de 256-bits, 32 octets, tandis que SHA-512 produit une sortie de 512 bits, 64 octets.

String : Hello WorldSHA-256a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146eSHA-5122c74fd17edafd80e8447b0d46741ee243b7eb74dd2149a0ab1b9246fb30382f27e853d8585719e0e67cbda0daa8f51671064615d645ae27acb15bfb1447f459b

1.2 Le SHA-3 (Secure Hash Algorithm 3) est défini dans la norme FIPS PUB 202. Le SHA-3 est le dernier membre des algorithmes de hachage sécurisés, publié par le National Institute of Standards and Technology (NIST).

Java prend en charge les SHA-3 algorithmes suivants :

  • SHA3-224
  • SHA3-256
  • SHA3-384
  • SHA3-512
String : Hello WorldSHA3-256e167f68d6563d75bb25f3aa49c29ef612d41352dc00606de7cbd630bb2665f51SHA3-5122c74fd17edafd80e8447b0d46741ee243b7eb74dd2149a0ab1b9246fb30382f27e853d8585719e0e67cbda0daa8f51671064615d645ae27acb15bfb1447f459b

Plus de lecture

  • Lisez ceci Quelle est la différence entre SHA-.3 et SHA-256 ?
  • Lisez ceci Comparaison des fonctions SHA

Java SHA3-256 Hashing

Cet exemple Java hachure une chaîne avec l’algorithme SHA3-256.

ShaUtils.java
package com.mkyong.crypto.hash;import java.nio.charset.Charset;import java.nio.charset.StandardCharsets;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;public class ShaUtils { private static final Charset UTF_8 = StandardCharsets.UTF_8; private static final String OUTPUT_FORMAT = "%-20s:%s"; public static byte digest(byte input, String algorithm) { MessageDigest md; try { md = MessageDigest.getInstance(algorithm); } catch (NoSuchAlgorithmException e) { throw new IllegalArgumentException(e); } byte result = md.digest(input); return result; } public static String bytesToHex(byte bytes) { StringBuilder sb = new StringBuilder(); for (byte b : bytes) { sb.append(String.format("%02x", b)); } return sb.toString(); } public static void main(String args) { //String algorithm = "SHA-256"; // if you perfer SHA-2 String algorithm = "SHA3-256"; String pText = "Hello World"; System.out.println(String.format(OUTPUT_FORMAT, "Input (string)", pText)); System.out.println(String.format(OUTPUT_FORMAT, "Input (length)", pText.length())); byte shaInBytes = ShaUtils.digest(pText.getBytes(UTF_8), algorithm); System.out.println(String.format(OUTPUT_FORMAT, algorithm + " (hex) ", bytesToHex(shaInBytes))); // fixed length, 32 bytes, 256 bits. System.out.println(String.format(OUTPUT_FORMAT, algorithm + " (length)", shaInBytes.length)); }}

Sortie

Input (string) :Hello WorldInput (length) :11SHA3-256 (hex) :e167f68d6563d75bb25f3aa49c29ef612d41352dc00606de7cbd630bb2665f51SHA3-256 (length) :32

Tenter de hacher une autre chaîne, de longueur différente, pour SHA3-256, la sortie fixée à 256 bits, 32 octets.

Sortie

Input (string) :Hello SHA HashingInput (length) :17SHA3-256 (hex) :72fbf4f3a807d344a1ee492ff4183edf72e45fab8dfa6a6e5447226233633bf8SHA3-256 (length) :32

Java SHA3-256 Somme de contrôle de fichier

Un fichier dans le dossier des ressources.

sha-file.txt
Hello World

Cet exemple utilise l’algorithme SHA3-256 pour générer une somme de contrôle pour le fichier ci-dessus.

ShaUtils.java
package com.mkyong.crypto.hash;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.nio.charset.Charset;import java.nio.charset.StandardCharsets;import java.security.DigestInputStream;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;public class ShaUtils { private static byte checksum(String filePath, String algorithm) { MessageDigest md; try { md = MessageDigest.getInstance(algorithm); } catch (NoSuchAlgorithmException e) { throw new IllegalArgumentException(e); } try (InputStream is = new FileInputStream(filePath); DigestInputStream dis = new DigestInputStream(is, md)) { while (dis.read() != -1) ; //empty loop to clear the data md = dis.getMessageDigest(); } catch (IOException e) { throw new IllegalArgumentException(e); } return md.digest(); } public static String bytesToHex(byte bytes) { StringBuilder sb = new StringBuilder(); for (byte b : bytes) { sb.append(String.format("%02x", b)); } return sb.toString(); } public static void main(String args) { String algorithm = "SHA3-256"; // get file path from resources String filePath = ClassLoader.getSystemResource("sha-file.txt").getFile(); byte hashInBytes = checksum(filePath, algorithm); System.out.println(bytesToHex(hashInBytes)); }}

Sortie

e167f68d6563d75bb25f3aa49c29ef612d41352dc00606de7cbd630bb2665f51

NoSuchAlgorithmException

Lisez ceci pour tous les algorithmes MessageDigest supportés par Java. Si nous fournissons un algorithme non existant, par exemple, SHA4-256, Java lance java.security.NoSuchAlgorithmException.

MessageDigest md = MessageDigest.getInstance("SHA4-256");
java.security.NoSuchAlgorithmException: SHA4-256 MessageDigest not availableat com.mkyong.crypto.hash.ShaUtils.digest(ShaUtils.java:22)at com.mkyong.crypto.hash.ShaUtils.main(ShaUtils.java:65)Caused by: java.security.NoSuchAlgorithmException: SHA4-256 MessageDigest not availableat java.base/sun.security.jca.GetInstance.getInstance(GetInstance.java:159)at java.base/java.security.Security.getImpl(Security.java:700)at java.base/java.security.MessageDigest.getInstance(MessageDigest.java:178)at com.mkyong.crypto.hash.ShaUtils.digest(ShaUtils.java:20)... 1 more

Codec Apache Commons

Cet exemple utilise le populaire codec Apache Commons pour hacher une chaîne avec les algorithmes SHA.

pom.xml
<dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.14</version></dependency>
import org.apache.commons.codec.digest.DigestUtils; // SHA-2 byte hash1 = DigestUtils.sha256(""); // returns byte arrays String hash2 = DigestUtils.sha256Hex(""); // returns encoded hex // SHA-3 byte hash3 = DigestUtils.sha3_256(""); // returns byte arrays String hash4 = DigestUtils.sha3_256Hex(""); // returns encoded hex

Ajouter du sel au hachage SHA

Le sel est une donnée aléatoire, une technique pour prévenir les attaques de type arc-en-ciel. En Java, nous pouvons utiliser SecureRandom pour générer un sel (octets aléatoires).

 public static byte getRandomNonce(int numBytes) { byte nonce = new byte; new SecureRandom().nextBytes(nonce); return nonce; }

Cet exemple génère un sel aléatoire de 16 octets et utilise ByteBuffer pour le préfixer à une chaîne de caractères. Au final, nous utilisons l’algorithme SHA3-256 pour générer une valeur de hachage à partir de la salt + string.

 // get a 16 bytes random salt. byte salt = CryptoUtils.getRandomNonce(16); byte pText = "Hello World".getBytes(StandardCharsets.UTF_8); // combine two byte arrays byte input = ByteBuffer.allocate(salt.length + pText.length) .put(salt) .put(pText) .array(); // no salt, SHA3-256 System.out.println(bytesToHex(ShaUtils.digest(pText, "SHA3-256"))); // 16 bytes salt, SHA3-256 System.out.println(bytesToHex(ShaUtils.digest(input, "SHA3-256")));

Sortie

# no salte167f68d6563d75bb25f3aa49c29ef612d41352dc00606de7cbd630bb2665f51# 16 bytes salta6c589937ea475fc942d31d154d359ff569ff99fa32ee5d996ff64eca2e7551b

Note
Pour le hachage du mot de passe, nous pouvons utiliser Bcrypt ou Argon2.

Télécharger le code source

$ git clone https://github.com/mkyong/core-java

$ cd java-crypto

  • Wikipedia – SHA-3
  • Wikipedia – Algorithmes de hachage sécurisés
  • Algorithmes de MessageDigest
  • Java – Comment convertir les tableaux d’octets en Hex
  • Java MD5 Hashing. Exemple
  • Java – Comment joindre et diviser des tableaux d’octets
image de l'auteur

mkyong

Fondateur de Mkyong.com, adore Java et les trucs open source. Suivez-le sur Twitter. Si vous aimez mes tutoriels, pensez à faire un don à ces organismes de bienfaisance.

.

Catégories : Articles

0 commentaire

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *