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. En una implementación correcta, la contraseña en sí nunca se registra en el almacenamiento del servidor.

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): los datos filtrados contenían 153 millones de cuentas (según Have I Been Pwned). 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): se filtraron en texto plano las contraseñas de más de 32 millones de cuentas (TechCrunch, diciembre de 2009). La lista filtrada circuló como el archivo de diccionario rockyou.txt y se convirtió en el listado de referencia para el cracking de contraseñas desde la década de 2010
  • Facebook (2019): la empresa anunció en marzo de 2019 que cientos de millones de contraseñas habían sido registradas en texto plano en sistemas internos y que no hubo filtración externa. Según la prensa de entonces, los empleados podían buscarlas

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 GPU de consumo de la década de 2020 calculan hashes MD5 a gran velocidad, así que las contraseñas cortas pueden caer por fuerza bruta en poco tiempo.

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 (una cantidad enorme de cálculos) se vuelve prácticamente imposible.

Argon2 - un diseño que también ajusta la memoria

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. Cuando cada cálculo de hash exige mucha memoria, los ataques con GPU, que alinean gran cantidad de unidades de cálculo pequeñas, dejan de resultar rentables. La especificación se documentó como RFC 9106 en 2021.

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 puede no comprender 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.

Términos del glosario relacionados

Función hash Función unidireccional que convierte datos de cualquier longitud en un valor de longitud fija. Se usa para almacenar contraseñas y verificar integridad de datos. Cifrado Tecnología que convierte datos a un formato ilegible por terceros. A diferencia del hashing, permite el descifrado (reversión). Autenticación de dos factores Sistema que autentica con un segundo factor además de la contraseña. Mitiga el daño en caso de filtración de contraseñas. Passkey Método de autenticación sin contraseña. Basado en criptografía de clave pública, no almacena información secreta en el servidor. Dirección IP Identificador de dispositivos en la red. Se usa para identificar el origen de accesos no autorizados tras filtraciones de contraseñas.

Preguntas frecuentes

¿Qué es el hash de contraseñas?

El hash de contraseñas es una transformación matemática unidireccional que convierte una contraseña en una cadena de caracteres de longitud fija. A diferencia del cifrado, el hash no puede revertirse. Cuando inicias sesión, el sistema aplica el hash a tu entrada y lo compara con el hash almacenado, en lugar de guardar tu contraseña real.

¿Cuál es la diferencia entre bcrypt y MD5?

MD5 es un hash rápido de propósito general que puede calcular miles de millones de hashes por segundo, lo que hace trivial su crackeo con hardware moderno. bcrypt está diseñado específicamente para contraseñas con un factor de coste configurable que lo hace deliberadamente lento, tardando cientos de milisegundos por hash para resistir ataques de fuerza bruta.

¿Qué pasa si un restablecimiento de contraseña me envía mi contraseña original?

Si un servicio te envía tu contraseña real en un correo de restablecimiento, significa que almacena las contraseñas en texto plano o con cifrado reversible, lo cual es un fallo de seguridad grave. Deberías cambiar tu contraseña de inmediato, evitar reutilizarla en otros sitios y plantearte si seguir usando ese servicio.