Come ottenere il checksum MD5 per un determinato file in Java? Come utilizzare l'utilità DigestUtils.md5Hex di Apache Common?
Pubblicato: 2021-08-28
Rafforzare la sicurezza della tua applicazione aziendale è la sfida più grande di qualsiasi organizzazione.
Considera questo scenario di produzione reale:
- Hai un'applicazione che
reads the value
da un file - In base al valore del file
performs some operations
come aggiungere/eliminare/eseguire - Hai distribuito questa applicazione nell'ambiente di produzione
- Cosa succede se una
unauthorized person
changes the value
di quel file a tua insaputa? - La tua applicazione
simply gets new value
da un file ed esegue la logica che potrebbe causareunexpected outcome
- Se hai abilitato il checksum MD5 per quel file, potresti
could have created an exception
con un chiaro messaggio di errore eyou could have prevented disaster
o un risultato imprevisto
Che cos'è il checksum MD5?
Il checksum MD5 per un file è un 128-bit value
, qualcosa come un'impronta digitale del file. Può essere utile sia per confrontare i file che per controllarne l'integrità.
Ottenere lo stesso valore per file diversi è quasi impossibile. In questo tutorial creeremo un semplice programma Java che crea e restituisce valori MD5 per un determinato file. Nel nostro caso è il file index.php
.
Iniziamo:
Passo 1
Crea una classe pubblica CrunchifyGetMD5ForFile.java
Passo 2
Importa sotto due dipendenze Maven nel file pom.xml
del tuo progetto. Tutorial per convertire un progetto in un progetto 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 > |
Stiamo usando le librerie commons-codec
e commons-io
.
Passaggio 3
Crea checksum MD5 utilizzando l'utilità DigestUtils.md5Hex
e stampa il risultato sulla console.
DigestUtils.md5Hex => implementazione 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 ; } |
Ecco un programma completo.
Crea 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 ) ; } } |
Basta eseguire il programma sopra come un'applicazione Java e vedrai un risultato simile a questo.

Risultato della console IntelliJ IDEA:
1 2 3 4 |
File : / Users / app / Download / crunchify . png Value : 103e7ae51e641d674780f7a03b491321 Process finished with exit code 0 |
Come utilizzerai questo checksum MD5 in fase di esecuzione per verificare l'integrità dei file?
Puoi confrontare questo checksum MD5 in fase di esecuzione con il valore memorizzato nel tuo database, come MySQL, Oracle, ecc.
Ci sono molti altri modi in cui potresti ottenere lo stesso risultato, ma ne parleremo in futuri tutorial.