Si usa la contraseña como "sal", entonces no está usando sal en absoluto; simplemente hashsh la contraseña.
Si dos usuarios eligen la misma contraseña, terminan con la misma contraseña hash. Eso es lo que a menudo se dice como si explicara el problema, pero parece que la mayoría de las personas se equivocan. Imaginan que esto significa "colisión", lo cual, por alguna razón, es considerado por muchos como una mala palabra cuando se habla de hashing de contraseñas. Pero eso es incorrecto, y no el punto.
El punto es determinismo . Supongamos que, indiscriminadamente, tomo una copia de las contraseñas de hash para 1000 usuarios (por ejemplo, recuperé una cinta de copia de seguridad antigua de su contenedor de basura). Luego puedo "probar" las contraseñas potenciales: padezco una contraseña potencial (usando la contraseña misma como "sal") y luego busco el valor entre los 1000 valores hash. Esto significa que al pagar el precio computacional de un hashing, realmente trato de mil usuarios + contraseñas por contraseña. Estoy atacando mil contraseñas de hash en paralelo, por el mismo costo que atacar a una sola. Este tipo de paralelismo puede expresarse bajo varias formas, incluidas las tablas de arco iris.
Realmente lo preferimos cuando atacar 1000 contraseñas de hash cuesta 1000 veces el costo de atacar 1 contraseña de hash. Para hacer eso, necesita sales reales, es decir, sales que son distintas para usuarios distintos, incluso cuando usan la misma contraseña, y, en realidad, cuando potencialmente usan la misma contraseña. Cuando no hay sal real, el ataque paralelo funciona no porque algunos usuarios elijan la misma contraseña, sino porque si hubieran elegido la misma contraseña entonces habrían obtenido el mismo valor hash. Realmente no necesitan elegir la misma contraseña para desencadenar la debilidad.
Usar el nombre de usuario como sal es mucho mejor. No es bueno, fíjate; pero aun mejor Lo que es aún mejor, hasta el punto de ser realmente decente, es usar sales aleatorias.