Integridad de archivos en sistemas GNU/Linux y Unix

En este artículo voy a explicar cómo podemos saber si un fichero ha sido alterado, o comprobar si se trata del mismo archivo que esperamos que sea. Casi todos los sistemas operativos GNU ya vienen de serie con software para manejar algoritmos de reducción criptográfica como MD5. Podremos debatir sobre si se trata del mejor algoritmo o no, pero no es el objetivo de este post. Así pues, aprovechemos la ocasión ya que probablemente no tengamos que instalar nada en nuestra máquina.

Para este ejemplo, lo primero que haremos es crear un archivo de texto plano con una frase cualquiera.

cat archivo.txt
Este archivo es de prueba.

Ahora ejecutamos el comando md5sum al que le pasaremos como argumento el nombre del archivo. Esto nos devolverá un valor alfanumérico único.

md5sum archivo.txt
ae2e5a6e2d2067069248e928cc8dddb1  archivo.txt

Si estuviéramos en un sistema Unix como Solaris tendríamos que ejecutar el comando digest con la opcion -a para indicar el tipo de algoritmo, en este caso MD5:

digest -a md5 archivo.txt
ae2e5a6e2d2067069248e928cc8dddb1

Como podemos observar, la cadena resultante es la misma en un sistema GNU/Linux que en Solaris. Bien, ahora vamos a modificar el contenido del archivo y veamos que pasa. Vamos a cambiar el punto del final por una exclamación.

cat archivo.txt
Este archivo es de prueba!

Repetimos el proceso anterior para ver su cadena md5 y... voilà.

Linux

md5sum archivo.txt
398d5ec7a57375dce2657ff0fd8fd53e  archivo.txt

Solaris

digest -a md5 archivo.txt
398d5ec7a57375dce2657ff0fd8fd53e

La cadena alfanumérica MD5 ha cambiado.

- "¿Y para que me sirve todo esto?"

Supongamos que tienes un archivo que quieres compartir y lo subes a internet para que la gente lo descargue. Esta cadena alfanumérica sería algo así como el DNI de ese archivo, la matrícula, el certificado que verifica que el archivo original es este y solamente este. Cualquier modificación en el interior del archivo, sea cual sea, un punto, una coma, un espacio, hará que cambie esta cadena MD5.

Aunque con esto ya sería suficiente para comprobar que un archivo ha sido manipulado de algún modo, es posible pasar esta cadena resultante por otro algoritmo de cifrado como base64, por ejemplo con openssl. Esta sería el método en cualquier sistema operativo GNU/Linux y Unix:

Linux

md5sum archivo.txt | awk '{print $1}' | openssl enc -base64
Mzk4ZDVlYzdhNTczNzVkY2UyNjU3ZmYwZmQ4ZmQ1M2UK

Solaris

digest -a md5 archivo.txt | openssl enc -base64
Mzk4ZDVlYzdhNTczNzVkY2UyNjU3ZmYwZmQ4ZmQ1M2UK

Notese que en el caso de GNU/Linux he tenido que meter un awk '{print $1}' para quedarme solo con la parte de la cadena MD5, cosa que en Solaris no es necesario.