Skip to content

Por qué los hashes rápidos son peligrosos para las contraseñas

MD5 y SHA-1 caen en segundos ante una GPU porque son rápidos y a menudo sin sal. Descubre por qué los KDF lentos como bcrypt y Argon2 resisten, y qué deben hacer los defensores.

Publicado el 3 min de lectura

No todos los hashes son objetivos iguales. El factor más determinante para saber si una base de datos de contraseñas robada se descifra en una tarde o permanece segura durante años es la velocidad del algoritmo de hash. Suena al revés —¿no debería ser bueno que sea rápido?—, pero para el almacenamiento de contraseñas, la rapidez es precisamente el problema.

La velocidad es la aliada del atacante

Un hash criptográfico como MD5 o SHA-1 se diseñó para ser rápido: para verificar un archivo o firmar un mensaje conviene que el resumen se calcule al instante. Esa misma rapidez es un regalo para el atacante. Una GPU moderna calcula miles de millones de hashes MD5 por segundo. Cuando el algoritmo es rápido, el cuello de botella desaparece, y el atacante solo está limitado por cuántas conjeturas puede generar.

Empeóralo dejando el hash sin sal y ocurren dos cosas. Primero, contraseñas idénticas producen resúmenes idénticos, así que descifrar una cuenta descifra todas las que reutilizaban la contraseña. Segundo, el atacante puede recurrir a rainbow tables precalculadas: enormes archivos de búsqueda que cambian almacenamiento por la inversión instantánea de resúmenes comunes. Un MD5 sin sal de una contraseña débil está, en la práctica, ya roto antes de que empiece el ataque.

hashcat -m 0 -a 0 dump.txt rockyou.txt

Apunta eso a una lista de hashes MD5 sin sal y las contraseñas comunes caen en segundos.

Las sales ayudan, pero no bastan

Añadir una sal —un valor aleatorio único mezclado con cada contraseña antes del hash— resuelve el problema de las rainbow tables. Cada resumen se vuelve único, el precálculo se vuelve inútil y el atacante debe atacar cada hash por separado. Es una mejora genuina. Pero una sal no ralentiza una sola conjetura. Frente a un MD5 con sal pero rápido, la GPU sigue arrasando con miles de millones de intentos por segundo; el atacante solo ha perdido el atajo, no la velocidad.

Los KDF lentos y exigentes en memoria resisten por diseño

La verdadera defensa es hacer que cada conjetura sea cara a propósito. Las funciones de hash de contraseñas como bcrypt, sha512crypt, md5crypt y el moderno Argon2 son funciones de derivación de clave construidas en torno a un factor de coste ajustable. En lugar de una sola operación rápida, realizan miles de iteraciones, y Argon2 exige además grandes cantidades de memoria, lo que neutraliza el paralelismo de una GPU.

Un hash bcrypt con coste 12 puede tardar un cuarto de segundo en calcularse. Eso es imperceptible para un usuario que inicia sesión, pero hunde el rendimiento del atacante de miles de millones por segundo a unos pocos miles. El mismo diccionario que vacía una base MD5 en segundos tardaría siglos contra un bcrypt bien ajustado.

Conclusiones para los defensores

Si almacenas contraseñas, las reglas son breves. Nunca uses MD5 ni SHA-1 en bruto para credenciales. Sala siempre, pero trata la sal como un mínimo, no como la solución. Elige un KDF lento y exigente en memoria (Argon2id cuando puedas, bcrypt o sha512crypt en su defecto) y aumenta el factor de coste a medida que el hardware se acelera. Cuando necesites confirmar qué algoritmo usa realmente un hash filtrado, el índice de tipos de hash y la guía anterior sobre cómo identificar un hash desconocido te lo dirán en segundos, de forma privada, en tu navegador.

Artículos relacionados

Comparación práctica de hashcat y John the Ripper: fortalezas en GPU y CPU, detección automática, modos -m, formatos jumbo, diccionarios y reglas, con comandos de ejemplo.
¿Tienes un hash misterioso? Aprende las señales que revelan su tipo —longitud, conjunto de caracteres y prefijos como $2y$ o $6$— e identifícalo de forma privada en tu navegador.