Verificar integridad de archivos checksum

El checksum es un número calculado con un algoritmo que es aplicado a un conjunto de bytes, por lo general es utilizado para comprobar la integridad de un archivo, por ejemplo al descargar un archivo de la web comprobamos si el checksum del archivo descargado coincide con el proporcionado por la página web, de ser así el archivo ha sido descargado correctamente.

Java contiene en el paquete java.util.zip dos clases que implementan las interface Checksum mediante la cual podemos calcular la suma de verificación de un conjunto de bytes definidos, estas clases son: Adler32, CRC32, que implementan los respectivos algoritmos.

El algoritmo Adler32 es más rápido en cambio CRC32 es más robusto.

Calcular checksum de un archivo

Para leer los bytes de un archivo usaremos la clase Files y su método estático readAllBytes(...), usando el método update() de la interface Checksum para ingregar el conjunto de bytes que deseamos procesar con el algortimo, veamos el código de ejemplo:

public class JavaChecksum {

    public static void main(String[] args) throws FileNotFoundException, IOException {

        String file = "c:/developer/temp/file.txt";

        Path path = Paths.get(file);
        byte data[] = Files.readAllBytes(path);

        System.out.println("Adler32 and CRC32 checksums for " + file);

        // Compute Adler32 checksum
        Adler32 ad = new Adler32();
        ad.update(data);

        long adler32Checksum = ad.getValue();
        System.out.println("Adler32: " + adler32Checksum);

        // Compute CRC32 checksum
        CRC32 crc = new CRC32();
        crc.update(data);

        long crc32Checksum = crc.getValue();
        System.out.println("CRC32: " + crc32Checksum);
    }

}

El resultado en consola es el siguiente:

Adler32 and CRC32 checksums for c:/developer/temp/file.txt
Adler32: 886210483
CRC32: 1950567299

Cualquiera modificación que hagamos en el archivo producirá un checksum diferente lo que indica que el archivo a sido modificado o está corrupto.

Otras clases que nos ayudarán a calcular la suma de verificación de un Stream de entrada o salida son: CheckedInputStream y CheckedOutputStream respectivamente, utilizaremos estas clases cuando deseemos ir calculando el checksum a medida que escribimos o leemos el archivo.

String file = "c:/developer/temp/file.txt";

FileInputStream fis = new FileInputStream(file);
CheckedInputStream cis = new CheckedInputStream(fis, new CRC32());

int b = 0;
while ((b = cis.read()) != -1) {
    long checksum = cis.getChecksum().getValue();
}

Cada vez que llamemos al método read() o write() se actualizará la suma de verificación, al leer al archivo completo tendremos el mismo resultado logrado con el código anterior.

Comentarios

Entradas populares de este blog

Conectar SQL Server con Java

Gauss Seidel y Jacobi

Entrenar OpenCV en Detección de Objetos

Procesamiento de imágenes en OpenCV

Acceso a la webcam con OpenCV