Cum să obțineți suma de control MD5 pentru orice fișier dat în Java? Cum se utilizează utilitarul Apache Common DigestUtils.md5Hex?
Publicat: 2021-08-28
Întărirea securității aplicației dvs. de companie este cea mai mare provocare a oricărei organizații.
Luați în considerare acest scenariu real de producție:
- Aveți o aplicație care
reads the value
dintr-un fișier - Pe baza valorii fișierului,
performs some operations
precum adăugare/ștergere/execuție - Ați implementat această aplicație în mediul de producție
- Ce se întâmplă dacă o
unauthorized person
changes the value
acelui fișier fără știrea ta? - Aplicația dvs.
simply gets new value
dintr-un fișier și rulează logica care poate provocaunexpected outcome
- Dacă este posibil să aveți sumă de control MD5 activată pentru acel fișier - ați
could have created an exception
cu un mesaj de eroare clar șiyou could have prevented disaster
sau rezultatul neașteptat
Ce este suma de control MD5?
Suma de control MD5 pentru un fișier este o 128-bit value
, ceva ca o amprentă a fișierului. Poate fi util atât pentru compararea fișierelor, cât și pentru controlul integrității acestora.
Pentru a obține aceeași valoare pentru fișiere diferite este aproape imposibil. În acest tutorial vom crea un program Java simplu care creează și returnează valori MD5 pentru un fișier dat. În cazul nostru, este fișierul index.php
.
Să începem:
Pasul 1
Creați clasa publică CrunchifyGetMD5ForFile.java
Pasul 2
Importați mai jos două dependențe Maven în fișierul pom.xml
al proiectului dumneavoastră. Tutorial pentru a converti proiectul în proiect 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 > |
Folosim biblioteci commons-codec
și commons-io
.
Pasul 3
Creați suma de control MD5 utilizând utilitarul DigestUtils.md5Hex
și imprimați rezultatul pe consolă.
DigestUtils.md5Hex => Implementare 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 ; } |
Iată un program complet.
Creați clasa 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 ) ; } } |
Doar rulați programul de mai sus ca o aplicație Java și veți vedea un rezultat similar cu acesta.

Rezultatul consolei IntelliJ IDEA:
1 2 3 4 |
File : / Users / app / Download / crunchify . png Value : 103e7ae51e641d674780f7a03b491321 Process finished with exit code 0 |
Cum veți folosi această sumă de control MD5 în timpul execuției pentru a verifica integritatea fișierului?
Puteți compara această sumă de control MD5 în timpul execuției cu valoarea stocată în baza dvs. de date, cum ar fi MySQL, Oracle etc.
Există o serie de alte moduri în care ați putea realiza același lucru, dar vom discuta acest lucru în tutorialele viitoare.