MD5 Hashing en Java

MD5 Hashing en Java

1. Vue d'ensemble

MD5 est une fonction de hachage cryptographique largement utilisée, qui produit un hachage de 128 bits.

Dans cet article, nous verrons comment verrons différentes approches decreate MD5 hashes using various Java libraries.

2. MD5 utilisant la classeMessageDigest

Nous avons une fonctionnalité de hachage dans la classejava.security.MessageDigest. L'idée est de commencer par instancierMessageDigest avec le type d'algorithme que vous souhaitez utiliser comme argument du Singleton:

MessageDigest.getInstance(String Algorithm)

Et puis continuez à mettre à jour le résumé du message en utilisant la fonctionupdate():

public void update(byte [] input)

La fonction ci-dessus peut être appelée plusieurs fois lorsque vous lisez un fichier long. Enfin, nous devons utiliser la fonction digest pour générer un code de hachage:

public byte[] digest()

Voici un exemple qui génère un hachage pour un mot de passe puis le vérifie:

@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();
}

De même, nous pouvons également vérifier la somme de contrôle d'un fichier:

@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();
}

3. md5 avec Apache Commons

La classeorg.apache.commons.codec.digest.DigestUtils rend les choses beaucoup plus simples aux opérations ci-dessus que nous avons effectuées en utilisant la classeMessageDigest.

Voyons un exemple de hachage et de vérification du mot de passe:

@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 avec Guava

Voici une autre approche plus simple pour générer des sommes de contrôle MD5 en utilisantcom.google.common.io.Files.hash:

@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();
}

5. Conclusion

Il existe différentes approches dans les API Java et les autres API tierces telles que Apache commons et Guava. Choisissez judicieusement en fonction des exigences du projet et des dépendances que votre projet peut vouloir suivre.

Comme toujours, le code est disponibleover on Github.