SHA-256 Hashing in Java

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.

Read more

MD5 Hashing in Java

Eine kurze Beschreibung zeigt Ihnen, wie Sie mit MD5-Hashing in Java umgehen.

Read more

Eine Anleitung zu HashSet in Java

Eine schnelle, aber umfassende Einführung in HashSet in Java.

Read more

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.