密码与熵:您安全背后的科学

忘记过时的密码规则。探索香农的熵理论、格罗弗的量子威胁,以及保护您访问权限的真正 OPSEC 技巧。

|

阅读时间:2 分钟

密码与熵:您安全背后的科学

« 您的密码必须包含 8 个字符,一个大写字母,一个小写字母,一个数字和一个特殊字符。 »

我们都知道这个规则。然而,在网络安全中,这被称为“安全剧场”。像 P@ssw0rd1! 这样的密码遵守了所有这些规则。但它只是一个经过可预测替换的常见单词,而这正是破解工具最先尝试的。

真正的安全不依赖于武断的视觉规则,而是基于无情的数学现实:熵(entropy)。

香农的熵理论

为了理解密码的强度,我们必须求助于信息论之父克劳德·香农(Claude Shannon)。熵衡量信息的极度不确定性或不可预测性。

应用于密码时,熵以比特(bits)计算。比特数越高,计算机就越难预测密码。随机生成的密码的熵 (E) 的简化公式为:

E = L × log2(R)

  • L 是密码的长度。
  • R 是字符池大小(小写字母为 26,加上大写字母和数字为 62,加上所有可打印符号为 94)。我们生成器的四种字符类型合计 91 个,因为它的符号集有 29 个字符。

增加字符池大小(添加符号)会增加熵,但增加长度(添加字符)会更显著地增加熵。然而,长度只有在一个条件下才能战胜复杂性:密码必须完全随机生成。

暴力破解 vs. 字典攻击

如果您使用单词或可预测的结构,纯长度的规则就会崩溃。

黑客软件不会逐个尝试所有字母组合(这被称为暴力破解 / Brute Force)。他们使用过去数据泄露中流出的真实密码组成的庞大列表,以及常见单词和短语。这就是字典攻击(Dictionary Attack)。

如果您的密码很长,但由字典中的单词或可预测的替换组成,其真实熵将急剧低于其理论上的数学熵。

下表只采用一条规则:每秒 1000 亿次尝试,这是我们的生成器页面针对快速哈希算法的离线破解所假定的速度。时间为平均值(即一半的可能组合),并使用与该页面相同的公式向下取整。每个密码最快的破解途径以粗体标出:

密码若每个字符都随机时的熵暴力破解(平均)字典攻击(我们的估算)
password12356 比特(11 个字符,小写字母和数字)7天不到 1 秒
S3cr3t!9958 比特(9 个字符,全部四种)24天不到 1 秒
correct horse battery staple133 比特(28 个字符,小写字母和空格)超过1万亿年1分钟
gL7!pQ9z#vX278 比特(12 个字符,全部四种)5.1万年无捷径

字典攻击一列是估算值。它假定攻击者的猜测遵循每个密码的结构,且每个基础单词都在最常见的 1,000 个单词之内:

  • password123:一个常见单词加三位数字。即 1,000 × 1,000,约 100 万次猜测。
  • S3cr3t!99:一个常见单词,首字母大写或不大写,每个 ’e’ 替换或不替换为 ‘3’,再加上任意三个字符的后缀。约 70 亿次猜测。
  • correct horse battery staple:四个常见单词。让它出名的 xkcd 漫画将“从 2,048 个单词的列表中选出的四个单词”计为 44 比特。按同样的速度,平均需要 88秒钟,向下取整为 1分钟。
  • gL7!pQ9z#vX2:没有单词,也没有模式,因此暴力破解就是最快的途径。

这些估算假定攻击者并不知道每个密码。本文中的每个密码现在都已公开,因此都应视为已在字典中。公开过的密码就是作废的密码。

Leetspeak(骇客语)的错觉与变异规则

以 S3cr3t!99 为例。在视觉上,它看起来复杂且坚固。然而,它仅仅是字典里的单词 “secret”,其中 ’e’ 被替换成了 ‘3’,并加上了一个非常常见的后缀(!99)。这被称为 leetspeak。

面对字典攻击,这个密码撑不过 1 秒,而不是它的长度所暗示的 24 天。现代破解软件(如 Hashcat)不仅会测试静态单词列表;它们会自动应用变异规则(mutation rules)。它们会获取字典中的每个单词,测试所有可能的 leetspeak 组合,交换大小写,并添加年份或符号。Leetspeak 提供的是虚假的安全感。

键盘偏移技巧 (Keyboard Shift)

为了使一个容易记住的短语变得复杂,有些人使用键盘布局偏移技巧。例如,您记住了一个短语如 my-cat。但在输入时,您将手指放在物理 QWERTY 键盘上,而您的操作系统配置为 AZERTY(法语)。

  • 想到的词: my-cat
  • 输入的结果: ,y)cqt(’m’ 键变成了 ‘,’;’-’ 变成了 ‘)’;‘a’ 变成了 ‘q’)。

在 OPSEC 中这是个好主意吗?不,如果单独使用,这种方法是不够的。 就像 leetspeak 一样,键盘布局偏移是一种固定的替换:怀疑使用了这种技巧的攻击者,会对每一次猜测套用同样的映射。在 OPSEC 中,这就是隐蔽式安全(security by obscurity):它可以延缓业余攻击者的速度,但无法阻止有针对性且装备精良的攻击。

与本身已经很强的密码(例如很长的随机密码短语)结合时,它带来的提升很少。即使攻击者尝试 1,000 种布局组合,增加的也不到 10 比特,因为 log2(1,000) ≈ 9.97。强度仍然来自底层的密码短语。

构建万能密码 (~250 比特)

如果单词列表、leetspeak 和打字技巧都有其局限性,我们该如何构建一个经得起时间考验的万能密码?我们的生成器已将 80 比特评为“强”,将 100 比特评为“非常强”。对于需要使用数十年的万能密码,本文的目标要高得多:大约 250 比特的熵。下面的量子部分会解释原因,以及这一余量无法保证什么。

根据您的需求,有两种方法可以实现这一目标:

1. 随机字符(用于密码管理器)

完全随机生成的字符串,没有任何可供机器利用的模式: 8}8,_$-p)M&n,XvUCT0o+.5hDE6P^w6b@U-evS0 从我们生成器的 91 个字符中随机抽取的 39 个字符:≈ 253 位。它是为本文抽取的,因此现已公开。切勿使用。

2. 随机密码短语(用于需要记住的密码)

随机单词比随机字符更容易记住。从含 7,776 个单词的 EFF 长单词列表中抽取的每个单词约增加 12.9 比特,因此熵由单词数量决定。12 个单词可达 ≈ 155 位,远高于我们生成器的“非常强”门槛。纯单词要达到 20 个才能超过 250 比特。

我们的生成器最多只生成 12 个单词。要用更少的单词超过 250 比特,请勾选“每个单词后的随机数字”,并选择“数字 + 符号”作为分隔符。这样 11 个单词即可达到 ≈ 260 位: depletion78$sporting14~overlap11>macaw86>paced95,paramedic41}blot41$flagstone07;uncanny92/broadways77#say2 为本文随机抽取,设置与上述完全相同。公开过的密码就是作废的密码:切勿使用这个例子,也不要使用您读到的任何例子。只有随机抽取的部分才算数。把每个单词首字母大写不会增加任何熵,而您自己挑选的单词远比随机单词弱。

量子威胁:格罗弗算法

当 128 比特已经能阻挡今天的超级计算机时,为什么要追求 250 比特?答案在于大型量子计算机出现的可能性。

在密码学中,格罗弗算法(Grover’s algorithm)允许量子计算机在未排序数据库中搜索的速度比经典计算机快得多。具体而言,格罗弗算法有效地将对称密钥或密码的安全级别减半。

面对运行格罗弗算法的量子计算机,具有 128 比特熵的密码在理论上只能提供相当于 64 比特的抵抗力。余量因此薄得多。

将熵加倍可以保住余量:大约 256 比特在面对格罗弗算法时仍能保留大约 128 比特。本文 250 比特的目标正是由此而来。这是本文选择的一项预防措施,而不是取自某项标准的数字。

这一余量也有其限度。格罗弗算法带来的加速是平方级的,而非无限的。它的每一步仍然必须计算该网站的密码哈希,而且要在一台大到足以运行它的量子计算机上进行。作为对比,按照我们生成器页面所假设的每秒 1000 亿次尝试,对 100 比特的平均搜索就已至少需要 2000亿年。

其逻辑类似于 Harvest Now, Decrypt Later (HNDL):被盗的密码哈希数据库可以今天保存下来,日后再用更强的机器发起攻击。更大的余量可以提高应对这一威胁的门槛。但它并非永久性的保证。

Arpokrat Password Generator:生成您自己的密码

不要将您的访问安全交由运气决定。我们的免费生成器可生成随机密码和口令。对于每一个结果,它都会显示以比特为单位的熵,以及一次搜索所需的平均时间。

它只负责生成:不会评估您已在使用的密码。要达到上文 250 比特的目标,请选择包含全部四种字符类型、长度为 39 个字符的密码。生成器会将其显示为“≈ 253 位”。

👉 Arpokrat Password Generator

它在您的浏览器中运行。它生成的内容绝不会被发送或保存。

最后一个薄弱环节:重复使用和访问管理

数学上的熵不能防止人为错误。250 比特的密码一旦泄露就会失去价值:如果在多个网站上重复使用(称为撞库 / Credential Stuffing 的攻击),或者没有双因素身份验证 (2FA) 的保护,都是如此。

数字卫生的黄金法则是,您只需要记住一个密码:您的 250 比特万能密码(即上文所述的随机密码短语)。您的所有其他访问权限(银行、社交网络、服务器)必须使用专门为它们生成的、各不相同的随机密码。

为了存储所有这些您记不住的密码,请使用密码管理器。选择在同步之前就在您的设备上加密密码库的那种(通常称为零知识,Zero-Knowledge),最好是开源且经过独立审计的那种。