SHA-256 i SHA3-256 Hashing u Javi

Java Top

Upravo sam najavio novo Uči proljeće tečaj, usredotočen na osnove Spring 5 i Spring Boot 2:

>> PROVJERITE TEČAJ

1. Pregled

SHA (algoritam sigurnog raspršivanja) jedna je od popularnih kriptografskih hash funkcija. Kriptografsko raspršivanje može se koristiti za izradu potpisa za tekst ili podatkovnu datoteku. U ovom uputstvu, pogledajmo kako možemo izvoditi operacije heširanja SHA-256 i SHA3-256 koristeći razne Java knjižnice.

SHA-256 algoritam generira gotovo jedinstveno 256-bitno (32-bajtno) heširanje fiksne veličine. Ovo je jednosmjerna funkcija, pa se rezultat ne može dešifrirati natrag na izvornu vrijednost.

Trenutno se SHA-2 raspršivanje široko koristi jer se smatra najsigurnijim algoritmom raspršivanja u kriptografskoj areni.

SHA-3 je najnoviji standard sigurnog raspršivanja nakon SHA-2. U usporedbi sa SHA-2, SHA-3 pruža drugačiji pristup za generiranje jedinstvenog jednosmjernog raspršivanja, a na nekim hardverskim implementacijama može biti puno brži. Slično SHA-256, SHA3-256 je 256-bitni algoritam fiksne duljine u SHA-3.

NIST je objavio SHA-3 2015. godine, tako da zasad nema baš toliko SHA-3 knjižnica koliko SHA-2. Tek su JDK 9 algoritmi SHA-3 bili dostupni u ugrađenim zadanim davateljima usluga.

Sada, krenimo sa SHA-256.

2. MessageDigest Predavanje na Javi

Java nudi ugrađenu MessageDigest klasa za SHA-256 heširanje:

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

Međutim, ovdje moramo koristiti prilagođeni pretvarač bajta u hex da bismo dobili heširanu vrijednost u heksadecimalnom obliku:

privatni statički String bytesToHex (bajt [] hash) {StringBuilder hexString = novi 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 (); }

Moramo biti svjesni da MessageDigest nije siguran u niti. Slijedom toga, trebali bismo koristiti novu instancu za svaku nit.

3. Knjižnica Guava

Knjižnica Google Guava također nudi klasu korisnosti za raspršivanje.

Prvo definirajmo ovisnost:

 com.google.guava guava 20.0 

Evo kako možemo koristiti Guavu za heširanje niza:

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

4. Apache Commons kodeci

Slično tome, možemo koristiti i Apache Commons kodeke:

 commons-codec commons-codec 1.11 

Evo klase korisnosti - tzv DigestUtils - koji podržava SHA-256 heširanje:

Niz sha256hex = DigestUtils.sha256Hex (originalString);

5. Knjižnica Bouncy Castle

5.1. Ovisnost Mavena

 org.bouncycastle bcprov-jdk15na 1,60 

5.2. Hashing pomoću knjižnice Bouncy Castle

API Bouncy Castle pruža klasu korisnih programa za pretvaranje hex podataka u bajtove i natrag.

Međutim, prvo je potrebno popuniti sažetak koristeći ugrađeni Java API:

MessageDigest digest = MessageDigest.getInstance ("SHA-256"); bajt [] hash = digest.digest (originalString.getBytes (StandardCharsets.UTF_8)); Niz sha256hex = novi niz (hex.encode (hash));

6. SHA3-256

Sada nastavimo sa SHA3-256. Hashiranje SHA3-256 u Javi nije ništa posve drugačije od SHA-256.

6.1. MessageDigest Predavanje na Javi

Počevši od JDK 9, možemo jednostavno koristiti ugrađeni algoritam SHA3-256:

završni sažetak MessageDigest = MessageDigest.getInstance ("SHA3-256"); završni bajt [] hashbytes = digest.digest (originalString.getBytes (StandardCharsets.UTF_8)); Niz sha3Hex = bytesToHex (hashbytes);

6.2. Apache Commons kodeci

Apache Commons Codecs pruža prikladno DigestUtils omot za MessageDigest razred. Ova je knjižnica počela podržavati SHA3-256 od verzije 1.11, a zahtijeva i JDK 9+:

Niz sha3Hex = novi DigestUtils ("SHA3-256"). DigestAsHex (originalString);

6.3. Keccak-256

Keccak-256 je još jedan popularni SHA3-256 algoritam za raspršivanje. Trenutno služi kao alternativa standardnom SHA3-256. Keccak-256 pruža istu razinu sigurnosti kao i standardni SHA3-256, a razlikuje se od SHA3-256 samo po pravilu obloga. Korišten je u nekoliko blockchain projekata, poput Monoro.

Opet, trebamo uvesti knjižnicu Bouncy Castle da bismo koristili keširanje Keccak-256:

Security.addProvider (novi BouncyCastleProvider ()); završni sažetak MessageDigest = MessageDigest.getInstance ("Keccak-256"); završni bajt [] encodedhash = digest.digest (originalString.getBytes (StandardCharsets.UTF_8)); Niz sha3Hex = bytesToHex (encodedhash);

Također možemo koristiti Bouncy Castle API za vršenje raspršivanja:

Keccak.Digest256 digest256 = novi Keccak.Digest256 (); bajt [] hashbytes = digest256.digest (originalString.getBytes (StandardCharsets.UTF_8)); Niz sha3Hex = novi niz (hex.encode (hashbytes));

7. Zaključak

U ovom smo kratkom članku pogledali nekoliko načina implementacije raspršivanja SHA-256 i SHA3-256 u Javi, koristeći ugrađene i neovisne knjižnice.

Izvorni kod gore navedenih primjera može se naći na projektu GitHub.

Dno Java

Upravo sam najavio novo Uči proljeće tečaj, usredotočen na osnove Spring 5 i Spring Boot 2:

>> PROVJERITE TEČAJ