随机生成的密码的最佳长度是多少?(安全性与兼容性)

信息安全 密码 密码破解 密码策略 密钥生成 账户安全
2021-08-27 12:02:30

通常建议为每个在线服务使用唯一的密码,使用随机密码生成器来创建它们,并使用密码管理器来存储它们。

我已经开始用这种技术替换我所有的在线密码,但有些网站对密码长度有一定的规定。

不幸的是,有时,网站不会被编程来传达允许的最大字符数,如果复制到密码字段中,只需删除溢出。正因为如此,我在找回帐户控制权时遇到了一些麻烦,因为我不知道有多少个字符被保存为密码。

是否有任何特定数量的字符可能适用于大多数站点/后端程序,并且对于随机生成的密码仍然被认为是相对安全的,以便我可以为尽可能多的站点使用一个密码生成器长度设置?

4个回答

如果您的密码是从一组 95 个字符(大约是所有 ASCII 可打印字符减去空格)中以相等概率随机抽取的n 个字符,那么每个字符给您大约 6.6 位的熵,因此随机密码的强度n 个字符为 6.6 × n所以:

  • 10 个字符的密码为您提供大约 66 位的强度;
  • 12 个字符的密码为您提供大约 79 位的强度;
  • 14 个字符的密码为您提供大约 92 位的强度;
  • 20 个字符的密码为您提供大约 132 位的强度。

根据我的判断,您可以根据应用明智地选择这些长度中的任何一个。例如,如果您为低价值的在线服务使用 66 位密码,那么您的密码仍然会比几乎所有使用该服务的人都强。但是,如果我们谈论的是用于在您自己的硬件上运行的软件上派生加密密钥的密码,那么您当然应该考虑更强大的密码。


为了增加一些额外的想法,考虑两种攻击是值得的:

  1. 针对您注册的网站(或其他受密码保护的服务)的攻击;
  2. 专门针对你的一次攻击

在场景 #1 中,密码破解者将分配他们的计算能力来破解尽可能多的用户密码,以期找到唾手可得的果实——密码非常弱的用户。我相信 64 到 80 位的密码足以保护您的密码免受此类攻击。

在场景 #2 中,攻击者将使用他们所有的计算能力专门破解您的密码。在这种情况下,强大的对手可能(也可能不会!)能够破解 66 位密码,因此您可以证明最多 19-20 个字符(以匹配大多数密码的 128 位安全强度) )。

并且始终牢记,如果您的密码足够强大,那仅意味着 #2 攻击者将探测不同的弱点。如果您在其他地方有大漏洞,请不要费心让您的密码过于强大。

我将与其他答案(到目前为止)有所不同,并建议如果您为每个网站生成一个唯一的随机密码,则根本不需要很长的密码。

让我们考虑一下对密码的威胁。我们将只看服务器端(即,我们不会考虑您 PC 上的击键记录恶意软件之类的事情,因为密码长度在那里没有多大帮助)

所以基本上与密码长度相关的攻击分为两类。在线暴力破解和离线暴力破解。

在在线暴力破解中,攻击者试图猜测您对网站的密码,因此他们每次尝试都会提交一个请求。实际上,许多站点会在多次错误请求后锁定,但为此我们假设它们不会

现在假设攻击者每秒可以进行 1000 次猜测。如果您(例如)使用大写、小写和数字字符选择了 8 个字符的随机密码,则有 62^8 个选项。以这样的速度,我们正在谈论宇宙的热寂,然后他们才猜到。

现在有人可能会说“如果攻击者让僵尸网络猜到了怎么办,他们可以走得更快!”,我建议您在使这个速度足够快以实用之前几乎对任何站点进行 DoS。

好的,让我们谈谈离线蛮力,因为它与密码长度更相关。在这里,攻击者已经获得了您的密码哈希的副本,因此他们很可能已经彻底破坏了该站点的安全性。在这里,您可以提出一个论点,即您希望密码持续足够长的时间,以使网站注意到他们已被加密并让您重置密码。

确切地说多长时间有点棘手,因为这在很大程度上取决于网站如何存储他们的密码。如果他们使用未加盐的 MD5,那与他们使用具有高工作因子的 bcrypt 相比有很大的不同。

然而,在这一切中要考虑的一件事是影响。这个密码被破解有什么影响。好吧,如果您为每个站点都使用了唯一的随机值,那么影响可能非常有限。希望您的高价值网站都使用 2FA,因此仅凭密码就不会让攻击者走得太远,而低价值网站,那么妥协的后果是什么?

所有这些分析并不能真正回答您的问题,但根据经验,我建议您是否使用 10-12 个字符以及大写、小写和数字,并且密码真的是随机的(这是重要的一点)你'是a)可能很好,b)不太可能遇到任何网站限制的问题。

根据这篇关于密码破解的文章,“超级计算机或僵尸网络”破解 10 个字符的大、小、数字密码需要 83 天。您必须问自己的是,攻击者是否可能会投入成本来破解一个他们已经损害目标站点安全性以获取哈希的单个密码......

从我个人的临时使用和测试中,我发现了 20 个随机字符,使用大/小/数字加上一些精心挑选的特殊字符(@#$._ 不包括括号),这是一个很好的组合:

  • 好的长度 - 不太可能被静默截断(一旦超过 20,更多的网站要么开始静默截断 - 正如你所见 - 否则他们拒绝它们“太长” - 20 过去对于目的,但在过去几年中情况发生了变化)
  • 非常好的键空间大小 ((26+26+10+5)^20 = 3.32x10^36) -即使对于不久的将来的民族国家时间旅行者来说,也承认过大,但旨在涵盖几乎所有潜在的威胁模型(包括考虑摩尔定律和国家级资源)几乎适用于所有人,而且不会太长
  • 满足大多数简单/传统的复杂性要求(包括要求至少一个特殊字符)
  • 满足许多“复杂性”要求(禁止字符)

换句话说,这是一种我认为适合大多数威胁模型和用例的方法。

除了多年来我自己的登录实验之外,我没有正式的数据来支持这一说法,但这是我的看法。随着时间的推移,您可能不得不修改特价清单,但您明白了。

编辑以添加示例命令行:

echo $(tr -d -c 'A-Za-z0-9@#$._' </dev/urandom | head -c 20)

可悲的是,没有允许密码的标准,网站之间也没有任何相似之处。开发人员设置他们认为可能有助于安全的任何限制,其他人则根据外部(但也是完全任意的)规则设置限制。这意味着,如果您发现 14 个字符的密码达到最佳状态,您仍然需要处理其他不兼容的规则:一些大写、小写、数字或符号,并且您将使用受限字符集彼此不兼容。一些站点只允许很少的特殊字符(或根本不允许),以期避免 SQL 注入攻击;其他人需要不同的特殊字符,因为他们错误地认为更广泛的字符集可以提高安全性。

您最好的选择是让您的生成器可配置,并将每个站点视为一个独立的规则来源。