¿Cómo obtener la suma de verificación MD5 para cualquier archivo dado en Java? ¿Cómo usar la utilidad DigestUtils.md5Hex de Apache Common?
Publicado: 2021-08-28
Reforzar la seguridad de su aplicación empresarial es el mayor desafío de cualquier organización.
Considere este escenario de producción real:
- Tiene una aplicación que
reads the value
de un archivo - Según el valor del archivo,
performs some operations
como agregar/eliminar/ejecutar - Ha implementado esta aplicación en un entorno de producción.
- ¿Qué pasa si alguna
unauthorized person
changes the value
de ese archivo sin su conocimiento? - Su aplicación
simply gets new value
de un archivo y ejecuta la lógica que puede causarunexpected outcome
- Si puede tener la suma de verificación MD5 habilitada para ese archivo,
could have created an exception
con un mensaje de error claro yyou could have prevented disaster
o un resultado inesperado
¿Qué es la suma de comprobación MD5?
La suma de comprobación MD5 de un archivo es un 128-bit value
, algo así como una huella digital del archivo. Puede ser útil tanto para comparar los archivos como para controlar su integridad.
Obtener el mismo valor para un archivo diferente es casi imposible. En este tutorial, crearemos un programa Java simple que crea y devuelve valores MD5 para un archivo determinado. En nuestro caso es el archivo index.php
.
Empecemos:
Paso 1
Crear clase pública CrunchifyGetMD5ForFile.java
Paso 2
Importe debajo de dos dependencias maven al archivo pom.xml
de su proyecto. Tutorial para convertir proyecto a proyecto 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 > |
Estamos utilizando las bibliotecas commons-codec
y commons-io
.
Paso 3
Cree una suma de comprobación MD5 utilizando la utilidad DigestUtils.md5Hex
e imprima el resultado en la consola.
DigestUtils.md5Hex => Implementación 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 ; } |
Aquí hay un programa completo.
Crear clase 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 ) ; } } |
Simplemente ejecute el programa anterior como una aplicación Java y verá un resultado similar a este.

Resultado de la consola IntelliJ IDEA:
1 2 3 4 |
File : / Users / app / Download / crunchify . png Value : 103e7ae51e641d674780f7a03b491321 Process finished with exit code 0 |
¿Cómo va a utilizar esta suma de comprobación MD5 en tiempo de ejecución para verificar la integridad del archivo?
Puede comparar esta suma de verificación MD5 en tiempo de ejecución con el valor almacenado en su base de datos, como MySQL, Oracle, etc.
Hay varias otras formas en que podría lograr lo mismo, pero discutiremos esto en futuros tutoriales.