generar sal cifrarlo con AES usando la contraseña del usuario como clave guardar
La sal y el hash encriptados
Podrías hacer esto y sería una sal efectiva, sin embargo, en realidad no sería más seguro que solo usar una sal regular.
Consideremos dos vectores de ataque:
Colisiones de contraseñas
Obviamente, no queremos que dos usuarios con la misma contraseña tengan la misma contraseña hash. Para evitar esto, utilizamos un valor aleatorio de sal y asumimos que la probabilidad de que dos usuarios con la misma contraseña y el mismo valor aleatorio de sal sea efectivamente 0.
Sin embargo, si dos usuarios tienen la misma contraseña y coincidentemente la misma sal, tendrán el mismo hash, independientemente de si la sal está cifrada con su contraseña o no está cifrada en absoluto. Por lo tanto, al cifrar la sal, no es menos probable que ocurra una colisión en la sal . Los únicos factores que lo hacen menos probable es la calidad de los valores aleatorios utilizados para la sal y el número de bits.
Ataques de fuerza bruta
Si un atacante está intentando un ataque de fuerza bruta y ha cifrado la sal, el único paso adicional que tienen que hacer es descifrar la sal almacenada en cada iteración y usarla para producir el hash que comparó con la contraseña hash para ver si tienen un partido.
Esto requiere un poco más de esfuerzo por parte de un atacante, pero cuando se trata de criptografía, hacer que algo tome solo dos o tres veces más no es significativo. Si Brute forzar una contraseña ahora toma 3 días en lugar de 2, realmente no la ha hecho mucho más segura. Si está tratando de hacer que algo sea seguro, quiere que se tarde 5000 años en lugar de 2 días.
Si quieres reducir los ataques de fuerza bruta, es mejor que repitas el proceso de hashing decenas de miles de veces o que utilices una función de hash diseñada específicamente para ser computacionalmente lenta.