SHA-256 i SHA3-256 Hashing u Javi
Upravo sam najavio novo Uči proljeće tečaj, usredotočen na osnove Spring 5 i Spring Boot 2:
>> PROVJERITE TEČAJ1. 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