MD5-hashing in Java

Java Top

Ik heb zojuist het nieuwe aangekondigd Leer de lente natuurlijk, gericht op de basisprincipes van Spring 5 en Spring Boot 2:

>> BEKIJK DE CURSUS

1. Overzicht

MD5 is een veelgebruikte cryptografische hashfunctie, die een hash van 128 bit produceert.

In dit artikel zullen we verschillende benaderingen van maak MD5-hashes met behulp van verschillende Java-bibliotheken.

2. MD5 gebruiken MessageDigest Klasse

Er zit een hash-functionaliteit in java.security.MessageDigest klasse. Het idee is om eerst te instantiëren MessageDigest met het soort algoritme dat u als argument wilt gebruiken:

MessageDigest.getInstance (tekenreeksalgoritme)

En blijf dan de berichtensamenvatting bijwerken met bijwerken() functie:

openbare ongeldige update (byte [] invoer)

De bovenstaande functie kan meerdere keren worden aangeroepen wanneer u zegt dat u een lang bestand aan het lezen bent. Dan moeten we eindelijk gebruiken verteren() functie om een ​​hash-code te genereren:

openbare byte [] samenvatting ()

Hieronder ziet u een voorbeeld dat een hash voor een wachtwoord genereert en deze vervolgens verifieert:

@Test openbare ongeldig gegevenPassword_whenHashing_thenVerifying () gooit NoSuchAlgorithmException {String hash = "35454B055CC325EA1AF2126E27707052"; String wachtwoord = "ILoveJava"; MessageDigest md = MessageDigest.getInstance ("MD5"); md.update (wachtwoord.getBytes ()); byte [] digest = md.digest (); String myHash = DatatypeConverter .printHexBinary (digest) .toUpperCase (); assertThat (myHash.equals (hash)). isTrue (); }

Evenzo kunnen we ook de checksum van een bestand verifiëren:

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

We moeten ons ervan bewust zijn dat de MessageDigest is niet thread-safe. Daarom moeten we voor elke thread een nieuwe instantie gebruiken.

3. MD5 Apache Commons gebruiken

De org.apache.commons.codec.digest.DigestUtils class maakt dingen veel eenvoudiger.

Laten we een voorbeeld bekijken van hashing en wachtwoord verifiëren:

@Test openbare ongeldig gegevenPassword_whenHashingUsingCommons_thenVerifying () {String hash = "35454B055CC325EA1AF2126E27707052"; String wachtwoord = "ILoveJava"; String md5Hex = DigestUtils .md5Hex (wachtwoord) .toUpperCase (); assertThat (md5Hex.equals (hash)). isTrue (); }

4. MD5 Guava gebruiken

Hieronder is een andere benadering die we kunnen volgen om MD5-checksums te genereren met com.google.common.io.Files.hash :

@Test openbare ongeldig gegevenFile_whenChecksumUsingGuava_thenVerifying () gooit IOException {String filename = "src / test / resources / test_md5.txt"; String checksum = "5EB63BBBE01EEED093CB22BB8F5ACDC3"; HashCode hash = com.google.common.io.Files .hash (nieuw bestand (bestandsnaam), Hashing.md5 ()); String myChecksum = hash.toString () .toUpperCase (); assertThat (myChecksum.equals (checksum)). isTrue (); }

Let daar op Hashing.md5 is verouderd. Zoals de officiële documentatie echter aangeeft, is de reden eerder om uit veiligheidsoverwegingen af ​​te raden MD5 in het algemeen niet te gebruiken. Dit betekent dat we deze methode nog steeds kunnen gebruiken als we bijvoorbeeld moeten integreren met het legacy-systeem dat MD5 vereist. Anders kunnen we beter veiligere opties overwegen, zoals SHA-256.

5. Conclusie

Er zijn verschillende manieren in Java API en andere API's van derden, zoals Apache commons en Guava, om de MD5-hash te genereren. Kies verstandig op basis van de vereisten van het project en de afhankelijkheden die uw project moet volgen.

Zoals altijd is de code beschikbaar op Github.

Java onderkant

Ik heb zojuist het nieuwe aangekondigd Leer de lente natuurlijk, gericht op de basisprincipes van Spring 5 en Spring Boot 2:

>> BEKIJK DE CURSUS