Checksum MD5 y SHA: funciones hash e integridad de datos en Linux y UNIX

por | diciembre 4, 2014

A la hora de comprobar la integridad de datos en sistemas Linux contamos con las sumas de verificación (checksum) generadas a partir de funciones hash como MD5 o del grupo SHA. El artículo presente hace un breve repaso sobre conceptos fundamentales de integridad de datos y cómo realizar esas comprobaciones en la práctica.

¿Qué entendemos por integridad de fichero?

Entenderemos por integridad que un fichero que hemos descargado es el fichero que dice ser y no ha sido modificado por terceras partes. Muchos troyanos y software malicioso podrían embeberse en software que en un principio parece legítimo pero que no lo es. Para asegurar esta integridad existen las llamadas funciones criptográficas de hash, de las cuales las más conocidas son las del grupo SHA (Secure Hash Algorithm) y MD5 (Message-Digest Algorithm 5). Existen, no obstante, muchas otras como Tiger, RIPEMD-160, etc … Los distribuidores de software legítimo y no dañino se encargan muchas veces de dejar a disposición del público el resultado de aplicar estas funciones sobre ficheros y datos, el llamado checksum o suma de verificación, para que los usuarios de dicho software puedan verificar que es legítimo.

Un checksum de un fichero es único de dicho fichero en el momento que se generó, y por ello a partir del checksum podemos determinar que dicho fichero permanece íntegro e inalterable, fuera de modificaciones.

¿Qué implica la integridad de datos?

Implica que cualquier cambio que sufran esos datos de entrada (sobre los que aplicamos las funciones de hash) produciría un checksum de salida diferente. Es el llamado efecto avalancha.

Colisiones de hash

Una colisión de hash es, en términos prácticos, una misma salida de hash (un mismo checksum) para distintas entradas. Como hemos visto anteriormente, para un fichero o dato único dado, el mensaje de hash debe ser único también, de ahí la utilidad y fiabilidad de un checksum que garantiza la integridad del fichero. La seguridad de un agoritmo hash se medirá en este sentido por la resistencia a colisiones.

En el momento en que un algoritmo a partir de distintas entradas produce una misma salida, no se puede garantizar que un dato de entrada dado único (sea un fichero o una frase, por poner unos ejemplos) produzca una salida hash única. De esta manera, la integridad de los datos no está garantizada. Por ello, en cuanto un algoritmo o función de hash se ve comprometida (por esta y otras muchas razones), la tendencia en los ámbitos de seguridad es a abandonar ese algoritmo por otro más seguro. También se puede aumentar el tamaño de salida de hash (en bits), para securizar aún más un algoritmo (por ejemplo, en el caso de SHA256 la salida seria de 256 bits, SHA512 sería 512 bits, etc …)

Entre MD5 y SHA-1 ¿Cuál es más seguro?

En un primer momento, teniendo en cuenta que a mayor nº de bits de salida, mayor seguridad:

  • MD5 produce una salida de 128 bits.
  • SHA-1 produce una salida de 160 bits.

Pero más importante que la longitud de salida es cómo está diseñado el algoritmo, la función de hash. En este sentido, SHA-1 es mucho más seguro que MD5, el cual ha sido comprometido en varias ocasiones y no se considera una función de hash segura en estos momentos. La probabilidad de colisión, además, es más elevada que en la familia SHA.

Debemos tener en cuenta, además y como dijimos anteriormente, que dentro de SHA tenemos al grupo SHA-2 que permite salidas de hash de mayor longitud y por tanto más seguras. Por ejemplo:

  • SHA-256: 256 bits de salida
  • SHA-512: 512 bits de salida

Una buena tabla comparativa con la situación actual de los algoritmos la tenemos aquí

Un ejemplo práctico

Nos dirigiremos a la página de descargas de Debian aquí.

¿Qué encontramos? Ficheros en los que se guardan las sumas de verificación de las imágenes de CD que nos ofrecen. De esta manera, comprobaremos que el software que vamos a descargar es legítimo. Entre esos ficheros encontramos:

  • MD5SUMS: checksums de MD5.
  • SHA1SUMS: checksums de SHA-1.
  • SHA256SUMS: checksums de SHA-256.
  • SHA512SUMS: checksums de SHA-512.

Si hacemos clic en los ficheros antes mencionados veremos unas largas cadenas alfanuméricas. Son los checksums de imagen:

MD5SUMS:

6813af64cc9487099210afed14a080e0 debian-7.1.0-amd64-CD-1.iso

SHA1SUMS:

a294e443f3bd09414b4c314f1328c170620f879f debian-7.1.0-amd64-CD-1.iso

SHA256SUMS:

90ca6bc40de5f5fa2c7397dc91b370f3bfc717b92d3d4a3fcd0b664b35e42fa9 debian-7.1.0-amd64-CD-1.iso

SHA512SUMS:

2255343212d3c94a9504048050afcccf1ae32c0652b941353784e71ff20d02ad27f365d0b5c379959f0d02a9a4fa242753dd9e761141633fdd2585d3c49befe9 debian-7.1.0-amd64-CD-1.iso

Vamos a descargar la imagen debian-7.1.0-amd64-CD-1.iso y los ficheros de checksums.

Una vez descargado, vamos a comprobar en Linux dichos checksums en el fichero descargado. Abrimos terminal y nos situamos en el directorio donde hemos descargado los ficheros:

md5sum debian-7.1.0-amd64-CD-1.iso

Con el resultado:

6813af64cc9487099210afed14a080e0  debian-7.1.0-amd64-CD-1.iso

Comprobamos en el fichero de MD5SUMS y ¡voila!, son iguales: el fichero mantiene su integridad.

Sin embargo, es poco productivo tener que comprobar esas largas cadenas a mano. Para ello vamos a utilizar los ficheros de checksums pasándole al comando el parámetro -c. Realizaremos las comprobaciones tanto de MD5 como de SHA:

julio@julio-CG8265:~/Downloads$ md5sum -c MD5SUMS 2> /dev/zero | grep -v FAILED
debian-7.1.0-amd64-CD-1.iso: OK

julio@julio-CG8265:~/Downloads$ sha1sum -c SHA1SUMS 2> /dev/zero | grep -v FAILED
debian-7.1.0-amd64-CD-1.iso: OK

julio@julio-CG8265:~/Downloads$ sha256sum -c SHA256SUMS 2> /dev/zero | grep -v FAILED
debian-7.1.0-amd64-CD-1.iso: OK

julio@julio-CG8265:~/Downloads$ sha512sum -c SHA512SUMS 2> /dev/zero | grep -v FAILED
debian-7.1.0-amd64-CD-1.iso: OK

Y así amigos míos, hemos comprobado por activa y por pasiva que el fichero que hemos descargado es el que dice ser, y no otro que nos estén intentando colar por la cara.

Por cierto respecto a este parte:

2> /dev/zero | grep -v FAILED

Es para evitar que salgan en terminal unos cuantos errores ya que los ficheros de checksum contienen las sumas de verificación de TODOS los ficheros de la página e intentará verificarlos. Al no haber descargado todos esos ficheros, nos encontraremos con laaaargos errores de tipo:

sha1sum: debian-7.1.0-amd64-netinst.iso: No such file or directory
debian-7.1.0-amd64-netinst.iso: FAILED open or read
sha1sum: debian-7.1.0-amd64-xfce-CD-1.iso: No such file or directory
debian-7.1.0-amd64-xfce-CD-1.iso: FAILED open or read
sha1sum: debian-update-7.1.0-amd64-CD-1.iso: No such file or directory
debian-update-7.1.0-amd64-CD-1.iso: FAILED open or read

Que evidentemente hacen referencia a los ficheros que no ha podido localizar para realizar las comprobaciones pertinentes. De esa manera que os comento tendréis una salida de resultados más … limpia.