SHA-256 og SHA3-256 Hashing i Java

Java Top

Jeg kunngjorde nettopp det nye Lær våren kurs, med fokus på det grunnleggende i vår 5 og vårstøvel 2:

>> KONTROLLER KURSET

1. Oversikt

SHA (Secure Hash Algorithm) er en av de populære kryptografiske hashfunksjonene. En kryptografisk hash kan brukes til å lage en signatur for en tekst eller en datafil. I denne opplæringen, la oss ta en titt på hvordan vi kan utføre SHA-256 og SHA3-256 hashing-operasjoner ved hjelp av forskjellige Java-biblioteker.

SHA-256-algoritmen genererer en nesten unik 256-bit (32-byte) hash med fast størrelse. Dette er en enveisfunksjon, så resultatet kan ikke dekrypteres tilbake til den opprinnelige verdien.

Foreløpig er SHA-2-hashing mye brukt, da det blir ansett som den sikreste hashing-algoritmen på den kryptografiske arenaen.

SHA-3 er den siste sikre hashing-standarden etter SHA-2. Sammenlignet med SHA-2, gir SHA-3 en annen tilnærming for å generere en unik enveis hash, og det kan være mye raskere på noen maskinvareimplementeringer. I likhet med SHA-256 er SHA3-256 256-biters algoritme med fast lengde i SHA-3.

NIST ga ut SHA-3 i 2015, så det er foreløpig ikke så mange SHA-3-biblioteker som SHA-2. Det er ikke før JDK 9 at SHA-3-algoritmer var tilgjengelige i de innebygde standardleverandørene.

La oss starte med SHA-256.

2. MessageDigest Klasse i Java

Java gir innebygd MessageDigest klasse for SHA-256 hashing:

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

Her må vi imidlertid bruke en egendefinert byte til heksekonverter for å få hashverdien i heksadesimal:

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 må være klar over at MessageDigest er ikke trådsikker. Derfor bør vi bruke en ny forekomst for hver tråd.

3. Guava-biblioteket

Google Guava-biblioteket tilbyr også en verktøyklasse for hashing.

La oss først definere avhengighet:

 com.google.guava guava 20.0 

Her er hvordan vi kan bruke Guava til å hashe en streng:

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

4. Apache Commons-kodeker

På samme måte kan vi også bruke Apache Commons Codecs også:

 commons-codec commons-codec 1.11 

Her er verktøyet klasse - kalt DigestUtils - som støtter SHA-256 hashing:

String sha256hex = DigestUtils.sha256Hex (originalString);

5. Bouncy Castle Library

5.1. Maven avhengighet

 org.bouncycastle bcprov-jdk15on 1.60 

5.2. Hashing ved hjelp av Bouncy Castle Library

Bouncy Castle API gir en verktøyklasse for å konvertere heksedata til byte og tilbake igjen.

Imidlertid er det nødvendig å fylle ut en sammendrag ved hjelp av den innebygde Java API først:

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

6. SHA3-256

La oss nå fortsette med SHA3-256. SHA3-256 hashing i Java er ikke noe helt annet enn SHA-256.

6.1. MessageDigest Klasse i Java

Fra og med JDK 9 kan vi bare bruke den innebygde SHA3-256-algoritmen:

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-kodeker

Apache Commons Codecs er praktisk DigestUtils innpakning for MessageDigest klasse. Dette biblioteket begynte å støtte SHA3-256 siden versjon 1.11, og det krever også JDK 9+:

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

6.3. Keccak-256

Keccak-256 er en annen populær SHA3-256 hashingalgoritme. Foreløpig fungerer den som et alternativ til standard SHA3-256. Keccak-256 leverer samme sikkerhetsnivå som standard SHA3-256, og den skiller seg bare fra SHA3-256 på polstringsregelen. Den har blitt brukt i flere blockchain-prosjekter, for eksempel Monoro.

Igjen må vi importere Bouncy Castle Library for å bruke 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å bruke Bouncy Castle API til å utfø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. Konklusjon

I denne raske artikkelen så vi på noen måter å implementere SHA-256 og SHA3-256 hashing i Java, ved å bruke både innebygde og tredjepartsbiblioteker.

Kildekoden til eksemplene ovenfor finner du på GitHub-prosjektet.

Java bunn

Jeg kunngjorde nettopp det nye Lær våren kurs, med fokus på det grunnleggende i vår 5 og vårstøvel 2:

>> KONTROLLER KURSET

$config[zx-auto] not found$config[zx-overlay] not found