En sistemas operativos GNU/Linux, la herramienta sha256sum
, parte del paquete coreutils
, permite computar y verificar checksums SHA256. Este artículo explica, de forma simple y con ejemplos, cómo utilizarla para verificar la integridad de los archivos transmitidos por Internet.
Supongamos que se debe transmitir un archivo por Internet y se requiere verificar su integridad en el receptor. En estos casos es posible computar en el emisor un hash que será enviado junto con el archivo, para luego ser verificado en el receptor. La verificación consiste en recalcular el hash del archivo y determinar si coincide con el hash recibido. Si es así, se puede decir, con una alta probabilidad (dependiendo del algoritmo de hash utilizado), que se ha preservado la integridad del archivo durante la transmisión. Suponiendo, claro, que nadie ha manipulado el hash intencionalmente durante la transmisión, y otras consideraciones de seguridad. En este sentido, no se puede fiar ciegamente en el resultado de la verificación a través de hash, sino que es una técnica de protección más que debe ser utilizada en conjunto con otras técnicas y herramientas de protección, autenticación, autorización, etc.
En resumen, no debe ser utilizado como un mecanismo de protección de seguridad, sino como un mecanismo para garantizar la integridad cuando se transmiten datos a traves de redes inestables, o poco confiables, no desde el punto de vista de la seguridad, sino desde el punto de vista de la confiabilidad. Esto es lo que ofrecen la mayoría de las distribuciones GNU/Linux y *BSD al momento de publicar una imagen ISO, para verificar que lleguen intactas a sus destinatarios, y no se corrompan durante la descarga.
A modo de ejemplo, creo un archivo .tar.gz
comprimiendo todo el contenido del directorio /etc
de un servidor:
root@linuxito:/usr/local/tmp# tar czf etc.tar.gz /etc tar: Removing leading `/' from member names
Se supone que se desea descargar este archivo (por ejemplo a través de SFTP) y se requiere verificar su integridad.
root@linuxito:/usr/local/tmp# ls -lh total 828K -rw-r--r-- 1 root staff 826K Jan 10 12:28 etc.tar.gz
Para crear un hash SHA256 del archivo y guardarlo en un archivo con extensión .sha256
, se debe utilizar el siguiente comando:
root@linuxito:/usr/local/tmp# sha256sum etc.tar.gz > etc.tar.gz.sha256
Este comando crea el checksum del archivo pasado como parámetro. Por defecto sha256sum
vuelca la salida por salida estándar, por ello se redirige a un archivo. Por convención se utiliza el mismo nombre de archivo, agregando la extensión .sha256
:
root@linuxito:/usr/local/tmp# ls -lh total 832K -rw-r--r-- 1 root staff 826K Jan 10 12:28 etc.tar.gz -rw-r--r-- 1 root staff 77 Jan 10 12:28 etc.tar.gz.sha256
Para cada línea de salida (en caso de computar para múltiples archivos en simultáneo), además del hash indica el nombre de archivo origen. Por ejemplo:
root@linuxito:/usr/local/tmp# sha256sum /etc/init.d/a* 6dc1a93e514e1a127af95e8282bb2ade88d0f3dbb901d7efada395a7210e4107 /etc/init.d/acpid a8a144f36b006aa3e2203200dc39df8534e74dfabc4f2777b47739f484973793 /etc/init.d/apache2 52da7743f31954a5fbe1c312dd4112a671fec9efaa1f9812926a8d97543ba0e2 /etc/init.d/atd 141465675cbd2bbe8775b9f8db1e8ff9cdc9185af98192f8fe08b24cb8706be3 /etc/init.d/atop
En este caso se trata de un único archivo, por lo que la salida es el hash junto con el nombre del archivo origen:
root@linuxito:/usr/local/tmp# cat etc.tar.gz.sha256 97f731e8e5768e64eaed4656b889ff5609af92d7968574b5f135d395d002db18 etc.tar.gz
Para verificar la integridad del archivo (además de descargar el archivo se debe descargar el hash), se debe utilizar la opción -c
junto con el archivo de hashes:
root@linuxito:/usr/local/tmp# sha256sum -c etc.tar.gz.sha256 etc.tar.gz: OK
La integridad del archivo etc.tar.gz
es correcta, pues el hash recomputado coincide con el hash recibido en el archivo etc.tar.gz.sha256
.
¿Qué pasa si el archivo se corrompe durante la transmisión?
Por ejemplo, agrego unos caracteres al final del archivo:
root@linuxito:/usr/local/tmp# echo "ssssss" >> etc.tar.gz
Ahora la verificación falla y se indica claramente en la salida:
root@linuxito:/usr/local/tmp# sha256sum -c etc.tar.gz.sha256 etc.tar.gz: FAILED sha256sum: WARNING: 1 computed checksum did NOT match