Nunca deberías guardar una contraseña tal cual en la base de datos. Entonces, ¿cómo se guarda? La respuesta es el hashing. Aquí tienes cómo funciona y los puntos clave para hacerlo con seguridad (sin pasos de ataque).
Hashing ≠ cifrado
Se confunden, pero los objetivos son opuestos. El cifrado es «reversible con una clave, para poder volver a leerlo después». El hashing es «de un solo sentido: no se puede revertir». Una contraseña es información que ni siquiera el operador debería necesitar volver a leer, así que un hash deliberadamente irreversible es lo idóneo.
Cifrado (reversible)
texto plano ⇄ texto cifrado. la clave lo revierte. para datos que vuelves a leer
Hashing (un solo sentido)
contraseña → hash. no se puede revertir. para almacenar contraseñas
Al iniciar sesión, compruebas «aplica el hash a la contraseña introducida del mismo modo y mira si coincide con el hash almacenado.» Nunca necesitas recuperar el original.
Por qué «MD5/SHA-256 a secas» no basta
MD5 y SHA-256 son hashes rápidos. Esa es una propiedad útil en otros contextos, pero una debilidad para almacenar contraseñas: un atacante puede calcular un número enorme de conjeturas por segundo contra un hash filtrado.
- Tablas arcoíris: una tabla precalculada gigante de «contraseña común → su hash». Con un hash a secas, basta con buscarlo para encontrar la coincidencia.
- Fuerza bruta: cuanto más rápido el hash, más conjeturas por unidad de tiempo, es decir, más fácil de romper.
Hashes de uso general frente a hashes de contraseñas
Ambos se llaman «hashes», pero se crearon para trabajos distintos. Solo la columna de la derecha sirve para almacenar contraseñas.
| Hash de uso general (MD5, SHA-1, SHA-256) | Hash de contraseñas (Argon2id, bcrypt, scrypt, PBKDF2) | |
|---|---|---|
| Creado para | Detectar manipulación de archivos, firmas, etc. | Almacenar contraseñas |
| Velocidad | Lo más rápido posible | Deliberadamente lento (ajustable) |
| Sal | No forma parte del diseño | Forma parte del diseño (PBKDF2 la recibe de quien lo llama) |
| Ajuste del coste | No es posible | Coste, iteraciones o memoria; se aumenta con el tiempo |
| Para almacenar contraseñas | No usar | Usar |
NIST SP 800-63B-4 también exige almacenar las contraseñas con un esquema de hashing de contraseñas que reciba una sal y un factor de coste como entradas, con el coste tan alto como sea práctico sin perjudicar el rendimiento y aumentándolo con el tiempo.
Las dos salvaguardas
Añade una sal (un valor distinto por usuario)
Antes del hashing, mezcla un valor aleatorio que difiera por usuario (una sal). Ahora la misma contraseña se almacena de forma distinta para cada uno, lo que derrota las tablas arcoíris e impide que una sola ejecución de cracking cubra contraseñas reutilizadas entre cuentas.
Usa un hash deliberadamente lento y diseñado a propósito
bcrypt / Argon2 / scrypt te permiten hacer el cálculo intencionadamente costoso (un parámetro de coste). Una lentitud que nadie nota en un único inicio de sesión legítimo reduce la fuerza bruta del atacante a un ritmo impracticable. El salteo también viene integrado en ellos.
Casos reales: cuando un aviso de brecha dice «con hash»
Los anuncios de brechas a veces indican si las contraseñas se guardaban en texto plano, con hash o cifradas. Estos son casos que este sitio ha tratado, ordenados por método de almacenamiento.
| Caso | Qué se reveló sobre las contraseñas | Qué significa para los usuarios |
|---|---|---|
| Takufile-bin (2019) | Guardadas en texto plano | Legibles tal cual. Otros servicios con la misma contraseña también están en riesgo |
| Sakura Internet (2026) | Algunas contraseñas iniciales no tenían hash | Quien siga usando una contraseña inicial debe cambiarla ya |
| Gyazo (2026) | Se filtraron hashes de contraseñas; método no revelado | Según el método, podrían revertirse. La empresa pidió a los usuarios cambiar sus contraseñas |
Dos cosas a tener en cuenta al leer un aviso:
- «Con hash» por sí solo no dice si es seguro. Entre MD5 a secas y un hash lento con sal hay una diferencia enorme en lo fácil que es recuperar las contraseñas
- Si no se indica el método, actúa como si fuera débil. Cambia la contraseña en ese servicio y en cualquier otro donde uses la misma
Puedes comprobar si tu dirección de correo aparece en brechas pasadas con cómo comprobar si tu contraseña se ha filtrado.
Cómo comprobar tu propio sitio y tus cuentas
Como usuario: observa cómo funciona el restablecimiento de contraseña
Si «olvidé mi contraseña» te envía por correo tu contraseña original, el servicio muy probablemente la guarda en texto plano o en una forma reversible. No uses allí una contraseña que uses en otro sitio.
Como usuario: comprueba la fortaleza de tu contraseña
El hashing protege mejor las contraseñas largas y difíciles de adivinar. Comprueba una estimación aproximada de su fortaleza con el comprobador de fortaleza de contraseñas, y deja su almacenamiento a un gestor de contraseñas.
Como desarrollador: comprueba qué función guarda las contraseñas
Localiza las funciones que usa tu código para guardar y verificar contraseñas. password_hash() de PHP, la autenticación integrada de Django o una biblioteca de bcrypt/Argon2 son específicas para contraseñas y cubren lo básico. Cualquier llamada directa a md5(), sha1() o sha256 es candidata a migración.
Como desarrollador: comprueba los valores almacenados y la configuración
Cómo identificar los hashes almacenados, la configuración mínima de OWASP y cómo migrar desde algoritmos débiles se explican en cómo almacenar contraseñas con seguridad.
La visión de este sitio: no lo construyas tú mismo
Suponer que «MD5 más una sal es suficiente» es un error común. El almacenamiento seguro de contraseñas también depende de generar y guardar la sal, ajustar el coste y manejar las diferencias de tiempo. En lugar de montar eso tú mismo, apóyate en la función oficial de contraseñas de tu lenguaje/framework (la mayoría usan bcrypt/Argon2 por debajo). Para sistemas nuevos, haz de Argon2id tu primera opción.
Fuentes (primarias)
- NIST, "SP 800-63B-4 Digital Identity Guidelines: Authentication and Authenticator Management" (agosto de 2025) — pages.nist.gov (esquemas de hashing que reciben una sal y un factor de coste; aumentar el coste con el tiempo)
- OWASP, "Password Storage Cheat Sheet" — cheatsheetseries.owasp.org (hashing frente a cifrado, algoritmos recomendados, factor de trabajo)
- RFC 9106, "Argon2 Memory-Hard Function for Password Hashing and Proof-of-Work Applications" — rfc-editor.org
- Las fuentes de cada caso (los anuncios de las propias empresas) figuran en los artículos enlazados de este sitio
Sigue leyendo
- Glosario: qué es una sal (el valor aleatorio por usuario que derrota los ataques de reutilización)
- Aprende: cómo almacenar contraseñas con seguridad (hashing + sal en la práctica)
- Fundamentos: almacenar contraseñas correctamente (basta de texto plano) / elegir un gestor de contraseñas
- Caso: la filtración de datos de Takufile-bin (2019) (almacenamiento de contraseñas en texto plano en la práctica)