MD5 vs SHA-1 vs SHA-2: cuál es el hash de cifrado más seguro y cómo verificarlo

¿Qué es una función hash?

Una función hash toma un valor de entrada (por ejemplo, una cadena) y devuelve un valor de longitud fija. Una función hash ideal tiene las siguientes propiedades:

  • Es muy rápido
  • puede devolver una enorme variedad de valores hash
  • genera un hash único para cada entrada única (sin colisiones)
  • genera valores hash diferentes para valores de entrada similares
  • los valores hash generados no tienen un patrón discernible en su distribución

Por supuesto, no existe una función hash ideal, pero cada una tiene como objetivo operar lo más cerca posible del ideal. Dado que (la mayoría) de las funciones hash devuelven valores de longitud fija y, por lo tanto, el rango de valores está restringido, esa restricción puede prácticamente ignorarse. El número de valores posibles que puede devolver una función hash de 256 bits, por ejemplo, es aproximadamente el mismo que el número de átomos en el universo.

Idealmente, una función hash no devuelve prácticamente ninguna colisión, es decir, no hay dos entradas diferentes que generen el mismo valor hash. Esto es particularmente importante para las funciones hash criptográficas: las colisiones hash se consideran una vulnerabilidad.

Finalmente, una función hash debería generar valores hash impredeciblemente diferentes para cualquier valor de entrada. Por ejemplo, tome las siguientes dos oraciones muy similares:

1. "The quick brown fox." 2. "The quick brown fax." 

Podemos comparar los valores hash MD5 generados a partir de cada una de las dos oraciones:

1. 2e87284d245c2aae1c74fa4c50a74c77 2. c17b6e9b160cda0cf583e89ec7b7fc22 

Se generaron dos hashes muy diferentes para dos oraciones similares, que es una propiedad útil tanto para la validación como para la criptografía. Este es un corolario de la distribución: los valores hash de todas las entradas deben distribuirse de manera uniforme e impredecible en todo el rango de posibles valores hash.

Funciones hash comunes

Hay varias funciones hash que se utilizan ampliamente. Todos fueron diseñados por matemáticos e informáticos. A lo largo de la investigación adicional, se ha demostrado que algunos tienen debilidades, aunque todos se consideran lo suficientemente buenos para aplicaciones no criptográficas.

MD5

La función hash MD5 produce un valor hash de 128 bits. Fue diseñado para su uso en criptografía, pero se descubrieron vulnerabilidades con el paso del tiempo, por lo que ya no se recomienda para ese propósito. Sin embargo, todavía se utiliza para particionar bases de datos y calcular sumas de comprobación para validar transferencias de archivos.

SHA-1

SHA son las siglas de Secure Hash Algorithm. La primera versión del algoritmo fue SHA-1, y luego fue seguida por SHA-2 (ver más abajo).

Mientras que MD5 produce un hash de 128 bits, SHA1 genera un hash de 160 bits (20 bytes). En formato hexadecimal, es un número entero de 40 dígitos. Como MD5, fue diseñado para aplicaciones de criptología, pero pronto se descubrió que también tenía vulnerabilidades. A partir de hoy, ya no se considera menos resistente al ataque que MD5.

SHA-2

La segunda versión de SHA, llamada SHA-2, tiene muchas variantes. Probablemente el más utilizado es SHA-256, que el Instituto Nacional de Estándares y Tecnología (NIST) recomienda usar en lugar de MD5 o SHA-1.

El algoritmo SHA-256 devuelve un valor hash de 256 bits o 64 dígitos hexadecimales. Si bien no es del todo perfecto, las investigaciones actuales indican que es considerablemente más seguro que MD5 o SHA-1.

En cuanto al rendimiento, un hash SHA-256 es aproximadamente un 20-30% más lento de calcular que los hash MD5 o SHA-1.

SHA-3

Este método hash se desarrolló a finales de 2015 y aún no ha tenido un uso generalizado. Su algoritmo no está relacionado con el utilizado por su predecesor, SHA-2.

El algoritmo SHA3-256 es una variante con aplicabilidad equivalente a la del anterior SHA-256, y el primero tarda un poco más en calcularse que el último.

Usar valores hash para la validación

Un uso típico de las funciones hash es realizar comprobaciones de validación. Un uso frecuente es la validación de colecciones comprimidas de archivos, como archivos de almacenamiento .zip o .tar.

Dado un archivo y su valor hash esperado (comúnmente conocido como suma de comprobación), puede realizar su propio cálculo hash para validar que el archivo que recibió está completo y sin daños.

Por ejemplo, puedo generar una suma de comprobación MD5 para un archivo tar en Unix usando los siguientes comandos canalizados:

tar cf - files | tee tarfile.tar | md5sum - 

Para obtener el hash MD5 de un archivo en Windows, use el comando Get-FileHash PowerShell:

Get-FileHash tarfile.tar -Algorithm MD5 

La suma de comprobación generada se puede publicar en el sitio de descarga, junto al enlace de descarga del archivo. El receptor, una vez que ha descargado el archivo, puede validar que se encontró correctamente ejecutando el siguiente comando:

echo '2e87284d245c2aae1c74fa4c50a74c77 tarfile.tar' | md5sum -c 

donde 2e87284d245c2aae1c74fa4c50a74c77 es la suma de comprobación generada que se registró. La ejecución exitosa del comando anterior generará un estado OK como este:

echo '2e87284d245c2aae1c74fa4c50a74c77 tarfile.tar' | md5sum -ctarfile.tar: OK