SHA-256 og SHA3-256 Hashing i Java
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 KURSEN1. 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