Java 12 introdujo una API que facilita el cálculo de resúmenes de archivos (hashing) de manera eficiente y sencilla mediante la clase java.security.MessageDigest. Esta API permite generar hashes de archivos utilizando algoritmos como SHA-256 o MD5 sin necesidad de manejar manualmente la lectura de bytes y el procesamiento del hash.
Un hash de archivo es un valor único derivado de su contenido, generado por una función hash criptográfica. Es ampliamente utilizado para:
- Verificar la integridad de archivos.
- Comparar grandes volúmenes de datos de manera eficiente.
- Validar la autenticidad de descargas.
Java 12 simplificó el proceso de generación de hash de archivos mediante el uso de `MessageDigest` junto con `Files.newInputStream`.
Veamos un ejemplo de uso con SHA-256:
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.security.DigestInputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.HexFormat;
public class FileHashingExample {
public static void main(String[] args) throws IOException, NoSuchAlgorithmException {
Path filePath = Path.of("archivo.txt");
String hash = calculateFileHash(filePath, "SHA-256");
System.out.println("Hash SHA-256: " + hash);
}
public static String calculateFileHash(Path path, String algorithm) throws IOException, NoSuchAlgorithmException {
MessageDigest digest = MessageDigest.getInstance(algorithm);
try (DigestInputStream dis = new DigestInputStream(Files.newInputStream(path), digest)) {
while (dis.read() != -1) { } // Leer completamente el archivo
}
byte[] hashBytes = digest.digest();
return HexFormat.of().formatHex(hashBytes);
}
}
Otra mejora en Java 12 es el método Files.mismatch, que permite comparar dos archivos y determinar la primera posición donde difieren. Esto es útil para verificaciones de integridad.
import java.nio.file.Files;
import java.nio.file.Path;
import java.io.IOException;
public class FileComparisonExample {
public static void main(String[] args) throws IOException {
Path file1 = Path.of("archivo1.txt");
Path file2 = Path.of("archivo2.txt");
long mismatch = Files.mismatch(file1, file2);
if (mismatch == -1) {
System.out.println("Los archivos son idénticos.");
} else {
System.out.println("Los archivos difieren en la posición: " + mismatch);
}
}
}
Esta API facilita el cálculo de hashes y la comparación de archivos, mejorando la eficiencia y seguridad del procesamiento de datos. Estas mejoras hacen que Java sea una opción aún más atractiva para tareas de integridad de archivos y validación criptográfica.