SHA-256 en SHA3-256 Hashing in Java

Java Top

Ik heb zojuist het nieuwe aangekondigd Leer de lente natuurlijk, gericht op de basisprincipes van Spring 5 en Spring Boot 2:

>> BEKIJK DE CURSUS

1. Overzicht

De SHA (Secure Hash Algorithm) is een van de populaire cryptografische hashfuncties. Een cryptografische hash kan worden gebruikt om een ​​handtekening voor een tekst- of gegevensbestand te maken. Laten we in deze tutorial eens kijken hoe we SHA-256 en SHA3-256 hashing-bewerkingen kunnen uitvoeren met behulp van verschillende Java-bibliotheken.

Het SHA-256-algoritme genereert een bijna unieke 256-bits (32-byte) hash met een vaste grootte. Dit is een eenrichtingsfunctie, dus het resultaat kan niet terug worden gedecodeerd naar de oorspronkelijke waarde.

Momenteel wordt SHA-2-hashing veel gebruikt omdat het wordt beschouwd als het veiligste hash-algoritme in de cryptografische arena.

SHA-3 is de nieuwste veilige hashing-standaard na SHA-2. In vergelijking met SHA-2 biedt SHA-3 een andere benadering om een ​​unieke eenrichtingshash te genereren, en het kan bij sommige hardware-implementaties veel sneller zijn. Net als SHA-256 is SHA3-256 het 256-bits algoritme met vaste lengte in SHA-3.

NIST heeft SHA-3 in 2015 uitgebracht, dus er zijn voorlopig niet zo veel SHA-3-bibliotheken als SHA-2. Pas op JDK 9 waren SHA-3-algoritmen beschikbaar in de ingebouwde standaardproviders.

Laten we nu beginnen met SHA-256.

2. MessageDigest Klasse in Java

Java biedt ingebouwde MessageDigest klasse voor SHA-256-hashing:

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

Hier moeten we echter een aangepaste byte naar hex-converter gebruiken om de gehashte waarde in hexadecimaal te krijgen:

privé statische String bytesToHex (byte [] hash) {StringBuilder hexString = nieuwe 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 (); }

We moeten ons ervan bewust zijn dat de MessageDigest is niet thread-safe. Daarom moeten we voor elke thread een nieuwe instantie gebruiken.

3. Guava-bibliotheek

De Google Guava-bibliotheek biedt ook een hulpprogramma-klasse voor hashing.

Laten we eerst de afhankelijkheid definiëren:

 com.google.guava guave 20.0 

Nu, hier is hoe we Guava kunnen gebruiken om een ​​string te hashen:

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

4. Apache Commons-codecs

Evenzo kunnen we ook Apache Commons-codecs gebruiken:

 commons-codec commons-codec 1.11 

Hier is de utility-klasse - genaamd DigestUtils - dat SHA-256-hashing ondersteunt:

String sha256hex = DigestUtils.sha256Hex (originalString);

5. Bouncy Castle-bibliotheek

5.1. Afhankelijkheid van Maven

 org.bouncycastle bcprov-jdk15 op 1.60 

5.2. Hashen met behulp van de Bouncy Castle Library

De Bouncy Castle-API biedt een hulpprogramma-klasse voor het converteren van hexadecimale gegevens naar bytes en weer terug.

Het is echter vereist om eerst een samenvatting te vullen met de ingebouwde Java API:

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

6. SHA3-256

Laten we nu verder gaan met SHA3-256. SHA3-256-hashing in Java is niets heel anders dan SHA-256.

6.1. MessageDigest Klasse in Java

Vanaf JDK 9 kunnen we eenvoudig het ingebouwde SHA3-256-algoritme gebruiken:

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

6.2. Apache Commons-codecs

Apache Commons Codecs biedt een handige DigestUtils wrapper voor de MessageDigest klasse. Deze bibliotheek begon SHA3-256 te ondersteunen sinds versie 1.11, en het vereist ook JDK 9+:

String sha3Hex = nieuwe DigestUtils ("SHA3-256"). DigestAsHex (originalString);

6.3. Keccak-256

Keccak-256 is een ander populair SHA3-256-hash-algoritme. Momenteel dient het als alternatief voor de standaard SHA3-256. Keccak-256 levert hetzelfde beveiligingsniveau als de standaard SHA3-256, en verschilt alleen van SHA3-256 op de opvulregel. Het is gebruikt in verschillende blockchain-projecten, zoals Monoro.

Nogmaals, we moeten de Bouncy Castle-bibliotheek importeren om Keccak-256-hashing te gebruiken:

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

We kunnen ook gebruik maken van de Bouncy Castle API om de hashing uit te voeren:

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

7. Conclusie

In dit korte artikel hebben we een aantal manieren bekeken om SHA-256 en SHA3-256 hashing in Java te implementeren, met behulp van zowel ingebouwde bibliotheken als bibliotheken van derden.

De broncode van de bovenstaande voorbeelden is te vinden op het GitHub-project.

Java onderkant

Ik heb zojuist het nieuwe aangekondigd Leer de lente natuurlijk, gericht op de basisprincipes van Spring 5 en Spring Boot 2:

>> BEKIJK DE CURSUS