Las contraseñas no se "almacenan" tal cual
Los servicios web serios no almacenan tu contraseña tal como la escribes. Lo que se almacena es un "hash" generado al pasar la contraseña por una función unidireccional (función hash). A partir del hash no se puede recuperar la contraseña original.
Al iniciar sesión, el servidor aplica el hash a la contraseña introducida y la compara con el hash almacenado. Si coinciden, la autenticación es exitosa. La contraseña en sí nunca se registra en el almacenamiento del servidor, ni siquiera por un instante.
Entonces, ¿por qué se hace algo tan indirecto? Para minimizar el daño cuando se produce una filtración de la base de datos.
El horror del almacenamiento en texto plano - incidentes reales
Cuando una empresa que almacenaba contraseñas en texto plano (como cadenas de texto sin procesar) sufre una filtración de datos, las contraseñas de todos los usuarios caen inmediatamente en manos del atacante.
- Adobe (2013): se filtraron 153 millones de cuentas. Las contraseñas estaban cifradas pero no hasheadas, usando cifrado reversible (3DES-ECB), por lo que contraseñas iguales producían el mismo texto cifrado, permitiendo descifrar masivamente mediante análisis de frecuencia
- RockYou (2009): 32 millones de contraseñas filtradas en texto plano. Estos datos todavía se usan ampliamente como diccionario para cracking de contraseñas
- Facebook (2019): se descubrió que cientos de millones de contraseñas habían sido registradas en texto plano en sistemas internos. No hubo filtración externa, pero cualquier empleado podía verlas
Si las contraseñas están hasheadas, incluso si la base de datos se filtra, lo único que obtiene el atacante son los hashes. Para conocer la contraseña original, necesitaría "invertir" el hash, lo cual es computacionalmente inviable con funciones hash adecuadas.
Evolución de las funciones hash - de MD5 a bcrypt
MD5 y SHA-1 - demasiado rápidos para ser seguros
Los primeros hashes de contraseñas usaban MD5 o SHA-1. Sin embargo, estos fueron diseñados para "calcular rápidamente", lo que los hace inadecuados para el hashing de contraseñas. Las GPUs modernas pueden calcular miles de millones de hashes MD5 por segundo, descifrando contraseñas cortas por fuerza bruta en segundos.
Salt - hashes diferentes para la misma contraseña
El salt es una cadena aleatoria que se añade a la contraseña antes de hashearla. Aunque la contraseña sea "password123", al añadir un salt diferente para cada usuario, todos los hashes resultantes son distintos. Esto invalida los ataques con tablas de hashes precalculadas (tablas rainbow).
bcrypt - una función hash intencionalmente lenta
bcrypt (1999) es una función diseñada específicamente para el hashing de contraseñas. Su característica principal es ser "intencionalmente lenta". Mediante un parámetro llamado cost factor (factor de trabajo), se puede ajustar la carga computacional, aumentando el coste a medida que mejora el rendimiento del hardware.
Si se configura para que un cálculo de hash con bcrypt tarde 100 ms, el inicio de sesión legítimo (un solo cálculo) apenas se ve afectado, pero un ataque de fuerza bruta (miles de millones de cálculos) se vuelve prácticamente imposible.
Argon2 - el estado del arte actual
Argon2 es el algoritmo ganador de la Password Hashing Competition de 2015, que permite ajustar no solo el tiempo de cálculo sino también el uso de memoria. Ofrece mayor resistencia que bcrypt contra ataques paralelos con GPU.
Si al "olvidar tu contraseña" te envían la original, es una señal de alarma
Si al restablecer tu contraseña un servicio te envía la contraseña original por correo, ese servicio almacena las contraseñas en texto plano (o con cifrado reversible). Si estuvieran hasheadas, sería imposible recuperar la contraseña original.
La implementación correcta consiste en un flujo de "establecer una nueva contraseña". Un servicio que te dice tu contraseña original es prueba de que no comprende los fundamentos de la seguridad.
Resumen
El hashing de contraseñas es una medida defensiva basada en la premisa de que "las bases de datos se filtrarán". Las funciones hash han evolucionado desde la era de MD5 hasta bcrypt y Argon2, contrarrestando continuamente el aumento de la capacidad computacional de los atacantes.
Lo que puedes hacer como usuario es usar contraseñas fuertes y diferentes para cada servicio, activar la autenticación de dos factores y, si es posible, migrar a passkeys. Así como verificas tu información de red en IP Check-san, revisa periódicamente el estado de la gestión de tus contraseñas.