Distancia entre dos contraseñas

15

Se sabe que las personas reutilizan sus contraseñas en diferentes sitios. La reutilización se puede hacer de dos maneras:

  1. usando exactamente la misma contraseña para dos sitios diferentes,
  2. modificando ligeramente la contraseña de un sitio y usándola en otro. Los llamamos contraseñas similares.

Para el caso 1. la comparación de contraseñas revela directamente la reutilización de la contraseña.

Para el caso 2. no hay una medida clara de cómo medir la distancia entre dos cadenas. La métrica más popular es Levenshtein o la distancia de edición. Por ejemplo, la distancia de edición entre "contraseña" y "contraseña1" es solo 1 correspondiente a la inserción de la letra '1'

Sin embargo, la distancia Levenshtein no siempre funciona bien. Por ejemplo, si la contraseña de algún sitio dice x.com es "lunes", y la contraseña del sitio y.com es "miércoles", la distancia de edición sería 5. Suponiendo que el atacante sepa la contraseña de x.com , es decir "lunes" y las posiciones donde se han realizado las ediciones para el sitio y.com , deben intentarse al menos 26 ^ 5 variaciones de contraseña el lunes.

Pero conceptualmente "lunes" es reemplazado por otro día de la semana. Hay 6 días laborables más que "lunes". Entonces, en este caso, el atacante inteligente debe probar solo 6 días hábiles diferentes en lugar de 26 ^ 5 variaciones de "lunes".

¿Cuál debería ser la buena manera de medir la distancia entre dos contraseñas?

    
pregunta Curious 15.12.2014 - 06:21
fuente

2 respuestas

13

No hay buena manera. Lo que dices es prácticamente la medida de la distancia de contraseña en nuestra mente . Es claramente imposible tener un método directo para hacerlo.

Lo segundo, lo que desea medir, depende en gran medida de la persona y, a menudo, contiene solo información conocida para él. Por ejemplo, uno de sus colegas podría usar el nombre de sus hijos en los diferentes servidores de la empresa. No es posible crear una solución de software para encontrar esto, pero algunos hackers / colega pueden tener esta información y usarla para descifrar su cuenta.

Lo que puedes hacer es un paso en el camino de la NSA: aunque no puedes espiar directamente a la gente, puedes usar Big Data para emular algunos muy similares.

Lo que necesita: información disponible públicamente en la red. Por ejemplo:

  1. Thesaurus
  2. Wikipedia (aunque no hay una forma sencilla de medir la distancia de enlace de dos palabras clave, su base de datos es simplemente descargable y puede crear un script para analizar su conectividad de enlace).
  3. O simplemente puede hacer búsquedas automáticas de google con la api de búsqueda de google y obtener una proporción de resultados entre la primera, entre la segunda contraseña y entre una consulta dual (por ejemplo, si la primera contraseña es "apple" y la segunda es "naranja", entonces el Hits("apple")*Hits("orange")/Hits("apple", "orange")^2 debe estar por debajo de un límite experimental establecido por usted).

Pero tenga cuidado: no ejecute consultas que contengan las contraseñas en una nube pública no confiable, ¡fue una violación de seguridad muy seria! Por supuesto, depende solo de sus puntos de vista / consideraciones / responsabilidad, que La nube pública es de confianza para ti. Para mí, ninguno fue.

En tu lugar hice lo siguiente:

  1. Obtengo un espejo de wikipedia (tienen una base de datos mysql simple que se puede descargar públicamente)
  2. Creó un mapa de distancia de enlace (era muy simple, aunque tal vez era grande)
  3. Creé para que las dos contraseñas se comparen con el título de su artículo de wikipedia más cercano (probablemente necesitaba una comparación masiva de levenshtein, así que necesitarás mucha CPU)
  4. Finalmente utilicé la siguiente fórmula: D ("pwd1", "pwd2") = Levensheiten ("pwd1", Lev_nearest ("pwd1")) + Wiki_Link_Distance (Lev_nearest ("pwd1"), Lev_nearest (" pwd2 ")) + Levensheiten (" pwd2 ", Lev_nearest (" pwd2 "))

Extensión: wiki contiene alrededor de 1 millón de entradas de texto, lo que hace que la búsqueda más corta sea casi imposible. Seguramente implementaste esto como un C ++, y usaste algoritmos muy bien optimizados. Por lo tanto, será difícil. Como alternativa, puede hacer que use desde la wikipedia solo las palabras más comunes (que se pueden encontrar al obtener sus estadísticas de uso). Aunque la wiki en inglés tiene alrededor de unos millones de artículos, un hablante nativo de inglés sólo conoce unos diez mil de ellos.

Alguien debería escribir esto realmente, era un maravilloso demonio de código abierto en algún lugar del github :-)

    
respondido por el peterh 15.12.2014 - 11:10
fuente
10

Está de suerte, hay una buena manera de normalizar esto para la información disponible públicamente : WolframAlpha puede ser se utiliza para reducir las cadenas en componentes lógicos que se pueden comparar, y da como resultado una comparación de Levenshtein más precisa.

Ejemplo de "Lunes"

Una vez que "factoriza" la cadena en todos sus posibles significados (día de la semana, valor de scrabble, etc.) puede usar los elementos como un nuevo valor comparativo.

Para información privada , como el nombre de un hermano, deberá seguir un método similar para reconstruir la estructura de Wolfram para su tienda propietaria. Wolfram tiene una API disponible que exporta los resultados en JSON y puede ayudarlo a alinear sus ideas con lo que se necesita para crear un repositorio privado.

    
respondido por el random65537 15.12.2014 - 16:35
fuente

Lea otras preguntas en las etiquetas