Guía técnica de funciones hash: algoritmos, seguridad y buenas prácticas
Comprende el funcionamiento de los algoritmos de resumen criptográfico (SHA-256, MD5, SHA-512) y las funciones de derivación de claves para contraseñas como Bcrypt.
¿Qué es una función hash y cuáles son sus propiedades?
Una función hash criptográfica es un algoritmo matemático determinista que toma una entrada de datos de cualquier longitud (un solo carácter, un libro entero o una imagen ISO de varios gigabytes) y genera una cadena alfanumérica de longitud fija conocida como hash, digest o resumen digital.
Para que una función hash se considere criptográficamente robusta debe satisfacer tres pilares fundamentales:
- Resistencia a la preimagen (unidireccionalidad): Debe ser computacionalmente inviable reconstruir el mensaje original a partir únicamente de su valor hash resultante.
- Efecto avalancha: Cualquier cambio mínimo en el texto de entrada (como alterar una sola letra o un bit) debe producir un hash completamente diferente y sin correlación estadística visible con el anterior.
- Resistencia a colisiones: Debe ser matemáticamente improbable encontrar dos entradas distintas que generen exactamente el mismo hash de salida.
Comparativa técnica de algoritmos: cuándo utilizar cada uno
| Algoritmo | Longitud de salida | Velocidad | Estado de seguridad | Caso de uso ideal |
|---|---|---|---|---|
| SHA-256 | 256 bits (64 hex) | Muy rápida | Seguro (Estándar NIST) | Firmas digitales, blockchain, checksums de software. |
| MD5 | 128 bits (32 hex) | Ultrarrápida | Vulnerado (Colisiones) | Comprobación de descargas corruptas y caché legacy. |
| SHA-1 | 160 bits (40 hex) | Muy rápida | Obsoleto (SHAttered) | Identificadores de commits en Git y compatibilidad histórica. |
| Bcrypt | 60 caracteres ($2y$...) | Lenta y adaptable | Excelente para credenciales | Almacenamiento de contraseñas de usuarios en bases de datos. |
¿Por qué nunca debes almacenar contraseñas con SHA-256 o MD5 directo?
Uno de los errores más graves en seguridad web es guardar contraseñas de usuarios aplicándoles únicamente md5($password) o sha256($password).
Las funciones de resumen general como SHA-256 fueron concebidas para procesar megabytes por segundo en hardware estándar. Un atacante con un equipo equipado con varias tarjetas gráficas comerciales (GPU) puede probar más de 10.000 millones de contraseñas por segundo contra un hash SHA-256. Además, si dos usuarios tienen la misma contraseña ("123456"), sus hashes serán idénticos, lo que permite el uso de tablas arcoíris (rainbow tables) precalculadas para descifrar millones de cuentas en segundos.
El poder de Bcrypt: salteo automático y coste exponencial
Diseñado por Niels Provos y David Mazières en 1999 sobre el cifrado Eksblowfish, Bcrypt resuelve los problemas de las contraseñas mediante dos mecanismos clave:
- Salteo aleatorio criptográfico (Salt): Genera un salt único de 128 bits para cada contraseña. Incluso si diez usuarios tienen la misma contraseña, sus hashes Bcrypt serán totalmente distintos, neutralizando por completo las tablas arcoíris.
- Factor de coste exponencial ($2^{\text{cost}}$): Cada incremento en el valor de coste multiplica por dos el número de rondas y el tiempo de cálculo. Un coste de 10 requiere $2^{10} = 1.024$ iteraciones; un coste de 12 requiere $4.096$ iteraciones. De este modo, el hardware del atacante se ve ralentizado de forma drástica, pasando de miles de millones de intentos por segundo a unos pocos cientos, haciendo inviable la fuerza bruta.