¿Cómo puedo almacenar un historial de contraseñas para evitar la reutilización?

11

Tengo una aplicación con una base de datos de usuarios. La base de datos almacena la contraseña utilizando un hash bcrypt con un salt aleatorio.

¿Cómo puedo implementar un conjunto de historial de contraseñas (para evitar la reutilización de contraseñas) en un caso como este?

Si tengo el restablecimiento tradicional de la contraseña de 3 campos (ingresar actual, ingresar nuevo, confirmar nuevo), podría almacenar el actual al reemplazar el antiguo con el nuevo. Sin embargo, entonces tengo el caso de una contraseña olvidada. Mis usuarios pueden ir y hacer un restablecimiento automático de autoservicio y reutilizar sus contraseñas una y otra vez.

Las contraseñas almacenadas se cifrarían, pero con un cifrado reversible que las hace menos seguras.

    
pregunta Snowburnt 31.12.2013 - 15:57
fuente

3 respuestas

16

Almacena los antiguos valores de sal y hash. Hash la nueva entrada con las sales antiguas y ver si coinciden.

Si funcionó para verificar la contraseña cuando se conectaron normalmente, también funcionará para verificar si la contraseña se ha usado antes.

    
respondido por el AJ Henderson 31.12.2013 - 16:23
fuente
5

Si password1 = password2 , entonces hash(password1, salt1) = hash(password2, salt1) .

En otras palabras:

  • Codifique la nueva contraseña con el mismo número de sal y iteración.

  • Compara los hashes.

  • Si el nuevo hash es diferente del hash anterior, entonces todo está bien (según sus criterios), y simplemente puede volver a codificar la nueva contraseña con un nuevo salt único y almacenarlo en la base de datos.

  • Si el nuevo hash es el mismo, entonces la nueva contraseña es la misma que la antigua. Dígale a su usuario que elija uno nuevo.

respondido por el Adi 31.12.2013 - 16:04
fuente
1
  

Mis usuarios pueden ir y hacer un restablecimiento automático de autoservicio y reutilizar sus contraseñas una y otra vez.

Para resolver este problema planteado en la pregunta original, tendría que almacenar más que solo la última contraseña. Esto se puede hacer fácilmente almacenando las sales y hashes de n anteriores. Sin embargo, esto puede no es una buena idea .

Una forma de mejorar esto sería almacenar contraseñas similares , además de las contraseñas reales.

Otra forma sería solo almacenar parte del hash .

Por supuesto, puedes usar ambos enfoques.

    
respondido por el go2null 24.02.2016 - 23:38
fuente

Lea otras preguntas en las etiquetas