Original article: MD5 vs SHA-1 vs SHA-2 - Which is the Most Secure Encryption Hash and How to Check Them

¿Qué es una función hash?

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

  • es muy rápido
  • puede regresar un enorme rango de valores hash
  • genera un hash único para cada entrada única (sin colisiones)
  • genera valores hash disimilares para valores de entrada similares
  • valores de hash generados no tienen un patrón discernible en su distribución

Ninguna función de hash ideal existe, por supuesto, pero cada uno apunta en operar tan cerca de lo ideal como sea posible. Sabiendo que (la mayoría) de las funciones hash regresan valores de longitudes fijadas y el rango de valores es, por lo tanto, restringido, esa restricción puede ser prácticamente ignorada. El número de valores posibles que pueden ser regresados por una función hash de 256-bit, por ejemplo, es aproximadamente el mismo que el número de átomos en el universo.

Idealmente, una función hash prácticamente no regresa colisiones – eso quiere decir, dos entradas distintas no generan el mismo valor de hash. Esto es particularmente importante para funciones de hash criptográficos: las colisiones de hash son considerados una vulnerabilidad.

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

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

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

1. 2e87284d245c2aae1c74fa4c50a74c77
2. c17b6e9b160cda0cf583e89ec7b7fc22

Se generaron dos hashes muy distintos para dos frases similares, lo que es una propiedad útil tanto para la validación como para la criptografía. Esto es un corolario de distribución: los valores hash de todas las entradas deberían ser esparcidas igualmente e impredeciblemente a lo largo de todo el rango de valores hash posibles.

Funciones hash comúnes

Hay varias funciones de hash que son ampliamente utilizados. Todos fueron diseñados por matemáticos y científicos de computación. En el transcurso de nueva investigación, algunos han mostrado tener debilidades, aunque todas son consideradas lo suficientemente buenas para aplicaciones nocriptográficas.

MD5

La función de hash MD5 produce un valor de hash de 128-bit. Fue diseñado para uso en criptografía, pero las vulnerabilidades fueron descubiertas en el transcurso del tiempo, así que ya no es recomendada para ese propósito. Sin embargo, todavía es usado para particionamiento de base de datos y sumas de control de computación para validar transferencias de archivos.

SHA-1

SHA significa (Secure Hash Algorithm) Algoritmo de Hash Seguro. La primera versión del algoritmo fue SHA-1, y luego seguido por SHA-2 (ver abajo).

Mientras que MD5 produce un hash de 128-bit, SHA1 genera un hash de 160-bit (20 bytes). En formato hexadecimal, es un entero de 40 dígitos de largo. Como MD5, fue diseñado para aplicaciones de criptología, pero pronto se le encontró vulnerabilidades también. Hoy en día, ya no es considerado ser menos resistente de atacar que MD5.

SHA-2

La segunda versión de SHA, llamado SHA-2, tiene muchas variantes. Probablemente, el más comunmente usado es SHA-256, el cual el Instituto Nacional de Estándares y Tecnología (NIST) lo recomienda usar en vez de MD5 o SHA-1.

El algoritmo SHA-256 regresa un valor de hash de 256-bits, o 64 dígitos hexadecimales. Mientras que no es muy perfecto, investigaciones recientes indican que es considerablemente más seguro que MD5 o SHA-1.  

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

SHA-3

Este método de hash fue desarrollado a finales de 2015, y aún no habido un uso generalizado. Su algoritmo no está relacionado con el que es usado por su predecesor, SHA-2.

El algoritmo SHA-3-256 es una variante con aplicabilidad equivalente al SHA-256 anterior, con el primero tomando un poco más de tiempo de calcular que el último.

Usando valores de Hash para validación

Un uso típico de las funciones hash es hacer verificaciones de validaciones. Un uso frecuente es la validación de colecciones comprimidas de archivos, tales como archivos .zip o .tar.

Dado un archivo y su valor de hash esperado (comúnmente referido como una suma de control), puedes hacer tu propio cálculo de hash para validar que el archivo que recibiste está completo y no corrupto.

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

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

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

Get-FileHash tarfile.tar -Algorithm MD5

La suma de control generado puede ser posteado en el sitio de descarga, al lado del enlace de descarga del archivo. El receptor, una vez que hayan descargado el archivo, puede validar si vino correctamente ejecutando el siguiente comando:

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

donde 2e87284d245c2aae1c74fa4c50a74c77 es la suma de control generado que fue posteado. La ejecución exitosa del comando de arriba generará un estado OK como este:

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