Glosario
¿Qué es el hashing de contraseñas? Almacenar contraseñas con seguridad mediante una transformación de un solo sentido
El hashing de contraseñas las almacena con una transformación de un solo sentido irreversible. La diferencia con el cifrado, por qué MD5/SHA-256 a secas no basta y la respuesta correcta: una sal por usuario más un hash lento (bcrypt, Argon2, scrypt).
«Nunca guardes 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.
Las dos soluciones
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.
La visión de este sitio: no lo construyas tú mismo
«Seguro que MD5 más una sal es suficiente»: esa es la trampa clásica. 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.
Sigue leyendo
- Glosario: qué es una sal (el «condimento» 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
FAQ
Q¿En qué se diferencia el hashing del cifrado?
El cifrado es reversible: con la clave puedes descifrar los datos de vuelta, que es lo que quieres para datos que volverás a leer. El hashing es de un solo sentido: no se puede revertir. En realidad no necesitas poder volver a leer una contraseña, ni siquiera tú, así que un hash deliberadamente irreversible encaja. Aunque roben la base de datos, no puedes extraer las contraseñas originales directamente de los hashes.
Q¿Es bastante seguro hacer hashing con MD5 o SHA-256?
No, no por sí solos. MD5/SHA-256 son hashes 'rápidos', así que un atacante puede probar un número enorme de conjeturas por segundo, y las contraseñas comunes caen ante la fuerza bruta o las tablas arcoíris (tablas de búsqueda precalculadas). Para hacerlo seguro, añade una 'sal' por usuario y usa un hash deliberadamente lento y diseñado a propósito (bcrypt, Argon2 o scrypt).
Q¿Cuál debería usar en la práctica?
Para sistemas nuevos, Argon2 (sobre todo Argon2id) es la primera opción, con bcrypt o scrypt como alternativas sólidas. Todos integran en su diseño el salteo y un factor de coste ajustable. En lugar de montar MD5+sal tú mismo, usa estas implementaciones estándar (las funciones oficiales de tu lenguaje/framework): es más seguro y más fiable.