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


Tal vez pueda interesarte


Compartí este artículo