传统密码的替代方案:这个想法有什么优点吗?

信息安全 密码 密码策略
2021-09-03 08:34:46

如果您的网站面向不一定精通技术的人,那么让新用户选择自己的密码并不是很安全,因为很多人不选择安全密码这一简单事实。处理这个问题的一些方法是:

  • 最常见的:有一个“密码强度检查器”或要求密码包含一定数量和不同种类的字符。这些通常不是很好,并导致密码实际上不是很安全和/或难以记住(当然这并不意味着您可以制作一个非常好的密码检查器,尽管这非常困难)。
  • 生成一个随机的字符序列:非常不切实际和不安全,因为人们倾向于把这些写下来,因为他们不记得它们。
  • 通过短信或电子邮件进行两阶段认证:对用户来说不是很方便。

我想到了一种受XKCD 漫画启发的不同方法。它是这样工作的:

当一个新用户注册时,他们会看到 20 个随机挑选的字典单词。他们被要求写一个至少包含五个这样的单词的秘密句子(我们称之为密码短语)。鼓励他们创造一个难以猜测但易于记忆的荒谬句子。如果他们想不出任何东西,他们可以选择多次刷新 20 个随机单词。

此密码短语将仅用作他们的密码。您只需检查他们是否使用了至少五个提供的单词,并采取与常规密码相同的安全措施。

我个人认为这是让人们选择强密码的一种非常人性化的方式;我提到的其他方法的问题似乎可以避免。当然,我可能完全错了,可能正在监督一些重要的事情。所以我真的很想听听这里的聪明人对这个系统的看法。

3个回答

这对我来说听起来很棒。

生成密码的全部意义在于选择一个攻击者极难猜出且授权用户易于记住和输入的密码。理想情况下,密码生成过程应该生成极难猜出的密码,即使攻击者确切地知道您使用了哪个密码生成过程(Kerckhoffs 原则)。如果“完美知识”攻击者发现很难猜出密码,那么其他攻击者会发现更难。

我将假设您使用的/dev/random是未损坏的(它连接到硬件随机数生成器或加密安全的伪随机数生成器)。

很多人似乎觉得,一个随机选取的大写字母,随机选取的小写字母,再加上一个随机选取的数字,一共10个字符组成的所谓“10位随机密码”就绰绰有余了用于许多目的。这给出了 ln2( 26^9 * 10 ) = 45.6 bits of password strength

如果您完全从 7776 个单词(6^5 个单词)的任何列表中随机挑选单词,例如标准 Diceware 列表或更易于在电话上键入的 Dialdice 列表,并且攻击者确切知道您是哪个单词列表使用,并且您的用户选择您选择的前 4 个单词,按照您选择它们​​的顺序,用户获得 ln2( (6^5)^4 ) = 51.7 位密码强度。

增加随机性?

如果用户随机点击刷新键,然后掷骰子从您呈现的单词中随机选择 4 个单词,然后掷骰子将这些单词随机排列以生成 4 个单词的 Diceware密码短语,然后(再次假设/dev/random没有损坏)我可以先验地计算它没有效果——用户仍然有 51.7 位的密码强度。

如果用户认为密码强度不够,那么我认为您的系统应该允许用户添加额外的字母、符号、单词等。

非随机选择的影响

您的用户不太可能做出完全随机的选择,但这没关系。在最坏的情况下——你的用户按字母顺序或选择其他顺序,攻击者不知何故知道确切的顺序,你已经从 4 中丢失了 -ln2( 4! ) = -4.6 位的密码强度-word Dialdice 密码。

如果我们假设用户总是拒绝某些单词,并不断刷新,直到他可以在没有这些单词的情况下创建密码,并且这些单词占字典的 1/6 左右,并且攻击者不知何故知道这些单词是什么,那么对于 4 -word Dialdice 密码我们已经丢失了大约 -1 的总密码强度。(最坏的情况是用户每按下刷新按钮 2^N 次就会丢失 N 位密码强度——但这对我来说似乎并不现实)。

这两种效果的结合使您的用户拥有 46.1 位的密码强度和 4 字的 Dialdice 密码 - 比 10 个随机字符的密码更强大,并且更容易记住。

如果您后来认为密码强度不够,则可以直接增加密码短语中的最小单词数,或切换到包含更多单词的单词列表,或两者兼而有之。(您可以使用“将旧 md5 密码迁移到 bcrypt 密码”中的方法来强制使用旧的、低强度密码的每个人升级到新的、更高强度的密码)。

这对我来说听起来很棒。

xkcd 漫画的想法是根据大约 2000 到 3000 个非常常见的单词的小型词典中的 4 个单词生成密码短语。

如果您让用户从可刷新的列表中选择单词,您会显着降低熵。让他们更改顺序也是如此。看看XKCD #936:短复杂密码,还是长字典密码?

因此,您需要提供一个更大的词典,其中包含不太常见的单词来弥补。

在实际方面:用户不喜欢输入长密码,尤其是在没有合适键盘的设备上。

虽然我喜欢用强密码帮助用户的想法(特别是受到 XKCD 漫画的启发),但我发现了一个问题。你的字典。这是一个多大的问题,显然取决于您的网站的用途。

首先,您的字典必须很大,并且需要包含不常见的单词。你仍然应该假设无论你有什么字典,其他人也会。我不是密码学家,但你真的需要很多字,因为这五个选项就是密码。问题的另一部分非常明显。你必须很好地保护它。如果某个邪恶的天才掌握了您的准确字典,破解了哈希值或试图访问该帐户,将会容易得多。

这就是您的网站的重要性所在。由于您为用户提供了密码,因此用户不太可能(但并非不可能)选择在其他地方使用相同的密码。因此,如果有人获得您的数据库,暴力破解哈希不会为他们提供真正有用的东西。

除了确保在 X 次登录尝试失败后阻止帐户(并使登录尝试变得非常慢)之外,这将有助于确保攻击者无法使用被盗字典访问帐户。

只是对这个有趣的主题的一些想法,我希望你觉得它们有用。