Saltar al contenido principal

Hash de contraseñas - Almacenamiento irreversible de credenciales

Lectura de 2 min aprox.

El hash de contraseñas es una técnica que convierte la contraseña del usuario en un valor irreversible de longitud fija antes de almacenarla en una base de datos. Aunque la base de datos sufra una filtración, la contraseña original no se puede recuperar a partir del valor hash, por lo que el daño se puede reducir al mínimo. Almacenar las contraseñas en texto plano es un grave error de diseño que no se admite según los estándares de seguridad modernos.

Los peligros del almacenamiento en texto plano

El peligro de almacenar contraseñas en texto plano (como la cadena tal cual) ha quedado demostrado por grandes incidentes del pasado. En la filtración de RockYou de 2009 se filtraron unos 32 millones de contraseñas en texto plano. En el momento en que los atacantes obtuvieron la base de datos, tenían la contraseña de cada usuario, y los usuarios que reutilizaban sus contraseñas sufrieron daños también en otros servicios. Este incidente es un caso emblemático que mostró al mundo lo catastróficas que pueden ser las consecuencias de almacenar contraseñas en texto plano. Explicamos en detalle cómo responder ante una filtración de datos en la guía de respuesta ante filtraciones de datos.

Visión general del hash de contraseñas

Introducción de la contraseña
Añadir sal
Estiramiento (de miles a decenas de miles de iteraciones)
Guardar el valor hash en la BD

Por qué los hashes de uso general no son adecuados para contraseñas

SHA-256 y SHA-512 son funciones hash criptográficamente seguras, pero no son adecuadas para el hash de contraseñas. La razón es que son «demasiado rápidas». SHA-256 puede realizar miles de millones de cálculos hash por segundo, y con una GPU se acelera aún más. Para un atacante, esto significa que puede probar una enorme cantidad de contraseñas candidatas en poco tiempo. Las funciones hash específicas para contraseñas abordan este problema haciendo que el cálculo sea deliberadamente lento.

Las funciones de la sal y la pimienta

Sal

Se añade a la contraseña un valor aleatorio distinto para cada usuario antes de aplicar el hash. Incluso con la misma contraseña, una sal diferente produce un valor hash diferente, lo que neutraliza los ataques de tablas arcoíris. La sal se almacena en la base de datos junto con el valor hash.

Pimienta

Es un valor secreto común a todos los usuarios, almacenado en un lugar distinto de la base de datos (como una variable de entorno o un HSM). Aunque la base de datos se filtre, sin la pimienta no se puede recalcular el hash, por lo que actúa como una capa de defensa adicional. No obstante, como aumenta la complejidad de la gestión de claves, su adopción debe decidirse con cuidado.

El concepto de estiramiento

El estiramiento es una técnica que repite deliberadamente el cálculo del hash miles o decenas de miles de veces para prolongar el tiempo que tarda un único cálculo de hash. En el inicio de sesión de un usuario legítimo basta con un solo cálculo, por lo que un retraso de unos cientos de milisegundos está dentro de un rango aceptable; pero cuando un atacante prueba cientos de millones de contraseñas candidatas, el retraso por intento se acumula y hace que el ataque resulte inviable. Argon2 y bcrypt incorporan un mecanismo de estiramiento.

Algoritmos recomendados actualmente

A fecha de 2025, el orden de preferencia recomendado por OWASP es el siguiente.

1. Argon2id
2. bcrypt
3. scrypt
4. PBKDF2

Para sistemas nuevos, elige Argon2id. Si tu sistema existente usa bcrypt con un factor de coste de 12 o superior, no hay necesidad de apresurar una migración. Si usas MD5, SHA-1 o SHA-256 por sí solos para el hash de contraseñas, deberías migrar cuanto antes a alguno de los anteriores. Para minimizar el riesgo de una fuga de credenciales, elegir el algoritmo adecuado es esencial. Puedes aprender los fundamentos del cifrado en el artículo fundamentos del cifrado.libros sobre criptografía y seguridad de contraseñas (Amazon) también son referencias útiles para la implementación.

Errores comunes

Un error común es pensar que «si está cifrado, es seguro». El cifrado es una transformación bidireccional que se puede descifrar con la clave, y si la clave se filtra, todas las contraseñas quedan expuestas de una sola vez. El enfoque correcto para almacenar contraseñas es el hash (una transformación unidireccional). La idea de que «si mantienes la sal en secreto, la pimienta es innecesaria» también es errónea. Como la sal se almacena junto con el valor hash, queda expuesta al mismo tiempo cuando la base de datos se filtra. La pimienta se convierte en una capa de defensa adicional precisamente porque se almacena en un lugar distinto de la base de datos. Para una visión completa de la operación segura de contraseñas, consulta la guía de gestión segura de contraseñas.

Términos relacionados

¿Te resultó útil este artículo?

XHatena