Leí este artículo sobre el hashing de contraseñas usando bcrypt como el método recomendado . El consejo es similar a lo que dicen sobre las noticias de piratas informáticos acerca de no usar algo como SHA2 + salt . Hay otras respuestas en el infosec StackExchange sobre por qué no deberíamos utilizar algo como SHA-256. El conocimiento generalmente aceptado es:
SHA2 es rápido, lo cual es malo (bcrypt es deliberadamente lento para que podamos sortear ley de Moore )
Como usted sabe, si usamos bcrypt, para codificar algo con un sal criptográficamente aleatorio, podríamos obtener esta cadena: $2a$13$ZyprE5MRw2Q3WpNOGZWGbeG7ADUre1Q8QO.uUUtcbqloU0yvzavOm
, y la sal está contenida en esa cadena.
Mi pregunta es un poco multifacética:
-
Si un atacante obtiene acceso a la base de datos con acceso de escritura, podrían volver a escribir la contraseña de alguien en la tabla con su propio hash e iniciar sesión en la cuenta de ese usuario, ¿verdad? A menos que ese no sea su objetivo específico (por ejemplo, tal vez no quieran que nadie sepa que accedieron a la base de datos). O si tienen acceso de solo lectura, supongo que es una historia diferente.
-
Aparte del hecho de que bcrypt es deliberadamente lento, ¿existe alguna otra ventaja para almacenar la sal en el mismo hash que la contraseña en lugar de tener tanto
user.hash
comouser.salt
en un registro si no uso bcrypt? O en ese caso, ¿es generalmente una buena práctica almacenar hashes y sales en tablas / bases de datos separadas (y luego presentar la desventaja de las búsquedas de tablas / bases de datos múltiples como se menciona en uno de los comentarios)?
También obtenemos el problema de que bcrypt presenta problemas de rendimiento menores (sí, dentro del rango de milisegundos) (a propósito) al realizar búsquedas, lo cual es insignificante en la mayoría de los casos, pero parece que la única protección que realmente obtener de bcrypt hace que sea difícil procesar por lotes una tabla de usuarios completa e iniciar sesión de forma encubierta en las cuentas de los usuarios (o vender su información, o lo que sea). ¿Por qué no usar algo como SHA2 + salt entonces?