SHA-256 a SHA3-256 hashovanie v Jave

Java Top

Práve som oznámil nové Naučte sa jar kurz zameraný na základy jari 5 a Spring Boot 2:

>> SKONTROLUJTE KURZ

1. Prehľad

SHA (Secure Hash Algorithm) je jednou z populárnych kryptografických hašovacích funkcií. Kryptografický hash možno použiť na vytvorenie podpisu pre textový alebo dátový súbor. V tomto tutoriále sa poďme pozrieť na to, ako môžeme vykonávať hašovacie operácie SHA-256 a SHA3-256 pomocou rôznych knižníc Java.

Algoritmus SHA-256 generuje takmer jedinečný 256-bitový (32-bajtový) hash s pevnou veľkosťou. Toto je jednosmerná funkcia, takže výsledok nemožno dešifrovať späť na pôvodnú hodnotu.

V súčasnosti je hashovanie SHA-2 široko používané, pretože sa považuje za najbezpečnejší algoritmus hashovania v kryptografickej aréne.

SHA-3 je najnovší štandard bezpečného hashovania po SHA-2. V porovnaní s SHA-2 poskytuje SHA-3 odlišný prístup k generovaniu jedinečného jednosmerného hashu a pri niektorých hardvérových implementáciách môže byť oveľa rýchlejší. Podobne ako SHA-256, SHA3-256 je 256-bitový algoritmus s pevnou dĺžkou v SHA-3.

Spoločnosť NIST vydala SHA-3 v roku 2015, takže v súčasnosti nie je toľko knižníc SHA-3 ako SHA-2. Až v JDK 9 boli algoritmy SHA-3 dostupné v zabudovaných predvolených poskytovateľoch.

Teraz začnime s SHA-256.

2. MessageDigest Trieda v Jave

Java poskytuje zabudované MessageDigest trieda pre hashovanie SHA-256:

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

Tu však musíme použiť vlastný prevodník bajtov na hexadecimálne hodnoty, aby sme dostali hašovanú hodnotu v šestnástkovej sústave:

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

Musíme si uvedomiť, že MessageDigest nie je bezpečný pre vlákna. Preto by sme mali pre každé vlákno použiť novú inštanciu.

3. Knižnica Guava

Knižnica Google Guava poskytuje aj triedu nástrojov na hašovanie.

Najprv definujeme závislosť:

 com.google.guava guava 20.0 

Teraz môžeme použiť Guavu na hashovanie reťazca takto:

Reťazec sha256hex = Hashing.sha256 () .hashString (originalString, StandardCharsets.UTF_8) .toString ();

4. Kodeky Apache Commons

Podobne môžeme tiež použiť kodeky Apache Commons:

 commons-codec commons-codec 1.11 

Tu je trieda nástrojov - tzv DigestUtils - ktorý podporuje hashovanie SHA-256:

Reťazec sha256hex = DigestUtils.sha256Hex (originalString);

5. Knižnica skákacieho hradu

5.1. Maven závislosť

 org.bouncycastle bcprov-jdk15on 1,60 

5.2. Hashing Používanie knižnice skákacieho hradu

API Bouncy Castle poskytuje triedu nástrojov na prevod hexadecimálnych údajov na bajty a späť.

Najskôr je však potrebné vyplniť súhrn pomocou zabudovaného rozhrania Java API:

MessageDigest digest = MessageDigest.getInstance ("SHA-256"); byte [] hash = digest.digest (originalString.getBytes (StandardCharsets.UTF_8)); Reťazec sha256hex = nový Reťazec (Hex.encode (hash));

6. SHA3-256

Teraz pokračujme SHA3-256. SHA3-256 hash v Jave sa ničím nelíši od SHA-256.

6.1. MessageDigest Trieda v Jave

Počnúc JDK 9 môžeme jednoducho použiť zabudovaný algoritmus SHA3-256:

final MessageDigest digest = MessageDigest.getInstance ("SHA3-256"); finálny bajt [] hashbytes = digest.digest (originalString.getBytes (StandardCharsets.UTF_8)); Reťazec sha3Hex = bytesToHex (hashbytes);

6.2. Kodeky Apache Commons

Kodeky Apache Commons poskytujú pohodlné riešenie DigestUtils obal na MessageDigest trieda. Táto knižnica začala podporovať SHA3-256 od verzie 1.11 a vyžaduje tiež JDK 9+:

Reťazec sha3Hex = nový DigestUtils ("SHA3-256"). DigestAsHex (originalString);

6.3. Keccak-256

Keccak-256 je ďalší populárny algoritmus hashovania SHA3-256. V súčasnosti slúži ako alternatíva k štandardnému SHA3-256. Keccak-256 poskytuje rovnakú úroveň zabezpečenia ako štandardný SHA3-256 a od SHA3-256 sa líši iba v pravidle výplne. Bol použitý v niekoľkých blockchainových projektoch, napríklad Monoro.

Opäť musíme importovať knižnicu Bouncy Castle, aby sme mohli použiť hašovanie Keccak-256:

Security.addProvider (nový BouncyCastleProvider ()); final MessageDigest digest = MessageDigest.getInstance ("Keccak-256"); finálny bajt [] encodedhash = digest.digest (originalString.getBytes (StandardCharsets.UTF_8)); Reťazec sha3Hex = bytesToHex (encodedhash);

Na vykonanie hašovania môžeme tiež použiť API Bouncy Castle:

Keccak.Digest256 digest256 = nový Keccak.Digest256 (); byte [] hashbytes = digest256.digest (originalString.getBytes (StandardCharsets.UTF_8)); Reťazec sha3Hex = nový Reťazec (Hex.encode (hashbytes));

7. Záver

V tomto rýchlom článku sme sa pozreli na niekoľko spôsobov implementácie hashovania SHA-256 a SHA3-256 v Jave pomocou vstavaných knižníc aj knižníc tretích strán.

Zdrojový kód vyššie uvedených príkladov je možné nájsť v projekte GitHub.

Java dole

Práve som oznámil nové Naučte sa jar kurz zameraný na základy jari 5 a Spring Boot 2:

>> SKONTROLUJTE KURZ

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