MD5 Hashing i Java

Java Top

Jeg kunngjorde nettopp det nye Lær våren kurs, med fokus på det grunnleggende i vår 5 og vårstøvel 2:

>> KONTROLLER KURSET

1. Oversikt

MD5 er en mye brukt kryptografisk hash-funksjon, som produserer en hash på 128 bit.

I denne artikkelen vil vi se forskjellige tilnærminger til lage MD5-hashes ved hjelp av forskjellige Java-biblioteker.

2. MD5 Bruke MessageDigest Klasse

Det er en hashing-funksjonalitet i java.security.MessageDigest klasse. Tanken er å først instansiere MessageDigest med den typen algoritme du vil bruke som argument:

MessageDigest.getInstance (strengalgoritme)

Og fortsett med å oppdatere meldingen sammen med Oppdater() funksjon:

offentlig ugyldig oppdatering (byte [] -inngang)

Ovennevnte funksjon kan kalles flere ganger når du sier at du leser en lang fil. Så endelig må vi bruke fordøye() funksjon for å generere en hash-kode:

offentlig byte [] fordøye ()

Nedenfor er et eksempel som genererer en hash for et passord og deretter verifiserer det:

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

På samme måte kan vi også verifisere kontrollsum for en fil:

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

Vi må være klar over at MessageDigest er ikke trådsikker. Derfor bør vi bruke en ny forekomst for hver tråd.

3. MD5 ved hjelp av Apache Commons

De org.apache.commons.codec.digest.DigestUtils klasse gjør ting mye enklere.

La oss se et eksempel for hashing og verifisering av passord:

@Test offentlig ugyldighet givenPassword_whenHashingUsingCommons_thenVerifying () {String hash = "35454B055CC325EA1AF2126E27707052"; Strengpassord = "ILoveJava"; Streng md5Hex = DigestUtils .md5Hex (passord) .toUpperCase (); assertThat (md5Hex.equals (hash)). isTrue (); }

4. MD5 Bruke Guava

Nedenfor er en annen tilnærming vi kan følge for å generere MD5-kontrollsummer ved hjelp av com.google.common.io.Files.hash :

@Test offentlig ugyldig givenFile_whenChecksumUsingGuava_thenVerifying () kaster IOException {String filnavn = "src / test / resources / test_md5.txt"; Strengsjekksum = "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 utfaset. Som den offisielle dokumentasjonen indikerer, er årsaken heller å råde til ikke å bruke MD5 generelt for sikkerhetshensyn. Dette betyr at vi fortsatt kan bruke denne metoden hvis vi for eksempel trenger å integrere med det eldre systemet som krever MD5. Ellers er det bedre å vurdere tryggere alternativer, som SHA-256.

5. Konklusjon

Det er forskjellige måter i Java API og andre tredjeparts-APIer som Apache commons og Guava for å generere MD5-hash. Velg med omhu basert på kravene til prosjektet og avhengigheter prosjektet ditt må følge.

Som alltid er koden tilgjengelig på Github.

Java bunn

Jeg kunngjorde nettopp det nye Lær våren kurs, med fokus på det grunnleggende i vår 5 og vårstøvel 2:

>> KONTROLLER KURSET

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