Probando una contraseña para similitud con hashes anteriores

0

Esta pregunta es un seguimiento de un comentario de Tobias Kienzler a una respuesta a" ¿Cuál es el propósito de la configuración de "Edad mínima de la contraseña"? ".

Considere la política de contraseñas de que las nuevas contraseñas no pueden ser idénticas a la contraseña actual ni a ninguna de las cinco contraseñas del usuario que preceden a la contraseña actual. Tampoco pueden ser similares a la contraseña actual o cualquiera de estas contraseñas anteriores, donde "similar" se define como la distancia de Levenshtein 2 o menos. (Por el bien de esta pregunta, no asuma ningún requisito de complejidad que no sea seis o más caracteres, una letra y un dígito). Esto protege contra, digamos, "bush41", "clinton42", "bush-43" (que debe detenerse ), "obama44" (que debería estar permitido), y "clinton 45" o "bush 45" (cualquiera de los cuales debe detenerse).

El flujo de cambio de contraseña normal requiere la contraseña actual para que alguien no pueda ejecutar un cambio de contraseña con una cookie de sesión Firesheeped. El flujo de cambio de contraseña alternativo envía un token de restablecimiento a través de otro canal, como correo electrónico, voz o texto. En el flujo ordinario, puedo probar si la nueva contraseña es similar a la actual usando la función de distancia Levenshtein de una biblioteca. Pero no tengo la contraseña anterior; Todo lo que tengo son hash PBKDF2 salados. Tampoco puedo probar la similitud con la contraseña actual si el usuario ingresó un token de restablecimiento de contraseña en lugar de la contraseña actual.

En el comentario mencionado anteriormente, Tobias Kienzler recomendó "calcular todas las mutaciones de la nueva contraseña dentro de la distancia de edición inaceptable, calcular sus hashes y compararlos con hashes de contraseñas antiguas (con las respectivas sales)". En una respuesta a la "Seguridad de la contraseña" , una responda a" ¿Facebook almacena contraseñas de texto sin formato? ", y una respuesta a "¿Cómo puede un sistema imponer un número mínimo de caracteres modificados en las contraseñas, sin almacenar o procesar contraseñas antiguas en texto simple?" , Apsillers, Michał Šrajer y Ori sugirieron algo similar.

Pero no veo cómo es manejable en el hardware actual calcular el conjunto de todas las cadenas con la distancia Levenshtein 2 de una frase de contraseña de más de 20 caracteres y agruparlas todas, especialmente con un hash intencionalmente lento como PBKDF2 y gran conjunto de caracteres como Unicode. Parece que se requieren alrededor de hash h(nc)s , donde h es la longitud del historial (aquí 5), n es el número de caracteres en una contraseña (y, por lo tanto, el número de posiciones en las que puede ocurrir un reemplazo o una inserción), c es el número de caracteres en el conjunto de caracteres (95 para ASCII imprimible o mucho más grande para Unicode imprimible), y s es la distancia de edición máxima para llamar a dos contraseñas "similares".

Entonces, ¿cuál es esta forma computacionalmente factible de probar una contraseña para determinar la similitud con contraseñas anteriores sin almacenar contraseñas anteriores con cifrado reversible? ¿Requeriría aplicar cualquiera o todas las siguientes simplificaciones a la definición de similitud y, de ser así, comprometerían la seguridad del sistema de contraseñas en la práctica?

  • Requerir que todos los caracteres en las contraseñas sean ASCII imprimibles (espacio para ~).
  • Reduzca la distancia de Levenshtein de una "contraseña similar" a 1.
  • Compare solo la contraseña actual por similitud y las contraseñas anteriores solo por identidad.
  • Sacrificar la disponibilidad para proteger la confidencialidad de la contraseña Cuando un usuario solicita un cambio de contraseña, bloquee al usuario por el resto del día mientras el sistema enumera todas las contraseñas similares posibles, y no permita que otros usuarios cambien sus contraseñas si hay demasiadas búsquedas de similitud de usuarios.
pregunta Damian Yerrick 10.01.2015 - 23:01
fuente

3 respuestas

2

Me gustaría sugerirte que consideres por qué las personas cambian las contraseñas. Podría ser porque el usuario cree que la contraseña está comprometida, o "porque la seguridad"; el sistema está forzando cambios regulares en la creencia de que tales cambios de alguna manera mejoran la seguridad. Yo diría que una contraseña segura debe cambiarse solo en caso de compromiso. Además, hay miles de contraseñas débiles con una distancia Levenshtein > 2. Podría alternar entre: loveyou1, hateit2, scroomall3, Shannon4, y dammit5 y estar completamente dentro de las reglas que usted establece. Sin embargo, todo esto caerá a la adivinación basada en el diccionario en segundos.

Ha calculado correctamente que no puede hacer lo que se propone dentro de un tiempo razonable.

Si limita el espacio clave a los caracteres ASCII imprimibles, viola uno de los principios de Shannon (el espacio clave no debe estar restringido artificialmente) y al menos hace que sus contraseñas sean menos seguras. "Menos seguro" es al menos mayormente teórico, porque la gente usará al menos la mayoría de los caracteres del teclado. Aun así, rechazamos esta alternativa porque reduce el espacio clave.

Reducir la distancia de Levenshtein a uno realmente no te ayuda, como muestran mis ejemplos. Así que lo rechazamos.

Rechazamos el bloqueo de los usuarios como una violación de la propiedad de disponibilidad.

Se queda comparando la contraseña actual para la similitud y las contraseñas anteriores para la identidad, y eso es lo que recomiendo. Ni siquiera puedes hacer eso cuando usas un token de reinicio, así que tienes que comparar todo por identidad, y eso está bien. Las personas no deben "cambiar" sus contraseñas a sus valores actuales.

Más allá de todo eso, le sugiero que revise por qué desea forzar los cambios de contraseña en ausencia de evidencia de compromiso. En su mayoría obtendrás loveyou1, hateit2, scroomall3, Shannon4 y dammit5, o cosas muy similares.

Finalmente, podría ser un mejor uso del tiempo de programación rechazar las contraseñas más frecuentes de 1,000 o 2,500 en lugar de preocuparse por el historial de contraseñas. En una aplicación de alta seguridad, puede rechazar los 10,000 principales, pero para los usuarios normales eso equivale a rechazar todo. Una de estas listas de contraseñas está aquí: enlace

    
respondido por el Bob Brown 11.01.2015 - 01:00
fuente
1
  

Entonces, ¿cuál es esta forma computacionalmente factible de probar una contraseña para determinar la similitud con contraseñas anteriores sin almacenar contraseñas anteriores con cifrado reversible? ¿Requeriría aplicar cualquiera o todas las siguientes simplificaciones a la definición de similitud y, de ser así, comprometerían la seguridad del sistema de contraseñas en la práctica?

Uno debe desconfiar de preguntar cómo hacer algo antes de preguntar si se debe hacer algo.

Cualquier cosa que pueda hacer para que sea computacionalmente factible para probar rápidamente una variedad de contraseñas candidatas (en su caso, contraseñas similares), dada su propia base de datos de hash de contraseñas, TAMBIÉN hace que sea aún más computacionalmente factible para que un atacante pruebe rápidamente una variedad de contraseñas candidatas (en su caso, algunos diccionarios de craqueo y algunos conjuntos de reglas) en su base de datos de contraseñas filtrada .

Todas las respuestas que puede encontrar a este problema son una debilidad que los atacantes pueden usar contra usted, e incluso los atacantes de gama baja ya están obteniendo una ventaja sobre usted al usar GPU para probar las contraseñas candidatas mucho más rápido de lo que su servidor puede manejar en primer lugar. .

Para resumir: su problema es 100% idéntico al problema que enfrenta cualquier atacante con una base de datos de hash de contraseña filtrada.

    
respondido por el Anti-weakpasswords 11.01.2015 - 09:39
fuente
-1

Personalmente, realmente odio estos requisitos y preferiría el tiempo dedicado a desarrollar para esto a gastar en medidas de seguridad realmente eficientes, como la autenticación de dos factores o incluso mejor, simplemente usando OpenID donde usted no tiene para preocuparse por las contraseñas de los usuarios y ellos no tienen que molestarse en crear otra contraseña de acuerdo con los requisitos más o menos ridículos, a pesar de que el sitio al que se accede es una cuestión "menor" para su privacidad. . De esa manera, los motiva para que tengan una contraseña muy segura con uno , tal vez incluso la cambien "de verdad", porque ahora tampoco tienen que recordar qué permutación de la contraseña predeterminada que apenas supera dicha cambiaron los requisitos que utilizaron esta vez solo en orden, así que simplemente haga clic en el botón "restablecer contraseña" después del quinto mensaje frustrante de "nombre de usuario / contraseña no válido" ...

    
respondido por el Tobias Kienzler 12.01.2015 - 09:56
fuente

Lea otras preguntas en las etiquetas