Wie erhalte ich eine MD5-Prüfsumme für eine bestimmte Datei in Java? Wie verwende ich das Dienstprogramm DigestUtils.md5Hex von Apache Common?
Veröffentlicht: 2021-08-28
Die Erhöhung der Sicherheit Ihrer Unternehmensanwendung ist die größte Herausforderung für jedes Unternehmen.
Betrachten Sie dieses tatsächliche Produktionsszenario:
- Sie haben eine Anwendung, die
reads the value
- Basierend auf dem Dateiwert
performs some operations
wie Hinzufügen/Löschen/Ausführen aus - Sie haben diese Anwendung in der Produktionsumgebung bereitgestellt
- Was passiert, wenn eine
unauthorized person
changes the value
? - Ihre Anwendung
simply gets new value
aus einer Datei und führt die Logik aus, die zuunexpected outcome
führen kann - Wenn Sie möglicherweise die MD5-Prüfsumme für diese Datei aktiviert haben, hätten Sie möglicherweise
could have created an exception
undyou could have prevented disaster
Was ist die MD5-Prüfsumme?
Die MD5-Prüfsumme für eine Datei ist ein 128-bit value
, so etwas wie ein Fingerabdruck der Datei. Es kann sowohl für den Vergleich der Dateien als auch für ihre Integritätskontrolle nützlich sein.
Es ist fast unmöglich, den gleichen Wert für verschiedene Dateien zu erhalten. In diesem Tutorial erstellen wir ein einfaches Java-Programm, das MD5-Werte für eine bestimmte Datei erstellt und zurückgibt. In unserem Fall ist es die Datei index.php
.
Lass uns anfangen:
Schritt 1
Erstellen Sie die öffentliche Klasse CrunchifyGetMD5ForFile.java
Schritt 2
Importieren Sie die folgenden zwei Maven-Abhängigkeiten in die pom.xml
-Datei Ihres Projekts. Tutorial zum Konvertieren eines Projekts in ein Maven-Projekt.
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 > |
Wir verwenden commons-codec
und commons-io
Bibliotheken.
Schritt 3
Erstellen Sie eine MD5-Prüfsumme mit dem Dienstprogramm DigestUtils.md5Hex
und drucken Sie das Ergebnis auf der Konsole aus.
DigestUtils.md5Hex => encodeHex-Implementierung
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 ; } |
Hier ist ein volles Programm.
Erstellen Sie die Klasse 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 ) ; } } |
Führen Sie einfach das obige Programm als Java-Anwendung aus und Sie werden ein ähnliches Ergebnis sehen.

Ergebnis der IntelliJ IDEA-Konsole:
1 2 3 4 |
File : / Users / app / Download / crunchify . png Value : 103e7ae51e641d674780f7a03b491321 Process finished with exit code 0 |
Wie werden Sie diese MD5-Prüfsumme zur Laufzeit verwenden, um die Dateiintegrität zu überprüfen?
Sie können diese MD5-Prüfsumme zur Laufzeit mit dem Wert vergleichen, der in Ihrer Datenbank wie MySQL, Oracle usw. gespeichert ist.
Es gibt eine Reihe anderer Möglichkeiten, wie Sie dasselbe erreichen können, aber wir werden dies in zukünftigen Tutorials besprechen.