SHA-256 og SHA3-256 Hashing i Java

Java Top

Jeg har lige annonceret det nye Lær foråret kursus med fokus på det grundlæggende i Spring 5 og Spring Boot 2:

>> KONTROLLER KURSEN

1. Oversigt

SHA (Secure Hash Algorithm) er en af ​​de populære kryptografiske hash-funktioner. En kryptografisk hash kan bruges til at lave en signatur til en tekst eller en datafil. I denne vejledning skal vi se på, hvordan vi kan udføre SHA-256 og SHA3-256 hashing-operationer ved hjælp af forskellige Java-biblioteker.

SHA-256-algoritmen genererer en næsten unik 256-bit (32-byte) hash med fast størrelse. Dette er en envejsfunktion, så resultatet kan ikke dekrypteres tilbage til den oprindelige værdi.

I øjeblikket anvendes SHA-2-hashing i vid udstrækning, da det betragtes som den mest sikre hashingalgoritme på den kryptografiske arena.

SHA-3 er den seneste sikre hashing-standard efter SHA-2. Sammenlignet med SHA-2 giver SHA-3 en anden tilgang til at generere en unik envejs hash, og det kan være meget hurtigere på nogle hardwareimplementeringer. Svarende til SHA-256 er SHA3-256 256-bit algoritmen med fast længde i SHA-3.

NIST udgav SHA-3 i 2015, så der er ikke lige så mange SHA-3-biblioteker som SHA-2 for tiden. Det er først med JDK 9, at SHA-3-algoritmer var tilgængelige i de indbyggede standardudbydere.

Lad os nu starte med SHA-256.

2. MessageDigest Klasse i Java

Java leverer indbygget MessageDigest klasse til SHA-256 hashing:

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

Her skal vi dog bruge en brugerdefineret byte til hex-konverter for at få den hashede værdi i hexadecimal:

privat statisk String bytesToHex (byte [] hash) {StringBuilder hexString = ny StringBuilder (2 * hash.length); for (int i = 0; i <hash.length; i ++) {String hex = Integer.toHexString (0xff & hash [i]); hvis (hex.length () == 1) {hexString.append ('0'); } hexString.append (hex); } returner hexString.toString (); }

Vi skal være opmærksomme på, at MessageDigest er ikke trådsikker. Derfor bør vi bruge en ny forekomst til hver tråd.

3. Guava Bibliotek

Google Guava-biblioteket giver også en hjælpeklasse til hashing.

Lad os først definere afhængigheden:

 com.google.guava guava 20.0 

Her er hvordan vi kan bruge Guava til at hash en streng:

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

4. Apache Commons Codecs

På samme måde kan vi også bruge Apache Commons Codecs:

 commons-codec commons-codec 1.11 

Her er værktøjsklassen - kaldet DigestUtils - der understøtter SHA-256 hashing:

String sha256hex = DigestUtils.sha256Hex (originalString);

5. Bouncy Castle Library

5.1. Maven afhængighed

 org.bouncycastle bcprov-jdk15on 1.60 

5.2. Hashing ved hjælp af Bouncy Castle Library

Bouncy Castle API giver en hjælpeklasse til konvertering af hex-data til bytes og tilbage igen.

Det er dog nødvendigt at udfylde en fordøjelse ved hjælp af den indbyggede Java API først:

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

6. SHA3-256

Lad os nu fortsætte med SHA3-256. SHA3-256 hashing i Java er ikke noget helt andet end SHA-256.

6.1. MessageDigest Klasse i Java

Fra og med JDK 9 kan vi simpelthen bruge den indbyggede SHA3-256 algoritme:

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

6.2. Apache Commons Codecs

Apache Commons Codecs er praktisk DigestUtils indpakning til MessageDigest klasse. Dette bibliotek begyndte at understøtte SHA3-256 siden version 1.11, og det kræver også JDK 9+:

Streng sha3Hex = nye DigestUtils ("SHA3-256"). DigestAsHex (originalString);

6.3. Keccak-256

Keccak-256 er en anden populær SHA3-256 hashingalgoritme. I øjeblikket fungerer det som et alternativ til standard SHA3-256. Keccak-256 leverer det samme sikkerhedsniveau som standard SHA3-256, og det adskiller sig kun fra SHA3-256 på polstringsreglen. Det er blevet brugt i flere blockchain-projekter, såsom Monoro.

Igen er vi nødt til at importere Bouncy Castle Library for at bruge Keccak-256 hashing:

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

Vi kan også gøre brug af Bouncy Castle API til at udføre hashing:

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

7. Konklusion

I denne hurtige artikel har vi kigget på et par måder at implementere SHA-256 og SHA3-256 hashing på Java ved hjælp af både indbyggede og tredjepartsbiblioteker.

Kildekoden til eksemplerne ovenfor kan findes på GitHub-projektet.

Java bund

Jeg har lige annonceret det nye Lær foråret kursus med fokus på det grundlæggende i Spring 5 og Spring Boot 2:

>> KONTROLLER KURSEN