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
Publicar un comentario