SHA-256 und SHA3-256 Hashing in Java
1. Überblick
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.
DerSHA-256-Algorithmus generiert einen nahezu eindeutigen 256-Bit-Hash (32 Byte) mit fester Größe. Dies ist eine Einwegfunktion, daher kann das Ergebnis nicht auf den ursprünglichen Wert entschlüsselt werden.
Derzeit ist SHA-2-Hashing weit verbreitet, da es als der sicherste Hashing-Algorithmus auf dem Gebiet der Kryptografie gilt.
SHA-3 ist der neueste sichere Hashing-Standard nach SHA-2. 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 bei 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.
Weitere Lektüre:
Lokalitätssensitives Hashing in Java mit Java-LSH
Eine schnelle und praktische Anleitung zur Anwendung des Algorithmus für lokalsensitives Hashing in Java unter Verwendung der Bibliothek java-lsh.
MD5 Hashing in Java
Eine kurze Beschreibung zeigt Ihnen, wie Sie mit MD5-Hashing in Java umgehen.
Eine Anleitung zu HashSet in Java
Eine schnelle, aber umfassende Einführung in HashSet in Java.
2. MessageDigest Klasse in Java
Java bietet die eingebauteMessageDigest-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-zu-Hex-Konverter verwenden, um den Hash-Wert in hexadezimaler Form zu erhalten:
private static String bytesToHex(byte[] hash) {
StringBuffer hexString = new StringBuffer();
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();
}
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
Ebenso können wir auch Apache Commons Codecs verwenden:
commons-codec
commons-codec
1.11
Hier ist die Utility-Klasse -DigestUtils genannt -, die SHA-256-Hashing unterstützt:
String sha256hex = DigestUtils.sha256Hex(originalString);
5. Hüpfburg Bibliothek
5.1. Maven-Abhängigkeit
org.bouncycastle
bcprov-jdk15on
1.60
5.2. Hashing mit der Hüpfburgbibliothek
Die Bouncy Castle API bietet eine Utility-Klasse zum Konvertieren von Hex-Daten in Bytes und zurück.
Es ist jedoch erforderlich, zuerst einen Digest mit der integrierten Java-API auszufü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
Starting from JDK 9 können wir einfach den eingebauten SHA3-256-Algorithmus verwenden:
final MessageDigest digest = MessageDigest.getInstance(SHA3_256);
final byte[] hashbytes = digest.digest(
originalString.getBytes(StandardCharsets.UTF_8));
String sha3_256hex = bytesToHex(hashbytes);
6.2. Apache Commons Codecs
Apache Commons Codecs bietet einen praktischenDigestUtils-Wrapper für dieMessageDigest-Klasse. Diese Bibliothek begann SHA3-256 seit Version1.11 und auchrequires JDK 9+ zu unterstützen:
String sha3_256hex = 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 nur in der Auffüllregel von SHA3-256. Es wurde in mehreren Blockchain-Projekten verwendet, z. B.Monoro.
Auch hier müssen wir die Bouncy Castle Library importieren, um Keccak-256-Hashing verwenden zu können:
Security.addProvider(new BouncyCastleProvider());
final MessageDigest digest = MessageDigest.getInstance(KECCAK_256);
final byte[] encodedhash = digest.digest(
originalString.getBytes(StandardCharsets.UTF_8));
String sha3_256hex = 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 sha3_256hex = new String(Hex.encode(hashbytes));
7. Fazit
In diesem kurzen Artikel haben wir einige Möglichkeiten zur Implementierung von SHA-256- und SHA3-256-Hashing in Java vorgestellt, wobei sowohl integrierte Bibliotheken als auch Bibliotheken von Drittanbietern verwendet wurden.
Der Quellcode der obigen Beispiele befindet sich aufGitHub project.