Estoy intentando entender el hashing de contraseñas. En los días en que parecía tan simple, solo MD5 (contraseña + sal) y listo. Luego se probó que md5 tuvo colisiones, por lo que las personas comenzaron a cambiarse a SHA1 y así sucesivamente.
Luego, comenzamos a hablar sobre la necesidad de crear lentitud, por lo que implementamos muchas iteraciones de nuestro algoritmo hash para que la comprobación de hash sea lo suficientemente lenta.
Lo que estoy tratando de entender es:
- ¿Por qué no se puede usar SHA512 en un algoritmo de contraseña si lo iteramos lo suficiente como para crearlo lentamente? Ejemplo es SHA512 la contraseña 100k veces.
-
¿Por qué se recomienda PBKDF2 o bcrypt en lugar de hacer lo anterior? ¿O por qué no lo es?
Esta respuesta declara que "no es para hashear una contraseña para el almacenamiento seguro con fines de autenticación". Sin embargo, esta respuesta (con muchos votos positivos) recomienda lo contrario (?); que debe usar pbkdf2 / bcrypt / scrypt para almacenar las contraseñas de forma segura.
- Si una función PBKDF2 se basa en SHA1 debajo, ¿es inherentemente insegura si se puede demostrar que SHA1 está roto? ( implementación RFC2898 .NET )
Con suerte, si alguien puede responder las preguntas anteriores, entenderé por qué un algoritmo de hash simple (siempre que sea lento) no es suficiente, y también por qué necesitamos todas estas funciones derivadas clave, aparentemente complejas, para realizar un almacenamiento de contraseña simple.