Recientemente, encontré un sitio web que me obliga a cambiar mi contraseña después de que hayan transcurrido X días desde la última vez que creé una. Inteligentemente, el servicio se aseguró de que la contraseña no coincidiera (aproximadamente) con ninguna otra que haya usado antes (algo que claramente no usaba permutaciones). Sin embargo, me intrigó la forma en que podría haber hecho esto, ya que mi ingenua comprensión en ese momento era que tendrían que almacenar texto sin formato para calcular una distancia entre dos cadenas.
Intentando no asumir lo peor del sitio web (es administrado por una organización multimillonaria, para uso interno de los empleados), indagué un poco más en los métodos que se han utilizado. Lo primero que pensé fue en la comparación de sub-cadena de hash (inmediatamente lo descarté debido al posible debilitamiento del texto simple). Pensé que podrían hacer un hash de permutación (una vez más, deseché esto porque coincidía con los aproximados, e incluso con algunas modificaciones, pareció funcionar bastante bien).
Fue entonces cuando me topé con LSH como un concepto. Pensé que era una buena idea, que permitía una comparación de datos de conocimiento cero. Es decir, crear un hash que tiene una alta probabilidad de hacer coincidir cosas similares a sí mismo, pero comprime y no contiene necesariamente la información del texto en llano del que se derivó.
Algo a lo largo de las líneas de enlace
773e2df0a02a319ec34a0b71d54029111da90838cbc20ecd3d2d4e18c25a3025 spam1 47182cf0802a11dec24a3b75d5042d310ca90838c9d20ecc3d610e98560a3645 spam2
El nilsimsa de estos dos códigos es 92 en una escala de -128 a +128. Eso significa que 36 bits son diferentes y 220 bits iguales. Cualquier nilsimsa sobre 24 (que es 3 sigma) indica que los dos mensajes probablemente no se generen de forma independiente.
¿Esto es seguro y, de no ser así, hay una versión segura de dicho método? Gracias.