¿Una sal de contraseña debe mantenerse en secreto?
Respuesta breve
No. Una sal es un valor aleatorio único almacenado justo al lado del hash; su función es lograr que contraseñas idénticas produzcan hashes distintos y anular las rainbow tables precalculadas — no permanecer en secreto. Es normal que un atacante que roba la base obtenga también las sales. Lo que protege de verdad las contraseñas es un hash lento y salado (bcrypt, scrypt, Argon2). Una «pimienta» secreta opcional y separada es un concepto diferente.
Los candidatos suelen suponer que una sal es una especie de clave secreta que hay que ocultar. No lo es, y tratarla así revela un malentendido sobre lo que realmente hace el salado.
Para qué sirve una sal
Una sal es un valor aleatorio único generado por contraseña y almacenado en claro justo al lado del hash resultante. Su único propósito es garantizar que dos usuarios con la misma contraseña produzcan hashes distintos, y dejar inútiles los ataques precalculados — las rainbow tables. Una rainbow table se construye de antemano contra hashes sin salar; si cada contraseña tiene su propia sal aleatoria, el atacante necesitaría una tabla distinta por sal, lo que destruye la rentabilidad del precálculo.
Por qué el secreto no es la cuestión
Como la sal vive junto al hash, un atacante que roba tu base obtiene también las sales. Eso es esperable y no supone problema. La sal no hace más difícil verificar un solo intento — hace impracticables los ataques masivos sobre muchas cuentas, ya que cada contraseña candidata debe re-hashearse contra la sal de cada usuario en lugar de buscarse una sola vez. El secreto nunca fue el mecanismo.
Lo que realmente protege las contraseñas
La protección real viene de un hash lento, salado y adaptativo: bcrypt, scrypt o Argon2 (Argon2id es la recomendación moderna). Consumen deliberadamente CPU y memoria para que cada intento sea costoso, ralentizando el descifrado fuera de línea hasta el extremo. Un hash rápido de propósito general como SHA-256, aun salado, puede probarse miles de millones de veces por segundo en una GPU.
La pimienta: un concepto diferente
Sí existe un secreto en este ámbito — la pimienta — pero es distinto de la sal. Una pimienta es un único valor secreto de todo el sitio, mezclado antes o después del hasheo y almacenado fuera de la base (por ejemplo, en un HSM o la configuración de la app). Como no está en el volcado robado, añade protección justo cuando la base se filtra. Confundir sal con pimienta es el corazón de esta trampa: la sal es aleatoriedad pública por registro; la pimienta es un secreto global oculto.
Posibles preguntas de seguimiento
- ¿Qué es una pimienta y en qué se diferencia de una sal?
- ¿Por qué una sal única por usuario anula las rainbow tables precalculadas?
- ¿Por qué un hash rápido como SHA-256 no basta para almacenar contraseñas?