MD5 Hashing i Java

Java Top

Jeg har lige annonceret det nye Lær foråret kursus med fokus på det grundlæggende i Spring 5 og Spring Boot 2:

>> KONTROLLER KURSEN

1. Oversigt

MD5 er en meget brugt kryptografisk hash-funktion, der producerer en hash på 128 bit.

I denne artikel vil vi se forskellige tilgange til Opret MD5-hashes ved hjælp af forskellige Java-biblioteker.

2. MD5 Brug MessageDigest Klasse

Der er en hashing-funktionalitet i java.security.MessageDigest klasse. Ideen er at starte med det første MessageDigest med den slags algoritme, du vil bruge som argument:

MessageDigest.getInstance (strengalgoritme)

Og fortsæt derefter med at opdatere beskedfordøjelsen ved hjælp af opdater () fungere:

offentlig ugyldig opdatering (byte [] input)

Ovenstående funktion kan kaldes flere gange, når vi siger, at du læser en lang fil. Så skal vi endelig bruge fordøje() funktion til at generere en hash-kode:

offentlig byte [] fordøjelse ()

Nedenfor er et eksempel, der genererer en hash til en adgangskode og derefter verificerer den:

@Test offentlig ugyldighed givenPassword_whenHashing_thenVerifying () kaster NoSuchAlgorithmException {String hash = "35454B055CC325EA1AF2126E27707052"; Strengadgangskode = "ILoveJava"; MessageDigest md = MessageDigest.getInstance ("MD5"); md.update (password.getBytes ()); byte [] fordøjelse = md.digest (); String myHash = DatatypeConverter .printHexBinary (digest) .toUpperCase (); assertThat (myHash.equals (hash)). isTrue (); }

På samme måde kan vi også kontrollere kontrolsum for en fil:

@Test offentlig ugyldighed givenFile_generatingChecksum_thenVerifying () kaster NoSuchAlgorithmException, IOException {String filnavn = "src / test / resources / test_md5.txt"; Strengs kontrolsum = "5EB63BBBE01EEED093CB22BB8F5ACDC3"; MessageDigest md = MessageDigest.getInstance ("MD5"); md.update (Files.readAllBytes (Paths.get (filnavn))); byte [] fordøjelse = md.digest (); String myChecksum = DatatypeConverter .printHexBinary (digest) .toUpperCase (); assertThat (myChecksum.equals (checksum)). isTrue (); }

Vi skal være opmærksomme på, at MessageDigest er ikke trådsikker. Derfor bør vi bruge en ny forekomst til hver tråd.

3. MD5 Brug af Apache Commons

Det org.apache.commons.codec.digest.DigestUtils klasse gør tingene meget enklere.

Lad os se et eksempel på hashing og bekræftelse af adgangskode:

@Test offentligt ugyldigt givenPassword_whenHashingUsingCommons_thenVerifying () {String hash = "35454B055CC325EA1AF2126E27707052"; Strengadgangskode = "ILoveJava"; Streng md5Hex = DigestUtils .md5Hex (adgangskode) .toUpperCase (); assertThat (md5Hex.equals (hash)). isTrue (); }

4. MD5 Brug af Guava

Nedenfor er en anden tilgang, vi kan følge for at generere MD5-kontrolsummer ved hjælp af com.google.common.io.Files.hash :

@Test offentlig ugyldighed givenFile_whenChecksumUsingGuava_thenVerifying () kaster IOException {String filnavn = "src / test / resources / test_md5.txt"; Strengs kontrolsum = "5EB63BBBE01EEED093CB22BB8F5ACDC3"; HashCode hash = com.google.common.io.Files .hash (ny fil (filnavn), Hashing.md5 ()); Streng myChecksum = hash.toString () .toUpperCase (); assertThat (myChecksum.equals (checksum)). isTrue (); }

Noter det Hashing.md5 er udfaset. Som den officielle dokumentation indikerer, er årsagen snarere at råde til ikke at bruge MD5 generelt af sikkerhedsmæssige årsager. Dette betyder, at vi stadig kan bruge denne metode, hvis vi for eksempel har brug for at integrere med det ældre system, der kræver MD5. Ellers er det bedre for os at overveje mere sikre muligheder, som SHA-256.

5. Konklusion

Der er forskellige måder i Java API og andre tredjeparts-API'er som Apache commons og Guava til at generere MD5-hash. Vælg klogt ud fra kravene til projektet og afhængigheder, dit projekt skal følge.

Som altid er koden tilgængelig på Github.

Java bund

Jeg har lige annonceret det nye Lær foråret kursus med fokus på det grundlæggende i Spring 5 og Spring Boot 2:

>> KONTROLLER KURSEN

$config[zx-auto] not found$config[zx-overlay] not found