¿Cómo evitar que los usuarios agreguen un solo dígito a su contraseña anterior al crear una nueva? [duplicar]

11

Digamos que en la política de contraseñas el historial de contraseñas se define para recordar las últimas 10 contraseñas.

Entiendo que el historial de contraseñas existe, por lo que si un atacante recupera una contraseña de una base de datos comprometida, es probable que la contraseña no sea la contraseña actual del usuario.

Sin embargo, si al restablecer la contraseña periódicamente, los usuarios simplemente agregan '1' a su contraseña anterior, y en el próximo restablecimiento del período agrega digamos '2', esto disminuye considerablemente la efectividad de los restablecimientos periódicos de contraseñas. Tan pronto como el atacante recupere dos contraseñas antiguas del mismo usuario en texto claro, verá el patrón y podrá adivinar la contraseña actual actual del usuario ...

La mejor práctica es el hash (+ sal) de las contraseñas, sin embargo, por lo que puedo ver, esto hace imposible verificar si el usuario simplemente agregó un solo dígito a su contraseña anterior o no.

Las contraseñas podrían estar cifradas en lugar de con un hash, lo que resolvería mi preocupación, sin embargo, no me gusta la idea de que las contraseñas sean reversibles a texto simple sin ataques de fuerza bruta.

¿Me pregunto cuál sería la mejor solución para evitar que los usuarios realicen cambios menores en su contraseña anterior al restablecerla? ¿Se puede lograr técnicamente de una manera muy segura, o esto definitivamente requiere el conocimiento del usuario?

    
pregunta Stef Heylen 12.01.2016 - 16:58
fuente

7 respuestas

36

No puedes. Sus usuarios están haciendo esto porque el mecanismo de restablecimiento se ha vuelto molesto para que ellos hagan el trabajo. Las personas son lo suficientemente inteligentes como para sortear cualquiera de los mecanismos que vas a diseñar. Aquellos que no lo son, aprenderán rápidamente de aquellos que lo son. Información como esta viaja rápido.

Si, de alguna manera, descubriera cómo contrarrestar el esquema de contraseña1 contraseña2 contraseña3 que la gente usa comúnmente, se verá confrontado casi instantáneamente con un nuevo esquema. 1 contraseña Palabra clave 3 contraseña Ahora ves un NUEVO patrón, y simplemente itera todos los números. Así que al usuario se le ocurre un esquema aún mejor. contraseñaA contraseñaB contraseñaC. Pasarás semanas creando una contramedida, solo para ser derrotado en 10 minutos por una persona inteligente que pensó en algo que no.

El punto es que la capacidad y el costo de los usuarios para superar sus contramedidas superan con creces su capacidad para desarrollar continuamente nuevos esquemas para intentar prevenirlos.

La solución es simplemente dejar de ver a tus usuarios como adversarios a los que intentas derrotar. No son Los usuarios simplemente están tratando de hacer las cosas, y usted ha puesto una barrera para hacerlo. Si esto realmente te molesta, debes ajustar tu actitud hacia los usuarios y trabajar con ellos para encontrar algo que se adapte a tus necesidades y no cree una relación adversa.

    
respondido por el Steve Sether 12.01.2016 - 17:36
fuente
6

Suficientemente fácil: tienes una contraseña potencial de "contraseña1". Pruebe "contraseña" y "contraseña0" para ver si funcionan con el hash anterior. No es necesario ver el texto simple de la contraseña anterior para que esto funcione.

Sin embargo, esto no va a funcionar por las razones que expone Steve Sether.

    
respondido por el Loren Pechtel 12.01.2016 - 23:00
fuente
5

Esto se ha discutido en varios puntos, y la mayoría de las discusiones parecen volver al concepto de topologías de contraseña , los patrones que tienen muchas contraseñas. Hay una buena presentación de OWASP en YouTube, que sugiere que muchas contraseñas que deben seguir reglas de complejidad siguen un ejemplo similar. patrones:

  • Contraseña1! : si aplica al menos un carácter de cada una de las letras mayúsculas, minúsculas, dígitos y caracteres especiales, muchas personas elegirán una palabra en mayúscula, seguida de un número, con el carácter especial al final, que a menudo será ? , ! o . ; la topología es UL+DS (utilizando una especie de sintaxis de estilo de expresiones regulares)
  • Contraseña1 : si no aplicas un carácter especial, generalmente no obtendrás uno
  • contraseña1 : si no aprueba una letra mayúscula, normalmente no recibirá una, pero si lo hace, estará al principio
  • qwertyuiop : si no aplicas nada, obtienes cosas que son fáciles de escribir

También existe cierta controversia sobre el valor de cambiar las contraseñas con regularidad, ya que tienden a fomentar exactamente el comportamiento que está viendo. Sin embargo, a veces se requieren debido al ritmo relativamente lento de las opciones comerciales.

Esto da lugar a la sugerencia de imponer no solo un cambio de contraseña, sino un cambio de topología de contraseña. El proceso de restablecimiento de contraseña se convierte en:

  1. El usuario ingresa la contraseña antigua (por ejemplo, Password1! ) y la nueva contraseña ( MyS3cret$ ) en forma de restablecimiento
  2. El sistema calcula la topología de la contraseña anterior ( UL+DS ) y la nueva contraseña ( ULUDL+S )
  3. El sistema rechaza el cambio de contraseña si las topologías coinciden, o si la nueva contraseña no coincide con las reglas de complejidad

También es posible rechazar ciertas topologías comunes por completo, tal vez no desee ninguna contraseña de la forma Password1! , en cuyo caso configurará su sistema para rechazar cualquier contraseña que tenga la topología UL+DS .

Nunca almacene la topología de una contraseña con ella: si su base de datos se ve comprometida, le habría dado a los atacantes una forma fantástica de minimizar su esfuerzo para descifrar las contraseñas recuperadas.

Tenga en cuenta que los usuarios seguirán encontrando formas de crear contraseñas débiles: podrían comenzar alternando Password1! y !2Password , pero eso sugiere que la frecuencia de cambio de contraseña es demasiado alta.

    
respondido por el Matthew 12.01.2016 - 18:02
fuente
3

Es sencillo evitar el problema específico de la actualización de nuevas contraseñas por parte del usuario que es muy similar a las contraseñas utilizadas anteriormente (por ejemplo, solo un dígito / cambio de caracteres).

En la misma pantalla de cambio de contraseña, simplemente solicite al usuario que ingrese su contraseña anterior, así como su nueva contraseña solicitada. De todos modos, es una buena práctica exigir a los usuarios que ingresen su contraseña existente en las pantallas de cambio de contraseña (esto evita que alguien que dejó brevemente su cuenta iniciada desatendida, que un atacante cambie su contraseña y se otorgue acceso en el futuro mientras bloquea al usuario real) ).

Solo acepte la nueva contraseña si puede verificar en el lado del servidor que se cumplen todas las siguientes condiciones:

  1. El hash de la contraseña anterior coincide con el hash almacenado en la base de datos.
  2. La nueva contraseña satisface sus requisitos de seguridad (ya sea una frase de contraseña larga que sea potencialmente para un solo tipo de carácter; o tiene caracteres especiales, mayúsculas, números y tiene al menos 8 caracteres),
  3. Las contraseñas antiguas y nuevas (las dos que acaba de recibir en texto sin formato en su base de datos en texto sin formato) tienen una (digamos mayor que 4). Si no tiene suficiente distancia, comuníquele al usuario que la contraseña es demasiado similar a una contraseña anterior y debería ser completamente diferente.
  4. La nueva contraseña no coincide con ningún hash caducado utilizado anteriormente. (No permita la reutilización de la contraseña de una contraseña anterior).

Tenga en cuenta que esto no impide que un determinado usuario lo haga

<password>1 - > <other password>1 - > <password>2 - > <other password>2 .

Si realmente quisieras prevenir este tipo de patrón, podrías hacerlo con unos patrones muy específicos. Es decir, cada vez que se guarda una contraseña, puede modificar algunas modificaciones comunes de la contraseña actual y guardarlas en la base de datos como hashes caducados utilizados anteriormente. Esto puede evitar algunos esquemas comunes (por ejemplo, el dígito final), pero los usuarios encontrarían formas de evitarlos (por ejemplo, incrementar un carácter en medio de la contraseña).

    
fuente
2

Esto es un poco complicado. Es fácil de imponer la complejidad porque la complejidad es relativamente fácil de describir pero una contraseña compleja en muchos casos no es buena. Por ejemplo, si su política obliga a un mínimo. longitud de 10 caracteres, un carácter especial, un número y mayúsculas y minúsculas muchas personas lo harán:

David1989$

Cuál es el primer nombre, el año de nacimiento y un personaje especial seleccionado al azar. Esto coincide con la política, pero cada hacker con un conocimiento básico sobre la persona puede romper dicha contraseña en menos de un segundo mediante el uso de un script que genera dichas contraseñas a partir de datos personales. En realidad, hace algún tiempo escribí un script que recopilaba dicha información del sitio web de un cliente y los perfiles de Facebook relacionados para generar tales contraseñas. Funcionó bastante bien.

Esta es la razón por la que hice esta pregunta alguna vez hace. Desde esta experiencia, con frecuencia extraigo las contraseñas de todos los usuarios del servidor AD y realizo ataques de listas de palabras con listas y listas de palabras disponibles para el público que se recopilan de sitios web que están técnicamente relacionados con la empresa. Los usuarios cuyas contraseñas se rompieron necesitan restablecer su contraseña y se ven obligados a usar una contraseña generada aleatoriamente después de la segunda vez que se rompe el hash de contraseña.

    
respondido por el davidb 12.01.2016 - 17:29
fuente
2

Esto se puede hacer, al menos en la mayoría de los casos (por supuesto, eso no significa necesariamente que sea una idea buena !):

Tienes razón en que es efectivamente imposible recuperar la contraseña anterior del usuario del hash de contraseña almacenado.

Pero no necesita para: como parte del proceso de cambio de contraseña, es normal solicitar la contraseña antigua del usuario y verificarla. Esto le permite comparar las contraseñas antiguas y nuevas para la similitud.

Obviamente, es fácil verificar si se agrega / incrementa un solo dígito al final de la contraseña, pero eso permite demasiadas variaciones simples que serían igualmente obvias para un atacante. Mucho mejor sería calcular la distancia de edición entre las dos contraseñas (existen algoritmos eficientes bien conocidos para hacerlo), y rechazar si la distancia es baja (por ejemplo, < = 2): eso garantizará que solo se cambien algunos caracteres (donde sea que estén en la contraseña).

Por supuesto, la gente seguirá encontrando formas de reutilizar las contraseñas con pequeñas modificaciones, pero es de esperar que si un atacante recupera una o dos contraseñas históricas ahora será mucho menos obvio cuál es el patrón y, por lo tanto, qué contraseña intentar ahora.

Una situación en la que esto no funciona es si el usuario ha olvidado su contraseña (el escenario de "restablecimiento de contraseña"). En el caso real en el que la contraseña realmente se ha olvidado, esto no es un problema ya que es poco probable que la nueva contraseña sea una simple modificación de una que el usuario no pueda recordar. Pero existe un riesgo real de que los usuarios comiencen a usar el "restablecimiento de contraseña" como una solución que les permite cambiar su contraseña a algo similar a lo que sucedió antes. (Si esta es una gran preocupación, entonces la solución sugerida en otras preguntas, de generar todas las contraseñas dentro de una cierta distancia de edición de la nueva contraseña y compararlas con el hash de la contraseña anterior) se puede usar; esto es ciertamente práctico para la distancia de edición. de uno, y posiblemente dos, pero más allá de eso comienza a convertirse en una gran cantidad de cómputo y probablemente no sea factible.)

    
respondido por el psmears 13.01.2016 - 10:09
fuente
-3

Uno de los mayores problemas de seguridad de este problema es el hecho de que estás almacenando las contraseñas en texto simple si puedes distinguir entre las diferencias de un solo carácter.

En primer lugar, debería considerar el almacenamiento de estas contraseñas como un hash de una sola manera, simplemente porque el almacenamiento de contraseñas podría ser potencialmente vulnerable a los ataques. Después de eso, podría implementar un mecanismo para asegurarse de que ninguna de las contraseñas más nuevas pueda conducir a uno de estos hashes. Esto también significaría que no se puede decir si están agregando un carácter o 100 caracteres después de su contraseña actual, desafortunadamente. Después de todo, como dicen las publicaciones anteriores, siempre hay formas de hacerlo, y no es que estén tratando de ser maliciosos, solo quieren hacer su trabajo.

La mejor manera de implementar esto es educar a sus usuarios a través de algún tipo de plataforma de comunicación, ya sea vocalmente, a través de correo electrónico o tableros de mensajes, etc. y también, señalarlos hacia los posibles problemas. Después de todo, es menos probable que las personas encuentren formas de evitarlas si saben que son las que más se benefician del sistema que la molestia causada por él.

    
respondido por el adalal 12.01.2016 - 18:36
fuente

Lea otras preguntas en las etiquetas