En realidad, los comentarios sobre cómo Google maneja las contraseñas antiguas (aún reconociéndolas para recuperar una cuenta bloqueada), me hicieron pensar en los pros y contras de esto, y si se podría usar para evitar que las personas reutilicen Contraseñas antiguas de forma relativamente segura. No es que realmente piense que querría eso (personalmente, creo que el 99% de las "mejores prácticas forzadas" para el uso de contraseñas simplemente hace que las personas escriban su contraseña; esto es cierto a menos que la persona involucrada realmente reconozca la importancia de la contraseña). por ejemplo, permite el funcionamiento de una planta de energía nuclear), en cuyo caso no es necesario aplicar las mejores prácticas de una manera tecnológica).
Primero veamos cómo Google puede haber implementado su sistema de una manera relativamente segura. De los comentarios anteriores, entiendo que cuando uno pierde el acceso a su correo electrónico y olvida su contraseña actual, se inicia algún tipo de flujo de recuperación-trabajo, donde se proporciona "evidencia" de su identidad. Probablemente en algún momento un humano tomará una decisión sobre si restaurar el acceso a esa cuenta. En ese momento, necesitan tanta evidencia como puedan encontrar que eres tú. El conocimiento de una contraseña anterior puede proporcionar una pista.
Ahora, los problemas de almacenar hashes de contraseñas antiguas son como @tim menciona en su elaborada respuesta: incluso a través de la sospecha de que Google asegura sus bases de datos mucho mejor que la mayoría de las demás, siempre puede ocurrir una violación de datos. Sin embargo, si en lugar de almacenar un hash de contraseña completo de 128 bits / 256 bits (con sal), solo almacenan los primeros 16 bits (para las contraseñas antiguas), será imposible para un atacante extraer una contraseña de este * . Al mismo tiempo, si alguien proporciona 2 contraseñas que coinciden con 2 de los 4 hashes de 16 bits almacenados, este es un gran indicio de que la persona no es un pirata informático completamente aleatorio ** .
Diga que su requisito es no permitir ninguna contraseña que se haya usado antes en el sistema para ese usuario (por ejemplo, su jefe leyó en alguna parte que es una buena idea y no permitirá que nadie cambie de opinión). Una vez más, estoy totalmente de acuerdo con la evaluación de @ tim de que almacenar hashes para contraseñas antiguas es una muy mala idea. Entonces, ¿qué sucede si utilizamos la solución de Google sugerida y almacenamos solo un hash pequeño para obtener una contraseña? El problema es que si utilizamos hashes de 16 bits, tenemos un cambio razonable de no permitir una contraseña que no se usó anteriormente, pero que tiene el mismo hash de 16 bits. El ataque de cumpleaños muestra que para 16 bits, después de 36 contraseñas hay un 1% de probabilidad de que al menos una nueva contraseña sea rechazada --- esto puede o no ser aceptable. Más bits significa que esta oportunidad se reduce, pero la información expuesta por una base de datos pirateada se hace más grande.
* Si sus contraseñas antiguas son "monkey1", "monkey2", "monkey3", es posible que un hacker aún pueda detectar este patrón. Por otro lado, dado que Google no requiere cambios de contraseñas mensuales, espero que las personas que usan patrones simples no se preocupen por cambiar su contraseña de Google en absoluto.
** De nuevo, quiero dejar claro que no es más que una pista. La idea general de las contraseñas antiguas es que se han cambiado porque podrían haber sido comprometidas. Por lo tanto, el conocimiento de una contraseña antigua no es una sugerencia tan fuerte; probablemente querrán que escanees tu tarjeta de identificación o algo antes de restaurar el acceso. Sin embargo, sí agrega una primera capa de protección contra un niño de 16 años que intenta piratear la cuenta de un profesor o un script de computadora que intenta piratear muchas cuentas al mismo tiempo. 16 bits significarán que solo 1 de cada 64 k intentos de contraseña aleatoria pasan.