如何生成强密码

· 9 分钟阅读

弱密码是消费互联网上被利用最多的漏洞。年复一年,攻击者公开的泄露语料库里排在最前面的总是那几串:「123456」、「password」、「qwerty」、「admin」。如果你的某个账号带着这样的 DNA,它早就躺在某处僵尸网络运行的字典里了。一个强密码是你能部署的最便宜、最快速的防线,几秒钟交给生成器,胜过任何在压力下凭脑子凑出来的东西。

计算机密码简史

计算机密码可以追溯到 1961 年,Fernando Corbató 在 MIT 的团队为兼容分时系统(CTSS)引入了密码,让多个用户共享同一台大型机的同时保持各自文件的私密性。系统在 1962 年就遭遇了第一次入侵,博士生 Allan Scherr 打印出整个主密码文件,以便抢到比每周四小时配额更多的计算时间。这条教训,即把秘密以明文形式存在它们所保护的账号旁边是个糟糕主意,整个行业花了将近二十年才真正消化。

1979 年,Robert Morris 和 Ken Thompson 发表了「Password Security: A Case History」,并在 Unix 第 7 版中交付了加盐的 DES 哈希:12 位的随机盐加上 25 轮 DES,把密码文件从一次性奖杯变成了相当昂贵的暴力破解目标。彩虹表、Alec Muffett 的「Crack」(1991)以及越来越快的 GPU 最终压垮了这些防御,该领域转向了刻意设计得很慢的哈希函数:bcrypt(1999)、scrypt(2009)、Argon2(2015,当前 PHC 胜出者)。

面向用户的密码建议演进得慢得多。NIST 2003 年的指南(主要由 Bill Burr 撰写)推荐强制定期轮换和必须混合字符类别,这条建议成为企业默认做法长达十五年。Burr 本人在 2017 年的一次采访中否认了这些规则。同年,NIST SP 800-63B 第 3 版正式废除了定期轮换和组合规则,以两条更简单的思路取而代之:偏好长的记忆秘密,以及在接受候选密码之前与泄露语料库比对。

什么使密码强壮

密码对猜测的抵抗力归结为一个量:,以比特衡量。每多一个比特,搜索空间翻一倍。4 位数字 PIN 大约有 13 比特熵(1 万种组合)。16 字符的纯小写字符串约 75 比特。16 字符的大小写混合 + 数字 + 符号字符串约 105 比特。在 100 GH/s 下,即高端消费 GPU 针对快速加盐哈希所能达到的速度,50 比特几天就会失守,70 比特要上千年。

两条实践结论。

长度压倒复杂度。从 70 个符号的字母表里多加一个字符,把搜索空间乘以 70,大致相当于多加 6.1 比特。多加一条组合规则(比如在长度不变时混合大小写)只把空间翻一倍,即一个比特。十二个随机小写字符,每次都赢过八个大小写混合 + 符号的字符。

随机性不可妥协。用英文单词拼成的 20 字符串并不是 130 比特熵;面对认真的攻击者它可能只有 40 比特,因为破解工具跑的是字典加变形规则,而不是盲目暴力。生成的密码每个字符都给你满熵。人选的密码几乎从不。

密码生成器是如何工作的

浏览器里的生成器使用 crypto.getRandomValues(),即平台的密码学安全随机数生成器(CSPRNG),由操作系统的熵池支撑。它和派生 TLS 会话密钥、AES 初始化向量用的是同一个源头。古老的 Math.random() 不是密码学安全的,绝不可用于密码或任何其他安全用途。

你选择三件事:

生成器随即从所选字母表中均匀采样,直到达到要求的长度,没有偏置也没有规律。

如何生成一个强密码

  1. 决定长度。12 个字符是新账号合理的下限,16 到 20 个字符适合存放金钱或秘密的账号,25 个或以上适合主密码和 root 凭据。
  2. 启用所有字符类别,除非站点拒绝符号。隐藏的组合规则要付出几个比特的熵代价,反正密码管理器会替你填,把更难猜的字符包含进来也没坏处。
  3. 生成,然后审计。大多数生成器会显示熵估计;普通账号瞄准至少 80 比特,高价值账号瞄准 100 比特或以上。
  4. 粘贴前先存进密码管理器。如果没先保存就关掉标签页,密码就永远丢了。这是最常见的乌龙球。
  5. 测试一次完整的登录往返。有一小部分但真实存在的站点会在服务端悄悄把密码截断到 16、20 或 32 字符,或者剥掉某些符号。退出再登录一次,确认实际被接受的是什么。

长度、字母表与熵速查

长度字母表组合数熵(比特)
8纯小写(26)2.1 × 10^1138
12小写 + 数字(36)4.7 × 10^1862
16大小写混合 + 数字(62)4.8 × 10^2895
20大小写混合 + 数字 + 32 个符号4.5 × 10^37125
25整个键盘(约 94)2.0 × 10^49164

64 比特以下,面对决心十足的离线攻击者很脆弱。100 比特以上,在传统硬件面前可以舒服地撑过下一个十年。量子攻击会通过 Grover 算法把有效熵减半,所以 100 经典比特对应 50 后量子比特,依然远高于任何实际威胁。

口令短语作为替代方案

对于一小部分你真的需要记住的密码(密码管理器的主密码、设备解锁、紧急恢复码),口令短语在可记忆性上胜过随机字符串,又不牺牲安全。经典配方是 Diceware,由 Arnold Reinhold 于 1995 年发明:掷五颗实体骰子,在 7 776 条词表(7 776 = 6^5)里查那个五位数,按想要的词数重复。每个词约增加 12.9 比特熵,所以六个词的短语如 correct horse battery staple cargo lumen 给出约 77 比特,相当于一串 13 字符的大小写混合 + 数字随机串。

2016 年,电子前沿基金会(EFF)发布了刷新过的 Diceware 风格词表,词更长、更好记(平均 7 个字符,而 Reinhold 的是 4.3 个),仍是 7 776 条,每词熵不变,更易于打字和在电话里口述。两份词表都可以。

唯一能摧毁口令短语安全性的错误,就是自己挑词而不是掷骰子。人们集中使用 1 000 到 2 000 个常见名词和动词,所以你自创的六词短语实际熵往往更接近 60 比特,有时甚至直接在破解者的字典里(correct horse battery staple 本身因为 xkcd 漫画走红,如今已出现在所有现代字典攻击中)。

提升密码质量的建议

常见错误

密码之外:管理器、MFA 与 passkey

密码管理器已经不是可选项。现实里的替代方案要么是复用弱密码,要么是写在纸上,两者都比任何信誉良好的管理器更糟。主要选项的简短对比:

工具价格存储模型突出优点
Bitwarden免费 / 付费云同步,可自托管开源、有审计、免费层很慷慨
1Password付费云同步,端到端加密UX 精致,家庭共享,Travel Mode
Dashlane付费云同步暗网监控,捆绑 VPN
KeePassXC免费本地文件(同步自理)完全离线,无供应商风险
Proton Pass免费 / 付费云同步,端到端加密随 Proton 账号附带,邮箱别名
Apple 钥匙串Apple 设备免费iCloud 同步原生、免费,绑定 Apple 生态
浏览器内置免费按浏览器账号同步免费且自带,面对主机恶意软件较弱

双因素认证(2FA)把窃取一个密码的代价,从「瞬间接管账号」抬到「攻击者还得截取第二因素」。优先选基于时间的一次性密码(TOTP,通过 Aegis、Raivo 或 2FAS 这类认证器 App),而不是 SMS,后者容易受 SIM 卡换号攻击。最高价值的账号优先选硬件安全密钥(YubiKey、Titan、SoloKey),而不是 TOTP。

Passkey(FIDO2 / WebAuthn)用绑定设备的加密密钥取代密码。Apple、Google 和 Microsoft 于 2022 年 5 月联合宣布扩展对 passkey 的支持,如今在 iOS 16+、Android、Chrome、Safari、Edge 和 Windows Hello 上都可用。Passkey 不会被钓鱼,因为浏览器拒绝在未注册过的域名上使用它,而且服务端数据库里没有共享秘密可以在泄露中被取走。哪里支持 passkey 就开启;通常你可以在生态成熟的过程中把密码留作回退。

隐私与生成器

密码生成器完全运行在你的浏览器里。它对每个字符调用一次 crypto.getRandomValues(),从所选字母表中采样,并把结果渲染到页面上。没有任何日志,没有任何东西发送到服务器,你离开页面之后不会保留任何东西。生成的密码不会离开你的设备,除非你主动把它粘到别处。对于像账号钥匙这样根本的东西,严格本地的流程才是正确的默认值:没有遥测、没有分析、没有第三方脚本、没有缓存。整套工具一旦页面加载完成就可以离线运行,你可以断网再点一次「生成」来验证这一点。

常见问题

我的密码应该多长?

为适当的安全性至少使用 12 个字符,敏感账户使用 16 个或更多。每增加一个字符都会让密码指数级地更难破解。

应该包含特殊字符吗?

应该。结合大写字母(A-Z)、小写字母(a-z)、数字(0-9)和特殊字符(!@#$%^&*)显著提高强度,因为它增加了攻击者需要猜的字符集。

密码生成器安全吗?

当它在您的浏览器中运行时是安全的。浏览器端生成器使用您设备的加密随机数生成器,绝不会将密码发送到服务器。

应该多久更换一次密码?

当前建议(来自 NIST 等机构)只在有证据表明密码被泄露时才更换,而不是按固定时间表。频繁强制更换会产生更弱的密码,因为人们会选择更容易记住的。

Is a passphrase as good as a random password?

Yes, if it is long enough and the words are chosen randomly (for example with Diceware or the EFF wordlist). Six randomly-chosen words give about 77 bits of entropy, comparable to a 13-character random password. Self-invented phrases are usually much weaker because humans cluster around the same few thousand common words.