Acabo de anunciar el nuevo curso Learn Spring , centrado en los fundamentos de Spring 5 y Spring Boot 2:
>> VER EL CURSO1. Información general
MD5 es una función hash criptográfica ampliamente utilizada, que produce un hash de 128 bits.
En este artículo, veremos diferentes enfoques para crear hash MD5 utilizando varias bibliotecas de Java .
2. MD5 usando la clase MessageDigest
Hay una funcionalidad de hash en la clase java.security.MessageDigest . La idea es primero instanciar MessageDigest con el tipo de algoritmo que desea usar como argumento:
MessageDigest.getInstance(String Algorithm)
Y luego continúe actualizando el resumen del mensaje usando la función update () :
public void update(byte [] input)
La función anterior se puede llamar varias veces cuando digamos que está leyendo un archivo largo. Luego, finalmente, necesitamos usar la función digest () para generar un código hash:
public byte[] digest()
A continuación se muestra un ejemplo que genera un hash para una contraseña y luego lo verifica:
@Test public void givenPassword_whenHashing_thenVerifying() throws NoSuchAlgorithmException { String hash = "35454B055CC325EA1AF2126E27707052"; String password = "ILoveJava"; MessageDigest md = MessageDigest.getInstance("MD5"); md.update(password.getBytes()); byte[] digest = md.digest(); String myHash = DatatypeConverter .printHexBinary(digest).toUpperCase(); assertThat(myHash.equals(hash)).isTrue(); }
Del mismo modo, también podemos verificar la suma de comprobación de un archivo:
@Test public void givenFile_generatingChecksum_thenVerifying() throws NoSuchAlgorithmException, IOException { String filename = "src/test/resources/test_md5.txt"; String checksum = "5EB63BBBE01EEED093CB22BB8F5ACDC3"; MessageDigest md = MessageDigest.getInstance("MD5"); md.update(Files.readAllBytes(Paths.get(filename))); byte[] digest = md.digest(); String myChecksum = DatatypeConverter .printHexBinary(digest).toUpperCase(); assertThat(myChecksum.equals(checksum)).isTrue(); }
Debemos ser conscientes de que MessageDigest no es seguro para subprocesos . En consecuencia, deberíamos usar una nueva instancia para cada hilo.
3. MD5 con Apache Commons
La clase org.apache.commons.codec.digest.DigestUtils simplifica mucho las cosas.
Veamos un ejemplo de hash y verificación de contraseña:
@Test public void givenPassword_whenHashingUsingCommons_thenVerifying() { String hash = "35454B055CC325EA1AF2126E27707052"; String password = "ILoveJava"; String md5Hex = DigestUtils .md5Hex(password).toUpperCase(); assertThat(md5Hex.equals(hash)).isTrue(); }
4. MD5 con guayaba
A continuación, se muestra otro enfoque que podemos seguir para generar sumas de comprobación MD5 utilizando com.google.common.io.Files.hash :
@Test public void givenFile_whenChecksumUsingGuava_thenVerifying() throws IOException { String filename = "src/test/resources/test_md5.txt"; String checksum = "5EB63BBBE01EEED093CB22BB8F5ACDC3"; HashCode hash = com.google.common.io.Files .hash(new File(filename), Hashing.md5()); String myChecksum = hash.toString() .toUpperCase(); assertThat(myChecksum.equals(checksum)).isTrue(); }
Tenga en cuenta que Hashing.md5 está obsoleto. Sin embargo, como indica la documentación oficial, la razón es más bien aconsejar no utilizar MD5 en general por cuestiones de seguridad. Esto significa que aún podemos usar este método si, por ejemplo, necesitamos integrarnos con el sistema heredado que requiere MD5. De lo contrario, es mejor que consideremos opciones más seguras, como SHA-256.
5. Conclusión
Hay diferentes formas en la API de Java y otras API de terceros como Apache commons y Guava para generar el hash MD5. Elija sabiamente en función de los requisitos del proyecto y las dependencias que su proyecto debe seguir.
Como siempre, el código está disponible en Github.
Fondo de Java