直接给结论:长度赢,而且差距不小。每多一个字符, 攻击者要试的次数是成倍增长的;而强行加一个符号或一个大写字母,只增加一个很小的固定量。 四个随机挑的普通单词,胜过八个字符的花式标点 —— 而复用密码会让这两者同时作废。
过去二十年里,主流建议一直是「加个大写、加个数字、加个符号」。但这套建议背后的算术说的却是另一回事, 而且差距大到值得花几分钟看清楚。
强度到底由什么决定
唯一重要的是:攻击者得试多少次。也就是你的密码是从多大的空间里抽出来的 —— 在一个不知道密码的人看来,有多少个字符串和你这个长得一模一样。
尝试次数 = (字符集大小) ^ (字符个数)
安全圈习惯用「比特」来衡量它:对上面这个数取以 2 为底的对数。每多一比特,工作量翻倍。 这个公式一眼就能看出关键 —— 指数是长度,底数是字符集。 把指数做大,和把底数做大,效果完全不是一个量级。
同样一份努力,两种花法
先看一个 16 位、只用字母的密码 —— 大小写都用,每个字符 52 种可能。
52^16 ≈ 2.9 × 10^27 ≈ 91.0 比特
再看一个 8 位、字母数字符号全上的密码 —— 94 个字符的字符集,接近键盘上所有可打字符。
94^8 ≈ 6.1 × 10^15 ≈ 52.5 比特
那个 16 位纯字母的密码,暴力破解难度大约是后者的 四千亿倍, 而 8 位那个才是「复杂」的那个。8 位这个指数本身就不够大,字符集再花哨也没用。
| 长度 | 只有小写(26) | 字母+数字(62) | 整个键盘(94) |
|---|---|---|---|
| 8 | 37.6 比特 | 47.6 比特 | 52.5 比特 |
| 12 | 56.4 比特 | 71.5 比特 | 78.7 比特 |
| 16 | 75.2 比特 | 95.3 比特 | 105.0 比特 |
| 20 | 94.0 比特 | 119.1 比特 | 131.2 比特 |
横着和竖着对比一下。给那个 8 位纯小写密码加四个字符,多得约 19 比特; 给它换成整个键盘的字符集,多得约 15 比特。长度赢,而且越往长走它赢得越多。
会改变结论的那个背景
纯熵只是一半事实,而忽略另一半,正是人们搞出 P@ssw0rd1! 这种密码的路径。
如果攻击者是「会猜」的
真实攻击不是穷举。它们先试已知的泄露密码,然后试字典词,然后试字典词加上可预测的修饰 ——
首字母大写、末尾加个数字、末尾加个 !。
像 Summer2026! 这样的密码满足每一条复杂度规则,却几乎瞬间就被破解,
因为它就是一个字典词,加上两个最常见的后缀。
这就是复杂度规则的失效之处:它们描述了字符串的形状, 却对它的可预测性一言不发。人面对规则时的反应,是做出满足规则的最小改动, 而这些改动产生的形状,恰恰就是破解字典专门为之建立的。
这对「长度」意味着什么
用互不相关的词拼成的长密码,实际熵远高于它字符数所暗示的水平,
因为攻击者没法把这些词当成一个个独立字符来处理。
从几千个词的词表里随机挑四个词,本身就有约 44 比特;六个词就超过 65。
像 correct-horse-battery-staple 这种句子式的口令强,
不是因为长,而是因为那几个词是随机挑的,而不是一个人去想一句好记的话想出来的。
这里恰恰藏着那个坑:真正起作用的是随机,不是好记。 你自己想出来的口令大概率不是随机的 —— 它反映了你身上的一些东西,而这就把空间大幅收窄了。
那到底应该怎么做
- 用密码管理器。它把「得记住」这个约束彻底拿掉了, 而那个约束正是短密码曾经显得合理的唯一理由。于是每个密码都可以是 20 位随机字符。
- 让它生成,别自己编。人选的密码系统性地弱于同长度的随机密码,因为人会扎堆。 这里的生成器取的是浏览器的密码学随机源 —— 和加密密钥用的是同一个东西,而不是以时钟为种子的伪随机函数。
- 先要长度,再要花样。如果某个场合强迫你必须记住密码, 那就选更长而不是更复杂的。20 位纯字母胜过 12 位混合。
- 绝不复用。见下一节 —— 这才是真正害到人的那一条。
比算术更重要的那一部分
上面所有数字都建立在「攻击者必须破解你的密码」这个前提上。而现实中, 消费级服务的泄露事件压倒性地不走这条路。它们之所以奏效, 是因为你在某个防护很差的站上用过的密码,被复用到了另一个站,而第一个站把它以明文或弱哈希的形式泄露了。 攻击者什么都没破解。他们直接登录进去了。
面对这种攻击,熵毫无意义。一个 128 比特的密码,只要被复用在一个已经沦陷的论坛上,就等于泄露了。 而一个平庸但独一无二的密码,放在一个运营规范的站上,反而没事。
唯一性胜过长度。长度胜过复杂度。而复杂度本身,大多只是表演。
靠谱的网站会怎么处理你的密码
这不在你的控制范围内,但值得知道该看什么,因为它决定了一次泄露会造成多大破坏。
- 用慢速、带盐的算法做哈希 —— bcrypt、scrypt 或 Argon2。 直接用 SHA-256 计算很快,而这恰恰是错误的性质:一块显卡每秒能试几十亿次。 加盐可以挡掉预先算好的查表,也能避免相同的密码产生相同的哈希。
- 登录尝试限流。没有限流,再强的哈希也能被在线撞开。
- 双因素认证。它不让你的密码变强,而是让「偷到的密码」本身不够用 —— 这是更好的一个性质。
一个实际可用的默认方案
从完整字符集里随机取 16 个字符,大约是 100 比特,已经超出了可预见硬件能暴力破解的范围。 20 位就很宽裕了。再往上多出来的部分,买不到任何一个人能察觉到的收益。
在本地生成、存进管理器、每个地方用不一样的。这个组合比任何刻意的复杂化都值钱得多, 而且比记住一个别扭的密码省力。