Hashing MD5 en Java

Haut Java

Je viens d'annoncer le nouveau cours Learn Spring , axé sur les principes de base de Spring 5 et Spring Boot 2:

>> VOIR LE COURS

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 différentes approches pour créer des hachages MD5 à l'aide de diverses bibliothèques Java .

2. MD5 utilisant la classe MessageDigest

Il existe une fonctionnalité de hachage dans la classe java.security.MessageDigest . L'idée est de commencer par instancier MessageDigest avec le type d'algorithme que vous souhaitez utiliser comme argument:

MessageDigest.getInstance(String Algorithm)

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

public void update(byte [] input)

La fonction ci-dessus peut être appelée plusieurs fois lorsque vous lisez un long fichier. 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(); }

Nous devons être conscients que MessageDigest n'est pas thread-safe . Par conséquent, nous devrions utiliser une nouvelle instance pour chaque thread.

3. MD5 utilisant Apache Commons

La classe org.apache.commons.codec.digest.DigestUtils rend les choses beaucoup plus simples.

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 utilisant Guava

Voici une autre approche que nous pouvons suivre pour générer des sommes de contrôle MD5 à l'aide de com.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(); }

Notez que Hashing.md5 est obsolète. Cependant, comme l'indique la documentation officielle, la raison est plutôt de ne pas utiliser MD5 en général pour des raisons de sécurité. Cela signifie que nous pouvons toujours utiliser cette méthode si, par exemple, nous devons nous intégrer au système hérité qui nécessite MD5. Sinon, il vaut mieux envisager des options plus sûres, comme SHA-256.

5. Conclusion

Il existe différentes manières dans l'API Java et d'autres API tierces comme Apache commons et Guava pour générer le hachage MD5. Choisissez judicieusement en fonction des exigences du projet et des dépendances que votre projet doit suivre.

Comme toujours, le code est disponible sur Github.

Fond Java

Je viens d'annoncer le nouveau cours Learn Spring , axé sur les principes de base de Spring 5 et Spring Boot 2:

>> VOIR LE COURS