密码复杂性要求是否会通过限制搜索空间来降低安全性?

信息安全 密码
2021-08-28 04:15:32

我读过密码复杂性要求使密码更容易通过暴力攻击来猜测。这样做的原因是复杂性要求实际上通过消除可能的密码来减少暴力猜测的搜索空间。我会进一步提出这个想法,建议人类用户生成的密码往往完全符合复杂性要求。也就是说,如果要求密码必须至少为 8 个字符且至少包含 1 个数字字符,那么人们倾向于提出的密码将恰好是 8 个字符长并且将包含恰好包含 1 个数字字符。这将产生减少搜索空间的效果,从而使得猜测以这种方式创建的密码几乎是微不足道的。

我的问题是这样的:

密码复杂性要求是否确实会通过减少允许的密码数量来使密码更容易被猜到,从而降低整体安全性?链接到详细分析和讨论的额外积分。

这是一个重要的问题,因为如果这是真的,那么当提出这些类型的需求时,我们作为程序员有责任推回产品管理。

4个回答

简短的回答是肯定的,但不是真的。密码复杂性要求确实通过限制可能密码的数量略微减少了搜索空间。但是,用户不会在所有可能的密码集上统一选择密码(他们偏向于单词、日期等......)。

组合分析

为简单起见,假设我们要求用户输入一个八字符、不区分大小写的字母数字密码(/^[a-z0-9]{8}$/,如果您愿意的话)。

如果没有复杂性要求,则有 36^8 个可能的密码。这大约是 2.8 万亿种可能性。

假设您随后强加了一个要求,即恰好一个字符是一个数字。数字只有十个选择,但它可以出现在八个位置中的任何一个。这留下了 26^7*10*8 种可能性,或大约 6400 亿种可能性。

当然,如果没有复杂性要求,用户不太可能在密码中使用奇怪的符号。如果在这种情况下,数字是我们奇怪符号的代表,这意味着每个位置实际上只有 26 个可能的选项。这留下了 26^8 或大约 2080 亿个可能的密码。具有复杂性要求的密码比来自有偏见的用户的无限制输入好 3 倍以上。

概括

所以是的,复杂性要求减少了可能的密码空间。但是,当存在对可能密码的一小部分的已知偏见时,它们会有所帮助。真正的复杂性要求不会将用户限制为单个特殊字符,并且可能有十多个特殊字符。真正的复杂性要求(包括标点符号、无限长度和“至少一个”要求)与允许用户输入任何(可能有偏见的)密码相比的好处远大于我在此处概述的内容。

防御蛮力攻击的最佳方法是缓慢的身份验证响应。如果一次猜测需要 1-5 秒来验证和响应,那么暴力攻击快速成功所需的时间就会变得太长,无法大规模实施。

然而,被盗密码的数据库表明,某些密码比其他密码更有可能。使用基于常用密码或常用词的攻击也可以进行有效的攻击。

一些复杂性规则可以通过消除常用单词和密码来降低这些类型的密码攻击的有效性,但通常相同的站点具有易于违反的密码恢复实用程序。

当然,用户可能会在其他地方使用相同的密码,并让其他帐户受到威胁。密码安全不是一个简单的解决方案。安全系统中最薄弱的元素定义了整个系统的安全性,而软件系统有很多元素,包括人为因素,都是易受攻击的。

答案是没有那么简单。在说复杂是好是坏之前,了解攻击密码的所有方法很重要,因为不同的要求旨在阻止不同类型的攻击。

正如您所指出的,给定来自同一字符集的两个同样长的密码,密码复杂性要求确实会减少整体搜索空间。例如,给定一个必须包含一个字母的 1 个字符的 ASCII 密码与一个可能是任何字符的 1 个字符的 ASCII 密码,更容易猜出第一个密码。

但密码字符要求不应用于排除长度。考虑以下密码要求集的最小强度:

  1. 8 个可打印的 ASCII 字符 = 大约 100^8 = 10^16 个可能的值
  2. 16 个可打印的 ASCII 数字 = 10^16 个可能的值
  3. 9 个可打印的 ASCII 字符,至少有 1 个数字、1 个字母(任何大小写)和 1 个符号 = ((10 个数字) (52 个字母) (30 个符号)*100^6) = 10^16

[注意:我知道 100 不是真正的数字,它只是让数学更容易]

所以我们看到三种不同的密码要求在蛮力要求方面同样强大。但是我们还没有对字典攻击做任何事情。在字典攻击中,我们只需测试一个众所周知的单词列表,看看其中是否有密码。让它们中的任何一个更长,你就让它比其他的更强大。

密码要求 1 对防止字典攻击没有任何作用,而 3 几乎没有作用。您可以使用字典中极有可能出现的“预防”一词。您可以查看已在 Internet 上泄露的真实密码列表(或创建您自己的流行服务并收集密码)并发现流行密码以优化您的攻击以获得最可能的值(例如,如果纽约的每个人都选择了“Yankee1!”,那么你的攻击将从尝试“Yankee1!”的变体开始)。

所以接下来自然要做的事情是防止密码是字典单词。这减少了有效密码的数量,但它也消除了攻击者可用的优化。使密码稍长一点,您可以保持无字典单词密码的强度或强度相同。

但这对 leet speak 密码没有任何作用。您不会在字典中找到 P4$$w0rd,但它是蛮力工具测试的一个非常标准的变体。提取字典中的每个单词,通过 leet speek、前置、后置运行它,并在每个位置插入一个或两个其他字符。

然后可以引入密码复杂性要求来限制这些类型的攻击 - 多个符号、多个数字和(再次)更长的密码。需要密码管理工具来跟踪的东西。蛮力很难(因为它越来越长)并且很难优化,因为它不在字典中,也不像字典中的任何东西)。

但是,当您破解特定密码并且用户更改为新密码时会发生什么?用户经常尝试做简单的事情,并选择一个容易记住的密码 - 一个与以前非常相似的密码。P4$$w0rd1 变为 P4$$w0rd2。但是攻击者只需将 P4$$w0rd1 添加到他的字典中,他就会自动测试 P4$$w0rd2。因此,通常不允许重复使用密码。

但问题的核心是,“它是否适合组织的需求?” 考虑到我们甚至还没有开始讨论的所有其他补偿控制,您需要一个足够强大的密码以确保它的安全性(例如,它已更改或帐户被禁用)。如果暴力破解速度很慢,或者你只有很少的机会,那么较弱的密码是可以的(例如,IronKey 允许 17 次尝试并且需要物理访问,所以 10^16 的密码已经足够强大了)。

我想对您的问题补充一点:密码复杂性要求是否会通过理论上限制搜索空间来降低安全性?还是实际上?

我的意思是,
据我所知,从技术和实践的角度来看,密码复杂性策略不排除字符集,而是强制使用其中的一些,通过使用密码复杂性策略,您可以强制用户至少使用例如来自不同字符集的 4 个字符,即:密码必须使用至少三个数字(数字的字符集)、一个大写字母(大写字母字符集)、两个符号(特殊字符集)和一个小写字母(小写字母)字符集)。

您没有强制执行排除,例如:“您不应在密码中使用空格”或“您不得在密码中使用数字”。所以你没有减少字符空间。

总之,我认为密码复杂性不会减少搜索空间。

但从实际和现实世界的角度来看,事实是:
我们正在与人类合作,他们中的大多数人都懒得思考、生成和记住一个好的或至少一个标准的密码。
实际上,实际使用的密码属于非常有限的搜索空间:小写字母和数字(考虑随机生成的密码),但甚至不是完整的空间,真实的搜索空间在现实世界中要小得多。
真正的搜索空间是常用密码数据库 + 您的用户懒惰的总和!
计算机名称 + 123,在主机上运行的服务名称 + 12345 以及更多愚蠢的密码!!!
你不知道我可以在他们的远程桌面、FTP、根、域管理员等上使用这些密码成功渗透测试的地方我不是在谈论 SOHO,我是在谈论企业组织、防火墙设备提供商等
。一个全球性的例子,COMODO。帮助入侵者实现目标的主要因素之一是弱密码。

我想说的是,如果没有密码复杂性策略,则不会使用实际空间,我请您参考我很久以前在“完美密码”中阅读的示例。

如果密码可能性空间是全世界,98%的密码都在你家后院1平方米的区域!

所以在我看来,密码复杂性并没有减少搜索空间,因为它不排除任何字符集,但它实际上通过强制使用其他不正常使用的字符集来增加搜索空间

PS:关于密码复杂性的提示,一个好的密码复杂性强制策略必须认真对待密码的熵。