Comment obtenir la somme de contrôle MD5 pour un fichier donné en Java ? Comment utiliser l'utilitaire DigestUtils.md5Hex d'Apache Common ?
Publié: 2021-08-28
Renforcer la sécurité de votre application d'entreprise est le plus grand défi de toute organisation.
Considérez ce scénario de production réel :
- Vous avez une application qui
reads the value
d'un fichier - En fonction de la valeur du fichier, il
performs some operations
telles que ajouter/supprimer/exécuter - Vous avez déployé cette application dans un environnement de production
- Que se passe-t-il si une
unauthorized person
changes the value
de ce fichier à votre insu ? - Votre application
simply gets new value
à partir d'un fichier et exécute la logique qui peut provoquerunexpected outcome
- Si vous avez peut-être activé la somme de contrôle MD5 pour ce fichier, vous
could have created an exception
avec un message d'erreur clair etyou could have prevented disaster
ou un résultat inattendu
Qu'est-ce que la somme de contrôle MD5 ?
La somme de contrôle MD5 pour un fichier est une 128-bit value
, quelque chose comme une empreinte digitale du fichier. Il peut être utile à la fois pour comparer les fichiers et pour contrôler leur intégrité.
Obtenir la même valeur pour un fichier différent est presque impossible. Dans ce didacticiel, nous allons créer un programme Java simple qui crée et renvoie des valeurs MD5 pour un fichier donné. Dans notre cas, il s'agit du fichier index.php
.
Commençons:
Étape 1
Créer une classe publique CrunchifyGetMD5ForFile.java
Étape 2
Importez ci-dessous deux dépendances maven dans le fichier pom.xml
de votre projet. Tutoriel pour convertir un projet en projet maven.
1 2 3 4 5 6 7 8 9 10 |
< dependency > < groupId > commons - codec < / groupId > < artifactId > commons - codec < / artifactId > < version > 1.10 < / version > < / dependency > < dependency > < groupId > commons - io < / groupId > < artifactId > commons - io < / artifactId > < version > 2.4 < / version > < / dependency > |
Nous utilisons les bibliothèques commons-codec
et commons-io
.
Étape 3
Créez la somme de contrôle MD5 à l'aide de l'utilitaire DigestUtils.md5Hex
et imprimez le résultat sur la console.
DigestUtils.md5Hex => Implémentation encodeHex
1 2 3 4 5 6 7 8 9 10 |
protected static char [ ] encodeHex ( final byte [ ] data , final char [ ] toDigits ) { final int l = data . length ; final char [ ] out = new char [ l < < 1 ] ; // two characters form the hex value. for ( int i = 0 , j = 0 ; i < l ; i ++ ) { out [ j ++ ] = toDigits [ ( 0xF0 & data[i]) >>> 4]; out [ j ++ ] = toDigits [ 0x0F & data[i]]; } return out ; } |
Voici un programme complet.
Créer la classe crunchifyGetMd5ForFile.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
package crunchify . com . tutorials ; import org . apache . commons . codec . digest . DigestUtils ; import org . apache . commons . io . IOUtils ; import java . io . File ; import java . io . FileInputStream ; import java . io . IOException ; /** * @author Crunchify.com * How to get MD5 checksum for any given file in Java? Use commons-codec's DigestUtils.md5Hex. */ public class CrunchifyGetMD5ForFile { public static String crunchifyGetMd5ForFile ( String crunchifyFile ) { // File(): Creates a new File instance by converting the given pathname string into an abstract pathname. // If the given string is the empty string, then the result is the empty abstract pathname. File myFile = new File ( crunchifyFile ) ; return crunchifyGetMd5ForFile ( myFile ) ; } public static String crunchifyGetMd5ForFile ( File crunchifyFile ) { String crunchifyValue = null ; // FileInputStream: A FileInputStream obtains input bytes from a file in a file system. What files are available depends on the host environment. // FileInputStream is meant for reading streams of raw bytes such as image data. For reading streams of characters, consider using FileReader. FileInputStream crunchifyInputStream = null ; try { crunchifyInputStream = new FileInputStream ( crunchifyFile ) ; // md5Hex converts an array of bytes into an array of characters representing the hexadecimal values of each byte in order. // The returned array will be double the length of the passed array, as it takes two characters to represent any given byte. // DigestUtils(): Operations to simplify common MessageDigest tasks. This class is immutable and thread-safe. // However the MessageDigest instances it creates generally won't be. // The MessageDigestAlgorithms class provides constants for standard digest algorithms that can be // used with the getDigest(String) method and other methods that require the Digest algorithm name. // toByteArray(): Get the contents of an InputStream as a byte[]. // This method buffers the input internally, so there is no need to use a BufferedInputStream. crunchifyValue = DigestUtils . md5Hex ( IOUtils . toByteArray ( crunchifyInputStream ) ) ; // md5Hex(): Calculates the MD5 digest and returns the value as a 32 character hex string. } catch ( IOException e ) { log ( "Hey there is an error: " + e ) ; } finally { // closeQuietly(): Unconditionally close an InputStream. // Equivalent to InputStream.close(), except any exceptions will be ignored. // This is typically used in finally blocks. IOUtils . closeQuietly ( crunchifyInputStream ) ; } return crunchifyValue ; } // Simple log util private static void log ( String string ) { System . out . println ( string ) ; } public static void main ( String [ ] agrs ) { // Let's get MD5 for File index.php located at /Users/app/Download/ String file = "//cdn.crunchify.com/Users/app/Download/crunchify.png" ; String md5Value = crunchifyGetMd5ForFile ( file ) ; log ( "File: " + file + " \nValue: " + md5Value ) ; } } |
Exécutez simplement le programme ci-dessus en tant qu'application Java et vous verrez un résultat similaire à celui-ci.

Résultat de la console IntelliJ IDEA :
1 2 3 4 |
File : / Users / app / Download / crunchify . png Value : 103e7ae51e641d674780f7a03b491321 Process finished with exit code 0 |
Comment allez-vous utiliser cette somme de contrôle MD5 lors de l'exécution pour vérifier l'intégrité des fichiers ?
Vous pouvez comparer cette somme de contrôle MD5 au moment de l'exécution avec la valeur stockée dans votre base de données, comme MySQL, Oracle, etc.
Il existe de nombreuses autres façons d'obtenir le même résultat, mais nous en discuterons dans de futurs didacticiels.