密码规则:我是否应该禁止像 XKCD 的 Tr0ub4dor&3 这样的“leetspeak”字典密码

信息安全 密码
2021-08-24 01:21:53

TLDR:我们已经要求对某些用户进行双重身份验证我正在散列、加盐和做一些事情来鼓励长密码。一般来说,我对密码复杂性规则的优点不感兴趣。有些是法律要求的,有些是客户要求的。我的问题相当狭窄:我是否应该将诸如 Tr0ub4dor&3 之类的 leetspeak 密码检测为字典单词,从而使主要由单个字典单词组成的密码(即使 leeted)失败。多字密码短语总是被接受的,不管是否 leeted,这只是关于那些选择使用更传统的短密码的人的问题。

我是即将公开敏感个人信息(主要是犯罪历史、SSN等)的政府网站的首席开发人员。该网站将被公众使用,用于对员工进行背景调查等。

在后端,我正在存储使用 PBKDF2 散列的密码,并在每个用户的基础上进行非常高的迭代,因此针对更强密码的蛮力散列攻击是不现实的(目前),并且网站将用户锁定 10 分钟经过五次糟糕的尝试,所以你也不能真正那样暴力。

我的客户/合作伙伴对我实施的密码规则的严重性提出了一些反对意见。

显然,我希望人们使用 16-20+ 个字符的密码,但这是一个行动缓慢的官僚机构。因此,除了允许/鼓励那些好的密码之外,我还必须允许一些较短的“硬”密码。我只是想限制我们的曝光。

特别是,“没有字典单词”的要求令人沮丧,因为我不允许使用经典的 leetspeak 密码,例如XKCD 著名的 Tr0ub4dor&3(对于那些好奇的人,我通过 leetspeak 排列翻译器(包括删除字符)运行建议的密码,然后将每个排列与字典进行比较)

我是不是太严重了?我是“Avids 可用性规则”的坚定支持者——以牺牲可用性为代价的安全是以牺牲安全为代价的。但在这种情况下,我认为这更像是一个习惯/教育问题。我允许没有限制的 diceware/可读密码短语密码,只有“普通”密码有更高的要求。XKCD #936: 短复杂密码,还是长字典密码?

我应该尝试通过更好的 UI 帮助来解决这个问题吗?我应该坚持我的枪吗?最近发生的多次备受瞩目的黑客攻击,尤其是那些暴露密码的黑客攻击让我觉得我是对的,但我也不想无缘无故地让事情变得愚蠢。由于我很好地受到了蛮力攻击的保护(我认为/希望),这是不必要的复杂性吗?或者只是很好的深度防守?

对于那些无法理解密码短语或真正随机密码的人来说,“两个单词加数字/符号”密码似乎既简单又难破解,如果我能让人们阅读说明的话……

想法:

  • 更好的密码提示/更显眼地显示(太主观了?)
  • 更好的强度计(基于 zxcvbn 的东西? - 在客户端而不是在提交之后会使字典单词失败)
  • 禁止所有“短”密码,强制人们只使用密码,这使得规则更简单?
  • “给我设置密码”按钮,为他们生成密码并让他们将其复制到密码字段中
  • 放弃并让 leetspeek 密码通过?

以下是我目前在密码说明/规则中的内容:

  • 16 个字符或更长的密码(最大无限制)

    或者

  • 至少八个字符

  • 包含以下三个
    • 大写
    • 小写
    • 号码 0123456789
    • 符号 !@#$%^&*()_-+=,./<>?;:'"
  • 不基于字典单词
  • 不是您的用户名

不被接受的密码示例

  • Troubador(单字典词)
  • Troubador&3(单字典单词加数字和符号)
  • Tr0ub4dor&3(基于单个字典单词)
  • 12345678(不包含3/4字符类型)
  • abcdefgh(不包含 3/4 字符类型)
  • ABCDEFGH(不包含 3/4 字符类型)
  • ABCdefgh(不包含 3/4 字符类型)
  • ABC@#$%!(不包含 3/4 字符类型)
  • ab12CD(太短)

将被接受的密码示例(请勿使用这些密码中的任何一个):

  • 正确的马电池订书钉(Diceware 密码)
  • 浮动的东西应该成为任务(可读密码 - 链接到 makemeapassword.org)
  • 好密码4!(多字、大写、小写、数字、符号)
  • Yyqlzka6IAGMyoZPAGpP(使用大写、小写和数字的随机字符串)
4个回答

这里的错误是相信额外的密码规则可以提高安全性。他们不。它们增加了用户的烦恼;他们让用户选择更难记住的密码。由于某种奇怪的心理原因,大多数人认为在某种本体论上,带有非字母符号的密码比只有字母的密码“更安全”。然而,这是完全没有根据的。

一个“密码规则”对安全无害:最小密码长度。这是因为两件事的结合:

  • 最愚蠢的蛮力攻击会枚举所有符号序列,从序列 1 开始,然后是 2,以此类推。从这个意义上说,一个只包含 4 个符号的密码可以说是非常弱的。

  • 用户理解枚举所有小密码的概念。他们准备好接受至少需要输入 6 或 7 个字母。

所有其他规则充其量是中立的,但实际上它们中的大多数会降低安全性,因为它们会诱使用户:

  1. 设计并相互共享用于生成服务器将接受的密码的“方法”,这些方法通常具有很多标点符号但熵很少;

  2. 写下他们难以记住的密码;

  3. 在其他系统上重复使用密码,原因与记忆困难相同。

“密码强度计”也是有害的,因为:

  • 它们不可靠,也不可能可靠。密码强度计仅测量给定密码与计量器代码所体现的确切蛮力策略对抗的时间长短,但没有攻击者被限制遵循完全相同的策略。

  • 密码强度计无法测量密码选择中占主导地位的熵,因为它们只看到结果(密码本身)。

  • 他们将密码选择变成了一种游戏,鼓励用户采取诙谐的策略,而机智正是我们不想要的密码。安全密码力求随机性

可以提供很大帮助的是提供密码生成系统。注意使该系统可选:您希望用户愿意使用它,而不是强加于他们,以免他们反抗(并写下密码,共享和重用)。


所以我的建议是:

  • 拒绝少于 7 个字符的密码(因为您有一个针对在线攻击的缓解系统 - 即在 5 次错误尝试后自动锁定 10 分钟 - 您可以容忍相对较短的密码)。但没有其他规则。任何 7 个或更多字符的序列都可以。
  • 提供一种或更好的几种可选密码生成机制,例如 diceware、“正确的马”事物等等。
  • 鼓励使用密码管理器。
  • 如果可能,请尝试查找密码以外的其他内容来验证用户。

我的断言是,您将事情推向了一个有点倾斜的方向,而不是完全正确的方向。特别是,坚持使用某些特定字符的密码规则是一件坏事(一件常见的事情,但仍然是一件坏事)。

的索引(除以节点数——状态参与者有很多节点):

字典 数数
〜兰德
字符
破解
MD5
破解
PBKDF2
字母数字(字母、数字) 62 5.95 0.9 0s 0s
随机可打印字符(美式键盘上的任何键) 94 6.55 1.0 0s 0s
Diceware 字典词 7776 12.92 2.0 0s 0s
标准美式英语 (en_US) dict word 100k 16.61 2.5 0s 0s
大型美国英语词典单词 650k 19.31 2.9 0s 1s
任何维基百科中的任何单词(任何语言) 58.4M 25.80 3.9 0s 58s
带有随机案例的标准 en_US 字典 6.3M 22.60 3.4 0s 6s
具有 l33t 变体的标准 en_US 字典 6.3M 22.60 3.4 0s 6s
Std en_US w/拼写错误 +(rand case 或 leet) 38M 25.18 3.8 0s 38s
Std en_US w/ rand case + 错别字 + leet 2.4B 31.18 4.8 0s 41m
带有随机案例(或 l33t)的维基百科词 3.7B 31.80 4.9 0s 1小时
带有拼写错误的维基百科词+(rand case xor leet) 22B 34.39 5.2 0s 6小时
rand order: 5 低, 1 特殊, 1 num, 1 高 1e11 36.52 5.6 2s 1天
rand order: 6个lower和2个upper/num/special 4e11 38.67 5.9 10s 5天
兰特顺序:6 下,1 规格/上,1900-2100 年 4e12 41.70 6.4 1m 49天
rand order: 7 个 lower 和两个 upper/num/special 1e13 43.37 6.6 4m 131d
rand order: 8 个 lower 和两个 upper/num/special 3e14 48.07 7.3 2小时 4年*
4 字 diceware 密码 4e15 51.70 7.9 二维 8年*
8 个字符(可随机打印)密码 6e15 52.44 8.0 二维 9岁*
5 字 diceware 密码 3e19 64.62 9.9 6年* 27岁*
10 个字符(可随机打印)密码 5e19 65.55 10.0 6年* 29岁*
4 个标准 en_US 单词 1e20 66.44 10.1 7年* 31岁*
3 个标准 en_US 单词和一个大 en_US 单词 6e20 69.10 10.5 11年* 35 岁*
3 个标准 en_US 单词和 3 个随机可打印字符 8e20 69.46 10.6 12年* 35 岁*
6 字 diceware 密码 2e23 77.55 11.8 26岁* 47岁*

“任何维基百科”包括所有语言的维基词典、维基教科书等,2009 年有5840万个唯一词。Dicewarexkcd 漫画的基础。我假设随机混合大小写的单词大小为六个字符(因此有 2⁶ 额外的迭代),并且我假设 leet 变体与混合大小写一样丰富。我将值 6 用于故意拼写错误/拼写错误。

破解时间是对顶级单节点破解系统的估计,每 18 个月升级一次以考虑摩尔定律(当您看到星号时,*)。当检查了一半空间时,就认为空间已破裂。基于 GPU 的破解可以在单个计算机节点上以23B/s 的速度测试 MD5 PBKDF2更健壮,在 2013 年估计在4 GPU 系统上为300k/s(27mo 前 → 2 27/18,因此 300k × 2.828 = 849k/s → 如本表中所用,四舍五入为 1M/s,8.4 年前 → 2 8.4/1.5 = 14551k/s → 2021 年四舍五入到 15M/s)。

(自我注意:阅读并合并/驳斥Jeffrey Goldberg 在 Quora 上的密码破解数学

 

这个问题在我的另一个答案的评论中得到了澄清(我离开了,因为它可能仍然有帮助)。它实际上只是询问是否允许leetspeak两因素身份验证已用于高安全性区域。

“吟游诗人”这个词不在我的标准字典里,但在我的大字典里。大写单词的第一个字母不是随机混合大小写(这是一种常见的密码拓扑),所以它只会加倍计数。因此,它的随机可打印字符等价物log₂(650k × 2⁶ × 2) / 6.55只有四个字符!

因此Tr0ub4dor&3相当于六个随机可打印字符的复杂度。一个弱密码,但与人们创建的大多数密码一样强,以最低限度地满足复杂性要求。

如果六个随机字符太弱,您应该禁止“leetspeak”字典密码。

为了彻底彻底,您可能还需要一个大字典,这样您就可以像我一样计算单词,否则presidentclinton您的系统将接受像(33.22 位,5 个字符,由于相关而实际上较低)这样的密码。

其他密码规则应始终使用以下规则进行调整:

“获取有效密码并使其保持最新状态越困难,人们就越有可能将其写在日程表中。”

因此,您的问题是一个社会问题。您可以提供多少关于良好密码管理的教育与您可以提供多少强制执行。您必须为自己的业务平衡这一点。听起来您有重要的信息需要保护……是否有人培训操作员如何处理此类敏感信息?或者他们只是盲目地依赖你和哈希算法来为他们做这件事。

仅仅因为它不同,我会考虑在输入错误密码时提出学习经验。我认为这可能是方法之间的平衡。更重要的是,它可能会激发您找到更好的解决方案:

  • 具有最小密码长度。这是最基本的要求,您必须强制执行
  • 如果密码很弱,让他们知道它很弱,并提出让他们无论如何都可以使用它(带有一些文字表明您信任他们能够正确保护自己的凭据)
  • 接受弱密码时,请附上一些文字说明您认为它的弱点(“看起来您使用 l33t 使您的密码看起来更安全。猜猜看:不是!这个密码比您实际认为的弱 45000 倍")

如果您不害怕任何人窃取和暴力破解您的密码,那么您最有可能发现密码的情况就是网络钓鱼攻击。密码复杂性要求不会保护您免受网络钓鱼攻击。

如果您使用非常复杂的密码,用户会找到一个有效的密码并坚持使用,当密码过期时,他们会进行最细微的更改并继续使用。这意味着确定的网络钓鱼者将能够相当快地猜出新密码。

考虑使用 2 因素身份验证,因为没有密码复杂性方案可以保护您免受用户操作的影响。(请记住,用户也是人,并且希望在不花一整天时间输入密码的情况下完成工作)

顺便说一句,这里有几个相关的问题:

密码复杂性规则会适得其反吗?

密码复杂度的推荐策略