如何生成强密码
弱密码是消费互联网上被利用最多的漏洞。年复一年,攻击者公开的泄露语料库里排在最前面的总是那几串:「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() 不是密码学安全的,绝不可用于密码或任何其他安全用途。
你选择三件事:
- 长度,以字符为单位
- 要包含的字符类别(小写、大写、数字、符号)
- 可选排除视觉上易混淆的字符(
l、1、I、O、0),当密码必须被朗读或手抄时
生成器随即从所选字母表中均匀采样,直到达到要求的长度,没有偏置也没有规律。
如何生成一个强密码
- 决定长度。12 个字符是新账号合理的下限,16 到 20 个字符适合存放金钱或秘密的账号,25 个或以上适合主密码和 root 凭据。
- 启用所有字符类别,除非站点拒绝符号。隐藏的组合规则要付出几个比特的熵代价,反正密码管理器会替你填,把更难猜的字符包含进来也没坏处。
- 生成,然后审计。大多数生成器会显示熵估计;普通账号瞄准至少 80 比特,高价值账号瞄准 100 比特或以上。
- 粘贴前先存进密码管理器。如果没先保存就关掉标签页,密码就永远丢了。这是最常见的乌龙球。
- 测试一次完整的登录往返。有一小部分但真实存在的站点会在服务端悄悄把密码截断到 16、20 或 32 字符,或者剥掉某些符号。退出再登录一次,确认实际被接受的是什么。
长度、字母表与熵速查
| 长度 | 字母表 | 组合数 | 熵(比特) |
|---|---|---|---|
| 8 | 纯小写(26) | 2.1 × 10^11 | 38 |
| 12 | 小写 + 数字(36) | 4.7 × 10^18 | 62 |
| 16 | 大小写混合 + 数字(62) | 4.8 × 10^28 | 95 |
| 20 | 大小写混合 + 数字 + 32 个符号 | 4.5 × 10^37 | 125 |
| 25 | 整个键盘(约 94) | 2.0 × 10^49 | 164 |
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 漫画走红,如今已出现在所有现代字典攻击中)。
提升密码质量的建议
- 每个账号用不同的密码。复用是收益率最高的攻击向量;一个站点被攻破,所有共用同样凭据的账号都暴露。
- 生成,绝不发明。大脑不擅长随机;计算机非常擅长。把活儿外包出去。
- 瞄准长,而不是聪明。
crypto.getRandomValues输出 20 个字符,胜过任何你能发明的花样。 - 整段粘贴,绝不手打。手打 20 字符随机串,既容易打错也容易被人瞥到肩;让密码管理器去填。
- 用泄露语料库审计现有密码。haveibeenpwned.com 的 Pwned Passwords API 通过 k 匿名协议把任意密码与约 8.5 亿条泄露哈希比对,全程不发送完整密码。
- 只在有信号时轮换,不按日历。强制 90 天轮换会把用户推向可预测的模式,比如
Spring2026!然后Summer2026!。当前 NIST 指南是只在怀疑被攻破时轮换。 - 关闭或随机化安全问题。「母亲的婚前姓」在大多数家谱网站都查得到;把答案当作备用密码看待,在管理器里存随机字符串。
- 用自动填充,且核对域名。密码管理器拒绝在仿冒域名上填充,等于免费替你挡住了一次钓鱼尝试。
常见错误
- 复用密码。撞库攻击会把泄露的邮箱/密码对扔到上千个站点试一遍;一个被复用的密码就是一次完整的账号沦陷。
- 个人信息。宠物名、生日、孩子名字、地址、母校吉祥物,都很容易在社交媒体上被采集。
- 简单替换。
P@ssw0rd和Pa55word在每个字典里都有;破解工具默认套用a到@、o到0、s到$这些变形规则。 - 密码太短。10 字符以下的密码,面对消费级硬件上的加盐 SHA-256,几个小时甚至几分钟就破。
- 键盘走位和顺序。
qwertyuiop、1qaz2wsx、asdfghjkl、abcd1234在前 1000 次尝试里就会被试。 - 以明文存储。便利贴、
passwords.txt、没有主密码的浏览器自动填充,都会让任何生成器的强度在下游被白白丢掉。 - 通过邮件或聊天分享。邮件在服务商那里和接收方设备备份里都保留;聊天历史长期留存。
- 只信任强度计。很多强度计只看长度和字符类别构成,漏掉明显的字典模式;
correct horse battery staple在某些强度计上显示「弱」,实际按熵衡量是强的。 - 强制定期轮换。会把用户推向可预测的派生形式,拉低整体人群的平均强度。
- 把 MFA 当作可选项。即使是一个 25 字符的生成密码,在高价值账号上也应配第二因素;密码会被钓走,第二因素抬高门槛。
密码之外:管理器、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.