MD5 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

MD5 ist eine weit verbreitete kryptografische Hash-Funktion, die einen 128-Bit-Hash erzeugt.

In diesem Artikel werden verschiedene Ansätze zum Erstellen von MD5-Hashes mit verschiedenen Java-Bibliotheken vorgestellt .

2. MD5 Verwenden der MessageDigest- Klasse

In der Klasse java.security.MessageDigest gibt es eine Hashing-Funktionalität . Die Idee ist, MessageDigest zuerst mit der Art von Algorithmus zu instanziieren, die Sie als Argument verwenden möchten:

MessageDigest.getInstance(String Algorithm)

Aktualisieren Sie anschließend den Message Digest mithilfe der Funktion update () :

public void update(byte [] input)

Die obige Funktion kann mehrmals aufgerufen werden, wenn Sie beispielsweise eine lange Datei lesen. Dann müssen wir endlich die Funktion Digest () verwenden, um einen Hash-Code zu generieren:

public byte[] digest()

Unten sehen Sie ein Beispiel, das einen Hash für ein Kennwort generiert und es dann überprüft:

@Test public void givenPassword_whenHashing_thenVerifying() throws NoSuchAlgorithmException { String hash = "35454B055CC325EA1AF2126E27707052"; String password = "ILoveJava"; MessageDigest md = MessageDigest.getInstance("MD5"); md.update(password.getBytes()); byte[] digest = md.digest(); String myHash = DatatypeConverter .printHexBinary(digest).toUpperCase(); assertThat(myHash.equals(hash)).isTrue(); }

In ähnlicher Weise können wir auch die Prüfsumme einer Datei überprüfen:

@Test public void givenFile_generatingChecksum_thenVerifying() throws NoSuchAlgorithmException, IOException { String filename = "src/test/resources/test_md5.txt"; String checksum = "5EB63BBBE01EEED093CB22BB8F5ACDC3"; MessageDigest md = MessageDigest.getInstance("MD5"); md.update(Files.readAllBytes(Paths.get(filename))); byte[] digest = md.digest(); String myChecksum = DatatypeConverter .printHexBinary(digest).toUpperCase(); assertThat(myChecksum.equals(checksum)).isTrue(); }

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

3. MD5 Verwenden von Apache Commons

Die Klasse org.apache.commons.codec.digest.DigestUtils vereinfacht die Arbeit erheblich.

Sehen wir uns ein Beispiel für das Hashing und Überprüfen des Passworts an:

@Test public void givenPassword_whenHashingUsingCommons_thenVerifying() { String hash = "35454B055CC325EA1AF2126E27707052"; String password = "ILoveJava"; String md5Hex = DigestUtils .md5Hex(password).toUpperCase(); assertThat(md5Hex.equals(hash)).isTrue(); }

4. MD5 Verwenden von Guave

Im Folgenden finden Sie einen weiteren Ansatz, mit dem wir mithilfe von com.google.common.io.Files.hash MD5-Prüfsummen generieren können :

@Test public void givenFile_whenChecksumUsingGuava_thenVerifying() throws IOException { String filename = "src/test/resources/test_md5.txt"; String checksum = "5EB63BBBE01EEED093CB22BB8F5ACDC3"; HashCode hash = com.google.common.io.Files .hash(new File(filename), Hashing.md5()); String myChecksum = hash.toString() .toUpperCase(); assertThat(myChecksum.equals(checksum)).isTrue(); }

Beachten Sie, dass Hashing.md5 veraltet ist. Wie aus der offiziellen Dokumentation hervorgeht, besteht der Grund jedoch eher darin, MD5 aus Sicherheitsgründen generell nicht zu verwenden. Dies bedeutet, dass wir diese Methode weiterhin verwenden können, wenn wir beispielsweise in das Legacy-System integrieren müssen, für das MD5 erforderlich ist. Andernfalls sollten wir sicherere Optionen wie SHA-256 in Betracht ziehen.

5. Schlussfolgerung

In der Java-API und anderen APIs von Drittanbietern wie Apache Commons und Guava gibt es verschiedene Möglichkeiten, den MD5-Hash zu generieren. Wählen Sie mit Bedacht aus, basierend auf den Anforderungen des Projekts und den Abhängigkeiten, denen Ihr Projekt folgen muss.

Wie immer ist der Code auf Github verfügbar.

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