SHA-256 en SHA3-256 Hashing in Java
Ik heb zojuist het nieuwe aangekondigd Leer de lente natuurlijk, gericht op de basisprincipes van Spring 5 en Spring Boot 2:
>> BEKIJK DE CURSUS1. Overzicht
De SHA (Secure Hash Algorithm) is een van de populaire cryptografische hashfuncties. Een cryptografische hash kan worden gebruikt om een handtekening voor een tekst- of gegevensbestand te maken. Laten we in deze tutorial eens kijken hoe we SHA-256 en SHA3-256 hashing-bewerkingen kunnen uitvoeren met behulp van verschillende Java-bibliotheken.
Het SHA-256-algoritme genereert een bijna unieke 256-bits (32-byte) hash met een vaste grootte. Dit is een eenrichtingsfunctie, dus het resultaat kan niet terug worden gedecodeerd naar de oorspronkelijke waarde.
Momenteel wordt SHA-2-hashing veel gebruikt omdat het wordt beschouwd als het veiligste hash-algoritme in de cryptografische arena.
SHA-3 is de nieuwste veilige hashing-standaard na SHA-2. In vergelijking met SHA-2 biedt SHA-3 een andere benadering om een unieke eenrichtingshash te genereren, en het kan bij sommige hardware-implementaties veel sneller zijn. Net als SHA-256 is SHA3-256 het 256-bits algoritme met vaste lengte in SHA-3.
NIST heeft SHA-3 in 2015 uitgebracht, dus er zijn voorlopig niet zo veel SHA-3-bibliotheken als SHA-2. Pas op JDK 9 waren SHA-3-algoritmen beschikbaar in de ingebouwde standaardproviders.
Laten we nu beginnen met SHA-256.
2. MessageDigest Klasse in Java
Java biedt ingebouwde MessageDigest klasse voor SHA-256-hashing:
MessageDigest digest = MessageDigest.getInstance ("SHA-256"); byte [] encodedhash = digest.digest (originalString.getBytes (StandardCharsets.UTF_8));
Hier moeten we echter een aangepaste byte naar hex-converter gebruiken om de gehashte waarde in hexadecimaal te krijgen:
privé statische String bytesToHex (byte [] hash) {StringBuilder hexString = nieuwe 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 (); }
We moeten ons ervan bewust zijn dat de MessageDigest is niet thread-safe. Daarom moeten we voor elke thread een nieuwe instantie gebruiken.
3. Guava-bibliotheek
De Google Guava-bibliotheek biedt ook een hulpprogramma-klasse voor hashing.
Laten we eerst de afhankelijkheid definiëren:
com.google.guava guave 20.0
Nu, hier is hoe we Guava kunnen gebruiken om een string te hashen:
String sha256hex = Hashing.sha256 () .hashString (originalString, StandardCharsets.UTF_8) .toString ();
4. Apache Commons-codecs
Evenzo kunnen we ook Apache Commons-codecs gebruiken:
commons-codec commons-codec 1.11
Hier is de utility-klasse - genaamd DigestUtils - dat SHA-256-hashing ondersteunt:
String sha256hex = DigestUtils.sha256Hex (originalString);
5. Bouncy Castle-bibliotheek
5.1. Afhankelijkheid van Maven
org.bouncycastle bcprov-jdk15 op 1.60
5.2. Hashen met behulp van de Bouncy Castle Library
De Bouncy Castle-API biedt een hulpprogramma-klasse voor het converteren van hexadecimale gegevens naar bytes en weer terug.
Het is echter vereist om eerst een samenvatting te vullen met de ingebouwde Java API:
MessageDigest digest = MessageDigest.getInstance ("SHA-256"); byte [] hash = digest.digest (originalString.getBytes (StandardCharsets.UTF_8)); String sha256hex = nieuwe String (Hex.encode (hash));
6. SHA3-256
Laten we nu verder gaan met SHA3-256. SHA3-256-hashing in Java is niets heel anders dan SHA-256.
6.1. MessageDigest Klasse in Java
Vanaf JDK 9 kunnen we eenvoudig het ingebouwde SHA3-256-algoritme gebruiken:
laatste MessageDigest digest = MessageDigest.getInstance ("SHA3-256"); laatste byte [] hashbytes = digest.digest (originalString.getBytes (StandardCharsets.UTF_8)); String sha3Hex = bytesToHex (hashbytes);
6.2. Apache Commons-codecs
Apache Commons Codecs biedt een handige DigestUtils wrapper voor de MessageDigest klasse. Deze bibliotheek begon SHA3-256 te ondersteunen sinds versie 1.11, en het vereist ook JDK 9+:
String sha3Hex = nieuwe DigestUtils ("SHA3-256"). DigestAsHex (originalString);
6.3. Keccak-256
Keccak-256 is een ander populair SHA3-256-hash-algoritme. Momenteel dient het als alternatief voor de standaard SHA3-256. Keccak-256 levert hetzelfde beveiligingsniveau als de standaard SHA3-256, en verschilt alleen van SHA3-256 op de opvulregel. Het is gebruikt in verschillende blockchain-projecten, zoals Monoro.
Nogmaals, we moeten de Bouncy Castle-bibliotheek importeren om Keccak-256-hashing te gebruiken:
Security.addProvider (nieuwe BouncyCastleProvider ()); laatste MessageDigest digest = MessageDigest.getInstance ("Keccak-256"); laatste byte [] encodedhash = digest.digest (originalString.getBytes (StandardCharsets.UTF_8)); String sha3Hex = bytesToHex (encodedhash);
We kunnen ook gebruik maken van de Bouncy Castle API om de hashing uit te voeren:
Keccak.Digest256 digest256 = nieuwe Keccak.Digest256 (); byte [] hashbytes = digest256.digest (originalString.getBytes (StandardCharsets.UTF_8)); String sha3Hex = nieuwe String (Hex.encode (hashbytes));
7. Conclusie
In dit korte artikel hebben we een aantal manieren bekeken om SHA-256 en SHA3-256 hashing in Java te implementeren, met behulp van zowel ingebouwde bibliotheken als bibliotheken van derden.
De broncode van de bovenstaande voorbeelden is te vinden op het GitHub-project.
Java onderkant