根据XKCD:密码强度,如果密码由“四个随机常用词”组成,它将是安全和难忘的。
我想制作一个 Web 应用程序并让用户以这种方式创建他们的密码。每个密码至少应包含 16 个字符,并且必须是至少 4 个单词的句子,以使其更加安全和易于记忆。但这会让攻击者知道所有的密码都是这样的。这是一个坏主意吗?
有什么更好的方法可以同时强制使用更安全和更容易记住的密码?
根据XKCD:密码强度,如果密码由“四个随机常用词”组成,它将是安全和难忘的。
我想制作一个 Web 应用程序并让用户以这种方式创建他们的密码。每个密码至少应包含 16 个字符,并且必须是至少 4 个单词的句子,以使其更加安全和易于记忆。但这会让攻击者知道所有的密码都是这样的。这是一个坏主意吗?
有什么更好的方法可以同时强制使用更安全和更容易记住的密码?
这不一定是个坏主意。考虑到 4 个单词足够随机,攻击者可以知道密码是这种格式。但事情就是这样,还有其他好方法可以制作令人难忘的强密码。将您的用户限制为您喜欢的用户并不是很好。例如,我使用具有真正随机长密码的密码管理器,这甚至比您建议的要好,但我无法在您的网站上这样做。
更重要的是,如果您要这样做的原因是强制用户使用强密码,则为他们生成 4 字密码。您可以通过使用字典来生成此类密码,然后在 1 和字典中的单词数之间选择随机数并获取该单词。这样做 4 次,你就有了密码。你可以在这里得到灵感。这很重要,因为大多数用户可能不会选择 4 个真正随机的词,而是选择 4 个容易猜到的词。在这种情况下,这会比让他们选择任何密码更糟糕。
您是在暗指Kerckhoff 原则。当我们设计密码系统时,我们假设攻击者将知道您系统的所有信息,除了熵派生部分(通常是密钥/密码/等) - 这是因为我们不能保证他们不知道细节,但是必须假设他们不知道我们生成的密钥。任何密码生成方案都遵循这个推理 - 如果说密码方案是安全的,那么您可以相信知道您正在使用哪种方案的攻击者不是问题。
这不是问题的原因是密码命名空间的工作方式。如果您要求用户根据已知的 diceware 列表(例如 EFF 列表)生成密码,并且要求其长度至少为 4 个字,那么我们可以计算命名空间复杂度。
首先,我们将找出一个单词的命名空间——在 EFF diceware 列表中,您掷出五个六面骰子并选择出现的结果。因为有五个位置和六个选项,我们可以计算出 6^5,得到 7776 - 这意味着每个位置有 7776 个不同的可能单词。
现在,我们可以计算其中四个单词的最小命名空间复杂度。这可以通过取可能的单词数并将其提高到密码中单词数的幂 - 7776 ^ 4 来完成。这为我们提供了 3656158440062976 (3.6 Quadrillion) 四个 EFF diceware 单词的可能不同密码。
现在,要猜测这需要多长时间,我们必须做出一些假设——
您正在使用一个很好的散列算法 - scrypt、bcrypt、PBKDF2 等。
攻击者拥有消费级硬件。- 我们将查看 8x 1080 TI 阵列的一些基准测试,这些基准在撰写本文时处于领先地位,但不应被视为最大哈希率 - NSA 等可能有专门用于哈希的硬件密码尽可能快。
我们可以从这个基准测试中看到,在 OpenCL 中,具有 8x 1080 Ti 的攻击者可以以以下速率攻击好的算法:
因此,对于我们给定的 3.6 万亿个可能密码的命名空间,我们可以计算以下预期的破解时间——请记住,平均而言,50% 的命名空间需要耗尽,而不是 100%。
因此,我们可以看到您还需要实现一个好的散列算法。
该算法缺少两件事 - 首先,我们没有省略短于 4 个字符的单词。EFF diceware 列表中有许多 3 个字符长的单词。如果增加最小字长,就会减少命名空间。我认为 EFF 列表有大约 500 个单词,长度为 3 个字符,但这是一个猜测。因此,命名空间稍微不那么复杂。
其次,我们对待这些密码是随机派生的。因为您想要句子,所以我们需要记住句子不是随机的。如果您希望这些句子有意义,那么您可以对它们进行攻击——您可以使用马尔可夫链和其他有趣的东西来生成可能的句子,而不是简单地暴力破解密码。我没有关于这比暴力破解容易多少的统计数据,所以我要继续说你应该假设它会产生巨大的差异并且要弱得多。
通过告诉攻击者密码至少有 16 个字符长并且由 4 个或更多单词组成,您不会损害密码的安全性。这就像告诉密码必须至少有 10 个字符,至少有一个大写字母,一个数字和一个符号。对?
使用 4 个单词,暴力破解的成本大于 10 个随机字符。如果您要求用户至少使用一个大写字母,则成本会增加更多。
根据牛津词典,英语的单词少于 175k。有 8.64 × 10 20种可能的组合。使用英文键盘上的所有 95 个字符,您有 5.98 × 10 19种可能的组合。
好记性。一个 4 字的密码肯定比随机密码更容易记住,但这并不意味着普通用户会在不写下来或使用密码管理器的情况下真正记住它(现在有太多不同的密码需要记住)。所以可记忆性是有用的并且很棒,但它可能没有你想象的那么有用。
安全。仅当从足够大的单词集中随机选择单词时,4 单词密码才会比普通密码更安全。根据这篇文章,我发现普通用户使用的密码的熵预计约为 21 位(2 21 = 2.1 × 10 6),这令人担忧。如果您从 1000 个最常见的英语单词列表中随机选择 4 个单词,您将有 1000 4 = 10 12种可能性,因此破解密码的难度是普通密码的 100 万倍。
所以,总的来说,你的想法还不错,只要你不让你的用户选择他们自己的话,否则他们最终会选择“pass pass pass pass”或“1 2 3 4”等密码. 当然,这都是笼统地说,因为在某些特定情况下,您的方法实际上会降低密码的安全性。例如,您的方法会降低我的密码的安全性,因为默认情况下我倾向于使用长随机密码,所以如果您强迫我在您的应用程序上使用您的方法,我将使用比平时更不安全的密码。类似这样的社区可能也是如此,我希望平均密码熵远大于 21 位,并且可能大于您的 4 字密码。