Funciones hash explicadas de forma sencilla: MD5, SHA-1 o SHA-256 y cómo usarlas
Las sumas de comprobación de descargas, los ID de commit de Git y las direcciones de blockchain son valores hash. Esta guía explica en qué se diferencia el hash del cifrado y qué algoritmo elegir para cada tarea.
Qué es una función hash
Una función hash toma una entrada de cualquier longitud y produce un valor corto de longitud fija, llamado hash o resumen. Tanto si aplicas el hash a una palabra como a un vídeo de varios gigabytes, SHA-256 siempre devuelve 256 bits, es decir, 64 caracteres hexadecimales.
Lo fundamental es que el hash es unidireccional. No hay forma de calcular la entrada original a partir del hash. Esa es la diferencia clave con el cifrado, que se revierte con una clave, y con Base64, que cualquiera puede revertir.
Tres propiedades de un buen hash
Una función hash criptográfica usada para seguridad debe cumplir lo siguiente.
- Determinista: la misma entrada produce siempre el mismo hash.
- Efecto avalancha: cambiar un solo carácter cambia por completo el resultado, como muestra el ejemplo de abajo con hello y hello!.
- Resistencia a colisiones: debe ser prácticamente imposible encontrar dos entradas distintas con el mismo hash.
SHA-256("hello") = 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
SHA-256("hello!") = ce06092fb948d9ffac7d1a376e404b26b7575bcc11ee05a4615fef4fec3a308b
MD5("hello") = 5d41402abc4b2a76b9719d911017c592
Las mayúsculas también cuentan: Hello y hello producen hashes sin relación. Antes de comparar hashes, asegúrate de que las entradas coinciden exactamente, incluidos espacios, saltos de línea y mayúsculas.
MD5, SHA-1 y SHA-256 comparados
MD5 produce un resumen de 128 bits (32 caracteres hexadecimales). Es rápido, pero desde 2004 se conocen ataques de colisión prácticos, así que no debe usarse para seguridad. Sigue siendo aceptable como simple suma de comprobación frente a daños accidentales.
SHA-1 produce 160 bits. En 2017, investigadores de Google y del CWI publicaron dos archivos PDF distintos con el mismo hash SHA-1 (SHAttered), lo que puso fin a su uso en seguridad. Los navegadores y las autoridades de certificación ya no confían en certificados SHA-1.
SHA-256 pertenece a la familia SHA-2 y produce 256 bits. Es el estándar de facto para sumas de comprobación de software, certificados TLS y blockchains. Para sistemas nuevos, SHA-256 o superior es la opción por defecto.
Verificar archivos con sumas de comprobación
Las páginas de descarga suelen mostrar un valor SHA-256 junto al archivo. Calcula el hash del archivo descargado y compáralo: si un solo bit cambió durante la transferencia o fue manipulado, el hash será completamente distinto.
Si la suma de comprobación está alojada en el mismo servidor que el archivo, un atacante podría sustituir ambos. Por eso el software importante firma el archivo de sumas con GPG o lo publica por un canal HTTPS independiente.
Por qué SHA-256 a secas no sirve para contraseñas
Si los hashes son unidireccionales, guardar contraseñas como SHA-256 parece seguro, pero no lo es. SHA-256 está diseñado para ser rápido, y una sola GPU puede calcular miles de millones de hashes por segundo. Un atacante que robe una lista de hashes puede probar contraseñas comunes a una velocidad enorme.
Usa funciones específicas y deliberadamente lentas como bcrypt, scrypt o Argon2. Mezclan una sal aleatoria única en cada contraseña, de modo que contraseñas idénticas generan valores almacenados distintos, lo que además inutiliza las tablas arcoíris precalculadas.
¿Hash, HMAC o cifrado?
Usa el generador de hash de AIBIZAP para pasar la misma frase por varios algoritmos y ver cuánto cambia el resultado al alterar un solo carácter. Si necesitas ocultar datos y recuperarlos después, prueba el probador de cifrado AES.
- Comprobar que los datos no han cambiado: un hash SHA-256.
- Comprobar que un mensaje viene de quien tiene un secreto compartido: HMAC-SHA256 (firmas de webhooks y de peticiones de API).
- Guardar contraseñas: bcrypt, scrypt o Argon2.
- Ocultar datos y leerlos más tarde: cifrado como AES-GCM.