SHA-256 und SHA3-256 Hashing in Java

Java Top

Ich habe gerade den neuen Learn Spring- Kurs angekündigt , der sich auf die Grundlagen von Spring 5 und Spring Boot 2 konzentriert:

>> Überprüfen Sie den Kurs

1. Übersicht

Der SHA (Secure Hash Algorithm) ist eine der beliebtesten kryptografischen Hash-Funktionen. Ein kryptografischer Hash kann verwendet werden, um eine Signatur für einen Text oder eine Datendatei zu erstellen. In diesem Tutorial sehen wir uns an, wie wir SHA-256- und SHA3-256-Hashing-Operationen mit verschiedenen Java-Bibliotheken ausführen können.

Der SHA-256-Algorithmus generiert einen nahezu eindeutigen 256-Bit-Hash (32 Byte) mit fester Größe. Dies ist eine Einwegfunktion, sodass das Ergebnis nicht auf den ursprünglichen Wert zurückverschlüsselt werden kann.

Derzeit wird SHA-2-Hashing häufig verwendet, da es als der sicherste Hashing-Algorithmus im kryptografischen Bereich angesehen wird.

SHA-3 ist nach SHA-2 der neueste sichere Hashing-Standard. Im Vergleich zu SHA-2 bietet SHA-3 einen anderen Ansatz zum Generieren eines eindeutigen Einweg-Hashs und kann bei einigen Hardware-Implementierungen viel schneller sein. Ähnlich wie SHA-256 ist SHA3-256 der 256-Bit-Algorithmus mit fester Länge in SHA-3.

NIST hat SHA-3 im Jahr 2015 veröffentlicht, daher gibt es derzeit nicht ganz so viele SHA-3-Bibliotheken wie SHA-2. Erst mit JDK 9 waren SHA-3-Algorithmen in den integrierten Standardanbietern verfügbar.

Beginnen wir jetzt mit SHA-256.

2. MessageDigest- Klasse in Java

Java bietet eine integrierte MessageDigest- Klasse für SHA-256-Hashing:

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

Hier müssen wir jedoch einen benutzerdefinierten Byte-Hex-Konverter verwenden, um den Hash-Wert hexadezimal zu erhalten:

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

Wir müssen uns bewusst sein, dass MessageDigest nicht threadsicher ist . Folglich sollten wir für jeden Thread eine neue Instanz verwenden.

3. Guavenbibliothek

Die Google Guava-Bibliothek bietet auch eine Dienstprogrammklasse für das Hashing.

Definieren wir zunächst die Abhängigkeit:

 com.google.guava guava 20.0 

Hier ist, wie wir Guava verwenden können, um einen String zu hashen:

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

4. Apache Commons Codecs

In ähnlicher Weise können wir auch Apache Commons Codecs verwenden:

 commons-codec commons-codec 1.11 

Hier ist die Utility-Klasse namens DigestUtils , die SHA-256-Hashing unterstützt:

String sha256hex = DigestUtils.sha256Hex(originalString);

5. Hüpfburgbibliothek

5.1. Maven-Abhängigkeit

 org.bouncycastle bcprov-jdk15on 1.60 

5.2. Hashing mit der Hüpfburgbibliothek

Die Bouncy Castle-API bietet eine Dienstprogrammklasse zum Konvertieren von Hex-Daten in Bytes und wieder zurück.

Es ist jedoch erforderlich, zuerst einen Digest mit der integrierten Java-API zu füllen:

MessageDigest digest = MessageDigest.getInstance("SHA-256"); byte[] hash = digest.digest( originalString.getBytes(StandardCharsets.UTF_8)); String sha256hex = new String(Hex.encode(hash));

6. SHA3-256

Fahren wir nun mit SHA3-256 fort. SHA3-256-Hashing in Java unterscheidet sich nicht wesentlich von SHA-256.

6.1. MessageDigest- Klasse in Java

Ab JDK 9 können wir einfach den integrierten SHA3-256-Algorithmus verwenden:

final MessageDigest digest = MessageDigest.getInstance("SHA3-256"); final byte[] hashbytes = digest.digest( originalString.getBytes(StandardCharsets.UTF_8)); String sha3Hex = bytesToHex(hashbytes);

6.2. Apache Commons Codecs

Apache Commons Codecs bietet einen praktischen DigestUtils- Wrapper für die MessageDigest- Klasse. Diese Bibliothek unterstützt seit Version 1.11 SHA3-256 und erfordert auch JDK 9+:

String sha3Hex = new DigestUtils("SHA3-256").digestAsHex(originalString);

6.3. Keccak-256

Keccak-256 ist ein weiterer beliebter SHA3-256-Hashing-Algorithmus. Derzeit dient es als Alternative zum Standard SHA3-256. Keccak-256 bietet die gleiche Sicherheitsstufe wie der Standard SHA3-256 und unterscheidet sich von SHA3-256 nur in der Auffüllregel. Es wurde in mehreren Blockchain-Projekten wie Monoro verwendet.

Wieder müssen wir die Bouncy Castle Library importieren, um Keccak-256-Hashing zu verwenden:

Security.addProvider(new BouncyCastleProvider()); final MessageDigest digest = MessageDigest.getInstance("Keccak-256"); final byte[] encodedhash = digest.digest( originalString.getBytes(StandardCharsets.UTF_8)); String sha3Hex = bytesToHex(encodedhash);

Wir können auch die Bouncy Castle API verwenden, um das Hashing durchzuführen:

Keccak.Digest256 digest256 = new Keccak.Digest256(); byte[] hashbytes = digest256.digest( originalString.getBytes(StandardCharsets.UTF_8)); String sha3Hex = new String(Hex.encode(hashbytes));

7. Fazit

In diesem kurzen Artikel haben wir uns einige Möglichkeiten zum Implementieren von SHA-256- und SHA3-256-Hashing in Java angesehen, wobei sowohl integrierte Bibliotheken als auch Bibliotheken von Drittanbietern verwendet wurden.

Der Quellcode der obigen Beispiele befindet sich im GitHub-Projekt.

Java unten

Ich habe gerade den neuen Learn Spring- Kurs angekündigt , der sich auf die Grundlagen von Spring 5 und Spring Boot 2 konzentriert:

>> Überprüfen Sie den Kurs