Qué es el salting de contraseñas
En la lección anterior vimos que las contraseñas no se guardan tal cual, sino como huellas de hash. Pero ¿qué pasa si dos personas usan por casualidad la misma contraseña? La misma entrada da la misma huella, así que en la lista guardada aparecen dos valores idénticos uno al lado del otro. Aunque no se sepa la contraseña, se nota que las dos son iguales. Para cerrar ese hueco se mezcla una pizca de un valor distinto para cada persona, y a eso se le llama sal.
La misma contraseña da el mismo hash
Un hash siempre da el mismo resultado para la misma entrada. Eso es lo que permitía comparar la huella de un intento de inicio de sesión con la huella guardada. Pero esta propiedad tiene una sombra.
Si dos personas usan la misma contraseña, sus hashes también salen iguales. Cuando hay valores idénticos uno al lado del otro en la lista de hashes guardados, se filtra que las dos contraseñas coinciden, aunque no se filtre la contraseña. Si se llega a conocer la contraseña de una persona, también se conoce la de cualquiera con el mismo hash.
Elige las contraseñas de las dos personas iguales o distintas. Si coinciden, los hashes guardados aparecen idénticos, uno al lado del otro.
Al elegir la misma contraseña, los dos hashes salieron idénticos. Basta mirar los hashes para ver que son iguales. Aprendimos que un hash no se puede calcular al revés, pero eso no cambia que el mismo valor dé el mismo hash.
Entonces, ¿qué pasa si alguien calcula de antemano el hash de las contraseñas comunes y las apunta en una lista?
¿Por qué es peligrosa una tabla hecha de antemano?
Las contraseñas que la gente usa a menudo son menos variadas de lo que parece. Por eso se puede preparar de antemano una tabla que recoja esas contraseñas con sus hashes, una por línea. Con una tabla así, los hashes de un almacén robado se buscan en ella y las contraseñas originales salen al instante.
No se descifra el hash al revés: se compara con respuestas apuntadas de antemano. Lo más peligroso es que una sola tabla sirve para comparar a la vez una cantidad enorme de hashes. A una versión hábilmente comprimida de este tipo de tabla se le llama tabla arcoíris.
Toca los hashes guardados uno por uno. Si el mismo hash está en la tabla escrita de antemano, la contraseña queda expuesta; si no está, la suposición queda bloqueada.
Los hashes que coincidían con la tabla dejaron a la vista la contraseña de la columna de al lado, y el que no estaba en la tabla bloqueó la suposición. La raíz del peligro es que la misma contraseña se convierte siempre en el mismo hash.
Eso también muestra cómo evitarlo. Si la misma contraseña da un hash distinto para cada persona, ninguna tabla hecha de antemano puede coincidir. Ese método es la sal.
Añadir sal a la contraseña
La sal es un valor corto elegido al azar para cada persona. Se crea cuando la persona se registra, y en lugar de calcular el hash de la contraseña tal cual, el sistema le añade la sal de esa persona y calcula el hash de la combinación.
La sal no es un secreto, así que se guarda justo al lado del hash. Al iniciar sesión hay que volver a añadir la misma sal para obtener la misma huella. La sal tiene un solo trabajo: hacer que el hash sea distinto para cada persona.
Pulsa el botón de añadir sal. Las dos personas tienen la misma contraseña, pero sus sales son distintas, así que las entradas combinadas y los hashes salen diferentes.
Al añadir la sal cambió la entrada que va al hash. Aunque la contraseña sea la misma, una sal distinta significa ingredientes distintos, y un hash cambia por completo cuando la entrada cambia aunque sea un poco. Así que sales distintas solo pueden dar hashes distintos.
Ahora apaguemos y encendamos la sal para comparar cómo se ven los hashes guardados de dos personas con la misma contraseña.
Incluso la misma contraseña da un hash distinto
Sin sal, las dos contraseñas idénticas tenían hashes idénticos. Con sal, los hashes guardados son distintos aunque las dos contraseñas sean iguales. Mirar la lista de hashes ya no revela quién comparte contraseña.
La tabla hecha de antemano también pierde su fuerza. Se hizo con contraseñas sin sal, así que no coincide con los hashes con sal. Para usar una tabla, el atacante tendría que hacer una nueva para cada sal, es decir, para cada persona, y en la práctica deja de servir.
Apaga y enciende la sal para comparar. Apagada, la misma contraseña da el mismo hash; encendida, hasta la misma contraseña da hashes distintos y la tabla hecha de antemano deja de coincidir.
Al encender la sal, los dos hashes idénticos se separaron en valores distintos, y la tabla hecha de antemano dejó de coincidir. Una pequeña pizca bloqueó dos cosas a la vez: descubrir contraseñas compartidas a partir de los hashes guardados y buscar contraseñas comunes en una tabla.
Pero la sal no lo detiene todo. Un atacante todavía puede apuntar a una sola persona, añadir su sal a contraseñas comunes y probarlas una por una. Por eso la sal debe usarse junto con un hash lento a propósito y contraseñas largas difíciles de adivinar.
Resumen
En resumen, la misma contraseña da el mismo hash, así que los hashes guardados pueden revelar contraseñas compartidas y una tabla hecha de antemano puede descubrir contraseñas comunes. Para evitarlo, se añade a la contraseña una sal aleatoria, distinta para cada persona, antes de calcular el hash.
La sal no es un secreto; solo tiene que ser distinta para cada persona. Con sal, hasta la misma contraseña da hashes distintos, y las tablas hechas de antemano pierden su fuerza.
Toca los puntos clave en orden para repasar. (misma contraseña, mismo hash → el peligro de una tabla hecha de antemano → añadir una sal por persona → hasta la misma contraseña, un hash distinto)
Ahora sabes por qué la misma contraseña es una trampa y cómo una pizca de sal la cierra. Llama la atención que la defensa se refuerce sin esconder ningún secreto nuevo, solo haciendo que el valor de cada persona sea distinto.
Hasta aquí hemos visto cómo guardar contraseñas de forma segura. Pero ¿basta una contraseña para demostrar quién eres? La próxima lección, sobre autenticación, trata de las muchas formas, además de las contraseñas, de demostrar que eres tú. Una contraseña es solo algo que sabes; algo que tienes y algo que eres también sirven como prueba.