Aprovechando las múltiples ventajas que nos brinda Internet, hoy en día gran parte del software que corre en nuestros equipos de escritorio y servidores se distribuye a través de Internet. Esto nos brinda la posibilidad de disponer de la versión más reciente de cualquier programa muy fácilmente. El inconveniente radica en que si alguien llega a comprometer el servidor donde se alojan los archivos, podrá también distribuir versiones adulteradas de los mismos con código malicioso. Ahí es donde entran las funciones hash en escena, el tema de nuestro post de hoy.
Las funciones hash
Un hash puede considerse como un tipo de firma digital que identifica a un archivo o flujo de texto. La más mínima modificación provocará un cambio en el hash, alertando de la probabilidad de una adulteración maliciosa.
Por razones obvias, el servidor donde tenemos almacenados los archivos que queremos distribuir debe estar separado del servidor web donde exponemos el hash de los mismos.
Hay distintos tipos de hashes, cada uno basado en distintos algoritmos que los calculan. Por mucho tiempo, el algoritmo MD5 fue el estándar en Linux, pero luego de descubrirse varias vulnerabilidades se optó por utilizar el algoritmo SHA-2. Este algoritmo es implementado por varias utilidades provistas por el paquete base coreutils.
Comparemos el resultado de cambiar un solo caracter en un flujo de texto, en este caso el acento de una letra en mi apellido (ver la Fig. 1). El número ABC en shaABCsum es el tamaño en bits del mensaje resultante (comúnmente llamado digest):
[pastacode lang=»bash» manual=»echo%20%22Soy%20Gabriel%20Canepa%22%20%7C%20sha256sum%0Aecho%20%22Soy%20Gabriel%20C%C3%A1nepa%22%20%7C%20sha256sum%0Aecho%20%22Soy%20Gabriel%20Canepa%22%20%7C%20sha512sum%0Aecho%20%22Soy%20Gabriel%20C%C3%A1nepa%22%20%7C%20sha512sum» message=»» highlight=»» provider=»manual»/]
Otro ejemplo claro de la utilidad de las funciones hash en la práctica se encuentra en la página de descargas de Ubuntu. Los hashes SHA-256 de Xenial (versión 16.04) están disponibles en este link. Si optamos por descargar la .iso de la versión 16.04.1 de 32 bits (arquitectura i386) de Ubuntu server, podremos luego comparar el hash que se muestra en la Fig. 2 con el resultado del siguiente comando:
[pastacode lang=»bash» manual=»sha256sum%20ubuntu-16.04.1-server-i386.iso» message=»» highlight=»» provider=»manual»/]
De esta manera, al comparar el resultado de la función hash con el valor esperado se puede determinar la integridad de los datos o del archivo descargados. Cabe aclarar que no es posible reproducir el digest resultante con dos archivos lógicamente diferentes.
Espero que este post les sirva de utilidad tanto al compartir archivos como al descargarlos seguramente. ¡Hasta pronto!