Las contraseñas no deben almacenarse en texto sin formato por razones obvias de seguridad: debe almacenar los hash y también debe generar el hash con cuidado para evitar ataques de la tabla del arco iris.
Sin embargo, por lo general usted tiene la obligación de almacenar los últimos n contraseñas y para hacer cumplir una mínima complejidad y el cambio mínimo entre las diferentes contraseñas (para evitar que el usuario utilice una secuencia como Password_1, Password_2, ..., Contraseña_ n ). Esto sería trivial con las contraseñas de texto sin formato, pero ¿cómo puede hacerlo almacenando solo hashes?
En otras palabras: ¿cómo es posible implementar un mecanismo de historial de contraseña seguro?
Respuestas:
Almacene los hashes y verifique una contraseña ingresada contra esos hashes almacenados, de la misma manera que verifica una contraseña al iniciar sesión. Tendría que generar contraseñas 'alternativas' a partir de la que se proporciona en base a patrones numéricos para detectar sus cambios 'mínimos'.
Al iniciar sesión, ya verifica la contraseña ingresada contra un hash, no es necesario almacenar la contraseña en texto sin formato. El mismo truco funciona cuando se trata de cambiar una contraseña, simplemente verifique las contraseñas ingresadas y 'mínimas de cambio' contra los hashes históricos. Si la nueva contraseña es satisfactoria, mueva el hash de contraseña actual al conjunto histórico y reemplácelo con un nuevo hash para la nueva contraseña.
fuente
Cuando el usuario cambie su contraseña, solicite que ingresen su contraseña anterior. Ahora tiene acceso a dos contraseñas de texto sin formato, aunque no esté almacenando contraseñas de texto sin formato en su base de datos.
Realice las verificaciones que desee en estas dos contraseñas. Esto no evitará que el usuario alterne entre dos contraseñas (con un sufijo; puede evitar la alternancia directa según las sugerencias en otras respuestas), pero evitará los casos más evidentes.
fuente
potatoSalad1
y desean actualizarlapotatoSalad2
, usted dice que el cambio es demasiado pequeño porque tiene ambas contraseñas de texto sin formato en ese momento. Pero más atrás de eso, solo tiene hashes, y la naturaleza de los hashes es que no puede decir si dos hashes tenían texto plano similar o completamente diferente como entrada.para agregar a la respuesta de @ martijnPieter, el cambio mínimo se puede implementar haciendo una fuerza bruta corta basada en las contraseñas nuevas y anteriores (que ambos tienen disponible)
por ejemplo, puede iterar sobre todas las contraseñas con una distancia de 1 o 2 de la nueva contraseña y ver si coincide con un pase anterior
pero es posible que desee tener en cuenta que esto puede reducir la confianza de los usuarios de que está utilizando contraseñas hash (ya que básicamente está diciendo que puede recuperar una contraseña anterior para rechazar una nueva contraseña)
fuente
Esto es realmente más un apéndice a la inteligente respuesta de @ Brian. También felicito a @Martijn Pieters por agregar detalles sobre cómo forzar con fuerza bruta las contraseñas antiguas basadas en la actual y a @ratchet freak por "distancia de martilleo". No estoy eliminando mi respuesta porque creo que proporciona antecedentes interesantes para respaldarlos.
El almacenamiento de contraseñas de última generación requiere el uso de múltiples rondas de un hash criptográfico unidireccional fuerte (SHA-512 +) con sal única (128 bits +) para cada usuario. Pero no se sienta tentado a almacenar información adicional sobre cada contraseña. Cuanta más información almacene sobre cada contraseña, más socavará la seguridad de su algoritmo de hash.
Ejemplo
Considere lo fácil que resulta forzar una contraseña por fuerza bruta si sabe que:
Un teclado de EE. UU. Tiene 95 caracteres imprimibles, por lo que saber que la contraseña tiene 7 caracteres de largo produce 95 ^ 7 = 69,833,729,610,000 = 7x10 ^ 13 permutaciones. Si fuera realmente aleatorio, podría llevar un año descifrar esto en un solo procesador de 3Ghz. Pero:
Entonces (corregido gracias a @Hellion):
¡Eso es 50,000 veces más fácil de descifrar! El almacenamiento de buena información para evitar contraseñas similares en este caso ha tomado su tiempo de crack para una contraseña de 7 caracteres de un año a un par de horas. Ahora es muy factible decodificar todas sus contraseñas en un potente escritorio multiprocesador con una buena tarjeta de video y un poco de paciencia. Espero que este simple ejemplo demuestre que cuanto más significativa sea la comparación de contraseñas similares, menos seguro será su hashing.
Importancia de Hashing fuerte
Las bases de datos con contraseñas se roban regularmente, con grandes robos en las noticias cada mes. Diablos, el mes pasado el estado de SC perdió los números de seguridad social de todos, ¡Uy! ¿Cuántas más de estas infracciones están cubiertas?
Pensamiento de cierre
Lo más aterrador para mí es cuando las personas eligen la misma contraseña o una similar para varios sitios, de modo que romper en uno le da acceso al atacante a todos ellos. Me encantaría ver un método probado para prevenir esa situación, aunque creo que evitar las contraseñas incorrectas más comunes ayudaría más que evitar que un usuario individual reutilice su contraseña incorrecta en el mismo sitio. Lo mejor que puedo sugerir es una política de toda la empresa para usar un administrador de contraseñas seguro que genere contraseñas altamente aleatorias para cada uno de sus usuarios y las almacene de forma segura.
fuente
Primero, puede almacenar los hashes de las últimas "n" contraseñas anteriores, para que pueda verificar si su nueva contraseña duplica una contraseña anterior. También tiene el texto sin formato de su contraseña actual (porque han iniciado sesión o se la han proporcionado para autenticar su solicitud de cambio de contraseña), y su nueva contraseña, para que pueda verificar los cambios mínimos entre estas dos contraseñas.
Si (para usted) es muy importante comparar directamente estas dos contraseñas con "n" contraseñas anteriores, entonces debe almacenar estas contraseñas (encriptadas) para poder recuperarlas más tarde.
Si bien podría verse como una falla de seguridad hacer esto, los métodos de encriptación podrían implementarse para proporcionar seguridad suficiente.
Luego, cada vez que se cambia la contraseña, puede descodificar todas las contraseñas antiguas y hacer todas sus pruebas de cambio mínimo.
Ahora, si alguien tuviera la contraseña de esta persona y supiera todos los demás detalles necesarios, podría descodificar esta información para esta persona. Pero si ya tienen la contraseña de esta persona, ya pueden iniciar sesión como esta persona y acceder a la cuenta de esta persona.
Además, para las contraseñas antiguas, es posible que no tengan que almacenarse en texto estrictamente simple. Podrían almacenarse de alguna manera ofuscada. O almacenado como una lista alfabética de los caracteres en la contraseña.
No digo que esto sea algo recomendado en el caso general, pero suponiendo que la tarea que ha descrito es necesaria en su caso, esta es una forma de lograrlo con algunas medidas de seguridad.
fuente