Как получить контрольную сумму MD5 для любого файла в Java? Как использовать утилиту Apache Common DigestUtils.md5Hex?
Опубликовано: 2021-08-28
Усилить безопасность вашего корпоративного приложения — самая большая проблема любой организации.
Рассмотрим этот реальный производственный сценарий:
- У вас есть приложение, которое
reads the valueиз файла - На основе значения файла он
performs some operations, такие как добавление/удаление/выполнение. - Вы развернули это приложение в производственной среде.
- Что, если
unauthorized personchanges the valueэтого файла без вашего ведома? - Ваше приложение
simply gets new valueиз файла и запускает логику, которая может привести кunexpected outcome. - Если у вас может быть включена контрольная сумма MD5 для этого файла, вы
could have created an exceptionс четким сообщением об ошибке иyou could have prevented disasterили неожиданный результат.
Что такое контрольная сумма MD5?
Контрольная сумма MD5 для файла представляет собой 128-bit value , что-то вроде отпечатка файла. Это может быть полезно как для сравнения файлов, так и для контроля их целостности.
Получить одно и то же значение для другого файла практически невозможно. В этом руководстве мы создадим простую программу Java, которая создает и возвращает значения MD5 для данного файла. В нашем случае это файл index.php .
Давайте начнем:
Шаг 1
Создайте открытый класс CrunchifyGetMD5ForFile.java
Шаг 2
Импортируйте ниже две зависимости maven в файл pom.xml вашего проекта. Учебник по преобразованию проекта в проект 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 > |
Мы используем библиотеки commons-codec и commons-io .
Шаг 3
Создайте контрольную сумму MD5 с помощью утилиты DigestUtils.md5Hex и выведите результат на консоль.
DigestUtils.md5Hex => Реализация 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 ; } |
Вот полная программа.
Создайте класс 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 ) ; } } |
Просто запустите указанную выше программу как Java-приложение, и вы увидите результат, подобный этому.

Результат консоли IntelliJ IDEA:
|
1 2 3 4 |
File : / Users / app / Download / crunchify . png Value : 103e7ae51e641d674780f7a03b491321 Process finished with exit code 0 |
Как вы собираетесь использовать эту контрольную сумму MD5 во время выполнения для проверки целостности файла?
Вы можете сравнить эту контрольную сумму MD5 во время выполнения со значением, хранящимся в вашей базе данных, например, MySQL, Oracle и т. д.
Есть ряд других способов добиться того же, но мы обсудим это в следующих уроках.
