由于 schroeder 概述的原因,作为密码强度代理的 Levenshtein 距离非常有限。而且用户体验可能很差。
但是这个问题在学术上仍然很有趣,并且可能作为某些用例的一个组件有用 - 所以它仍然值得一个彻底的答案。:D
通常,先前密码和新密码之间的最小Levenshtein 距离应该与随机生成的能够抵抗暴力破解的密码的最小长度相同(根据威胁模型进行调整)。但重要的是要注意,即使是这个最小值也常常是不够的。
我的回答基于几个因素:
- 目标哈希类型的速度(攻击难度)
- 攻击者可以获得多少关于先前密码的信息
- 用于生成初始密码的方法
- Levenshtein 距离作为密码更改强度代理的有用性
首先,关于速度。
二、关于用户以前的密码。
我们必须假设攻击者拥有用户以前的密码。不仅密码重用是长期存在的,而且现在,即使攻击是针对慢散列的,现代攻击堆栈也包括一种称为“相关攻击”的高效“按目标”攻击模式(由开膛手约翰的“单一”模式和稍后通过 hashcat 的 -a 9 模式)利用先前密码的知识,即使在大量泄漏时也是如此。
在关联攻击中,我们假设攻击者可以访问用户以前的密码(来自以前的泄漏,由于密码重用而来自不同的站点等)。该攻击将用户的旧密码作为“基础”,然后将一组特定的“修改规则”(附加 $、首字母大写等)应用于每个 plaintext,但仅针对该用户的 hash。对于较大批量的用户和较慢的散列,这会显着提高攻击速度 - 因为不是针对长列表中的每个散列尝试相同的候选者(就像大多数传统攻击所做的那样),相关攻击只将这些修改规则应用于该用户'.
这不仅仅是学术问题——现实世界的破解现在在很大程度上依赖于关联用户:密码或电子邮件:密码泄漏以及针对新目标的破解。所以我们必须假设攻击者拥有之前的密码。
第三,关于密码生成方法。
最坏的情况 - 密码是单个人工生成的单词,很容易在密码频率列表中找到(如“123456”)。如果一个人选择了下一个密码,那么它与该密码相似的可能性可能很高,因此即使非常低的 Levenshtein 距离也可能是相关的。
最好的情况——密码是完全随机生成的,无论是最初还是后来。在这种情况下,Levenshtein 距离不那么相关(或者更确切地说,测量两个随机生成的密码之间的 Levenshtein 距离只是衡量其随机性质量的代理)。
第四,关于作为密码强度代理的 Levenshtein 距离。
从实际密码熵的角度考虑这一点很有用- 在现实世界中攻击有多难,充分了解人类如何在心理上“分块”密码组件。(这也是香农熵在评估非随机生成密码的强度方面出了名的糟糕的原因,因为它假设蛮力 - 单词中的每个字母都是必须独立攻击的“块” - 而不是如何人类记住密码组件(“只需添加我孩子的名字”)。
鉴于以上所有...
如果我们假设所有最坏的情况(人工生成的密码、糟糕的密码选择策略等),答案应该很清楚:密码的变化量本身应该足以抵御攻击——完全独立于以前的密码(好像第一个密码是空的),并且好像它是使用 MD5 之类的非常快速的哈希存储的。这降低了我们可以合理地预期随机生成的密码对于给定威胁模型用尽的速度,并且在其他地方很好地覆盖(但通常可以徘徊在 13-15 个随机字符左右)。
不幸的是,与许多测量密码强度的尝试一样,这并不容易。这是因为具有高 Levenshtein 距离的密码更改仍然可以具有非常低的实际微分熵。
例如,如果用户的第一个密码是“password”,而他们的新密码是“passwordrumpelstiltskin”,那么 15 的 Levenshtein 距离听起来很棒。但是实际的Levenshtein 距离——当人类应用它们时对初始字符串的实际变化——不是 15,而是1(“添加一个单词”)。
换句话说......就像香农熵一样,Levenshtein 距离作为密码强度度量的有用性仅在密码已经随机生成的情况下才有用。如果你这样做,你就已经拥有了保持它们强大所需的信息,而无需尝试衡量它们两者之间的差异。
甚至换句话说...非常低的Levenshtein 距离是密码更改弱点的良好代理,但高Levenshtein 距离是密码更改强度的非常差的代理。所以我的回答试图在两者之间找到平衡。