自动更正密码中的拼写错误是否安全?

信息安全 密码 密码策略 密码破解
2021-09-05 03:39:06

技术评论为什么自动更正密码是个好主意说:

新的研究表明,使用与修复文本消息和文档中的拼写错误相同的方法可以避免这些挫败感:自动更正。

“在我们看来,这是一件大事,”纽约市康奈尔理工学院雅各布斯理工学院康奈尔研究所教授 Ari Juels 说。“网站应该改变他们的密码政策,让用户的生活更轻松。安全性下降非常小。”

该文章还引用了论文密码 tYPOS 和如何安全地纠正它们,其开头是:

我们为任意用户选择的密码提供了第一种容错密码验证方法。

虽然他们说这是安全的,但这对我来说听起来是个主意。

这个想法实际上有多安全?

4个回答

全面披露:我是该论文的作者之一。

一个精确的密码检查系统会存储一个标准的加盐的、计算缓慢的密码哈希值。当密码(例如 password123)向身份验证服务注册时,会选择一个随机盐“sa”(这应该是 16 个或更多随机字节)并应用一个计算缓慢的哈希函数 H:H(sa,密码 123)。结果,称为 h,与盐 sa 一起存储在数据库中。如前所述,应该选择 H 慢(计算 10 秒或 100 毫秒)。正确配置的 argon2、scrypt 或 PBKDF2 是不错的选择。

当用户稍后尝试登录时,如果他们输入密码,则会重新计算哈希值并根据存储的值进行检查。在上面的示例中,如果用户发送密码 123,则重新计算(再次缓慢) H(sa,password123) 并检查结果 --- 它与先前计算的 h 匹配并且可以允许登录。提交的密码与之前注册的密码的任何偏差都会导致完全不同的哈希值,并且登录失败。

我们的想法很简单:如果第一次检查失败,系统可以对提交的密码额外应用少量“校正”函数,然后对结果应用哈希算法。例如,我们可能会修复一个大写锁定校正函数 F_caps,该函数将密码作为输入并输出更改所有字母的大小写的密码:F_caps(PASSWORD123) = password123 和 F_caps(pAsSwOrD123) = PaSsWoRd123。我们还可以修复首字母大写校正器:F_first(Password123) = password123 和 F_first(pASSWORD123) = PASSWORD123。请注意,这些很容易实现。

然后进行容错检查,将对先前注册的盐、哈希对 (sa,h) 和提交的密码 pw 应用以下逻辑

如果 H(sa,pw) = h 或 H(sa,F_caps(pw)) = h 或 H(sa,F_first(pw)) = h 则允许登录

例如,如果一个提交 PASSWORD123,则检查将针对 PASSWORD123、password123 和 PASSWORD123,第二个检查成功。

几点:

1)离线暴力攻击的功效与之前完全一样。为什么?因为我们只存储 sa,h。给定 sa,h 的攻击者只会通过尝试正确密码的暴力攻击来学习密码,在我们的示例中为 password123。这里没有安全性损失,因为我们没有改变 H 的计算方式。

2)远程猜测攻击的安全性变化可以忽略不计。我们通过论文中的广泛分析展示了这一点,但归根结底,在现实世界中,最好的策略是提交最有可能达到某个阈值的密码(例如,许多网站在 10 次尝试失败后锁定帐户)。由于错字更正而执行的额外检查可能会帮助攻击者更加幸运,但我们证明它基本上可以忽略不计。如果有人担心它,我们会提供进一步减少它的技术。

3) Typo-tolerance 会增加登录服务器的 CPU 使用率(当 H 是 scrypt 或 argon2 等内存硬散列时,可能还会增加内存负载)。这是因为 H 的计算调用速度特别慢。在实践中,这似乎并没有您预期的那么大(在我们上面的示例中为 3 倍),因为无论如何用户最终会在拒绝后重新提交,而您为每次尝试付出代价。

4) 我们不建议允许任意拼写错误。目前这甚至是不可能的,因为它需要重新计算 H 的次数令人望而却步(记住它很慢!),无论如何这都是不安全的。需要根据原则性分析仔细选择允许哪些错别字。我们相信上面提到的两个校正器,大写锁定和首字母大写,是安全部署的明智之举,除此之外它开始变得更加细微。

我们添加了一个提供更多信息的常见问题解答: https ://www.cs.cornell.edu/~rahul/projects/pwtypos.html

编辑:此答案不正确,请参阅票数最高的答案。在附录中,他们提到了“安全草图”,但在仔细阅读论文后,我发现他们推荐这种方法:

理论上,可以使用安全草图 [17] 来纠正服务器端的一些拼写错误。然而,现有结构的已证明界限太弱,无法为我们的环境(熵非常低)提供有意义的保护。

他们已经承认了我在这里写的观点并拒绝了这个想法。我完全错过了第一次阅读这篇论文的感觉。

--

尽管研究论文看起来非常可信,但我本人不同意他们的发现。尽管他们的计算是合理的,但他们的假设没有考虑到现实世界的攻击场景,也没有考虑到人们如何选择密码。

从本质上讲,他们所说的是一些常见错误,例如启用大写锁定、第一个字母不大写、添加或删除字符或敲击键盘上的相邻键。他们提出的解决方案允许忽略所有这些看似微小的错误,因此系统将接受足够接近的密码。

虽然这是对可用性的巨大改进(我们在输入密码时都会犯错),但安全性的权衡比他们承认的要大得多。部分问题是他们没有解决在线(登录到实时网站)与离线(获取哈希数据库并在您的计算机上破解它们)的问题。在离线攻击中,攻击者可能每秒暴力破解数十亿个密码,模糊密码将大大失败。

例如,假设黑客获得了包含一百万个密码的数据库并尝试对它们进行混合字典攻击。通常,密码破解软件会使用“密码”之类的单词并尝试其所有排列方式,包括 Password、pAssword、PAssword、password1、password! 等。不得不尝试每个字典单词的数百种排列方式。密码破解如此耗时。

在模糊密码的情况下,几乎所有这些排列都可以作为有效密码。假设它只是针对整组一百万个密码尝试“密码”。黑客会为每个帐户的单词和每个排列获得正确的匹配。这里的大问题是,许多人通过更改一个字母、使用随机大写、在末尾添加数字或标点符号等来增强密码强度。模糊密码使所有这些技术都无效。

重要的是,我们强制攻击者尝试每一次排列,以便每次尝试都获得一毫秒的时间。这正是我们使用 PBKDF2 等算法进行数百或数千轮散列的原因。密码破解软件与每个密码有关的每一项工作都对我们有利。

在论文中,他们正在考虑整个密码空间,并且他们正确计算出模糊检查不会显着减少攻击者必须暴力破解的可能密码数量。问题是密码在这个潜在空间中分布不均匀,而是聚集在由字典单词组成的相对较小的空间周围。如果您考虑到这一点,那么安全性的损失将是巨大的。

从这个角度来看,如果你用整个美国的表面积(380 万平方英里)来表示一个人可以选择的所有可能的密码,那么每个人使用的实际密码将适合大约 5 平方英尺的区域。如此狭小的空间中的模糊密码将是一场灾难。

这个想法适用于具有随意安全性和可用性很重要的系统。当与多个身份验证因素(例如硬件令牌或生物识别传感器)结合使用时,它也可能是可以接受的。但是,对于其他一切,该技术根本不够安全。

这里有两种可能的攻击场景:

  1. 离线破解
  2. 在线破解

在离线破解的情况下,论文仍然描述了应该应用强密码原理。这意味着没有模糊逻辑。只有知道盐和猜测输入来计算最终散列所需的工作。在这种情况下,论文的方法没有真正的优势或劣势。

在在线破解情况下,当攻击者针对某些在线资源随机猜测密码时,存在可用性和安全性的权衡。本质上,每次尝试都值得几次(取决于使用的校正算法和可能的校正量)。在单一账户的情况下,这里的权衡在理论上似乎是最小的。

然而,在现实的在线威胁模型中,攻击的规模要大得多僵尸网络尝试攻击普通密码,希望其中一些密码是纯属偶然的。本文所描述的内容会大规模增加帐户泄露的整体风险。

最终归结为安全可用性权衡。在这种情况下,我不愿意在任何规模上制定这样的政策,因为它会有效地增加恶意尝试的有效性。

根据该论文,在离线暴力攻击的情况下,安全影响为零。这是因为包含散列密码的数据库没有更改。拼写错误的在线检查使用“精确检查”,即与存储的散列匹配,作为子程序。