没有什么好办法。你说的,实际上是我们心中密码距离的 度量。显然不可能有直接的方法来做到这一点。
第二件事,你想要测量的东西,很大程度上取决于人,并且通常只包含他已知的信息。例如,您的一位同事可以在不同的公司服务器上使用其孩子的名字。不可能建立一个软件解决方案来找到这个,但是一些黑客/同事可以拥有这些信息并使用它们来破解他的帐户。
你能做的,是进入 NSA 的轨道:虽然你不能直接窥探人们的思想,但你可以使用大数据来模拟一些非常相似的东西。
你需要什么:网络上公开的信息。例如:
- 词库
- Wikipedia(虽然没有简单的方法来衡量两个关键字的链接距离,但它的数据库可以简单地下载,您可以构建一个脚本来分析其链接连通性)。
- 或者简单地说,您可以使用google search api进行自动 google 搜索,并获得第一个、第二个密码和双重查询之间的命中率(例如,如果第一个密码是“apple”,第二个是“orange” ",则
Hits("apple")*Hits("orange")/Hits("apple", "orange")^2
必须低于您设定的实验限制)。
但请注意:不要在不受信任的公共云中执行包含密码的查询,这是非常严重的安全漏洞!当然,这仅取决于您的观点/考虑/责任,您信任哪个公共云。对我来说,没有。
在你的地方,我做了以下事情:
- 我有一个维基百科镜像(他们有简单的 mysql 数据库,可公开下载)
- 创建了一个链接距离图(它非常简单,虽然它可能很大)
- 我为这两个密码创建了与他们最近的维基百科文章标题进行比较(它可能需要大量的 levenshtein 比较,所以你需要很多 cpu)
- 最后我使用了以下公式:D("pwd1", "pwd2") = Levensheiten("pwd1", Lev_nearest("pwd1")) + Wiki_Link_Distance(Lev_nearest("pwd1"), Lev_nearest("pwd2"))+ Levensheiten ("pwd2", Lev_nearest("pwd2"))
扩展:wiki 包含大约 100 万条文本条目,这使得最短的搜索方式几乎是不可能的。您肯定已经将其实现为 C++,并使用了非常优化的算法。因此,这将是困难的。作为替代方案,您可以只使用维基百科中最常用的词(可以通过获取它们的使用统计信息来找到)。尽管英语维基有大约几百万篇文章,但以英语为母语的人只知道大约一万篇文章。
真的应该有人写这个,它是 github 某处的一个很棒的开源恶魔 :-)