密码安全实战:多长的密码才够用
“密码至少 8 位,包含大小写字母、数字和特殊符号”——这条建议你一定见过无数次。但很少有人解释:为什么是 8 位?P@ssw0rd! 看起来完全符合规则,它真的安全吗?这篇文章不谈空泛的原则,而是从攻击者实际使用的手段出发,用可计算的方式回答一个核心问题:多长的密码才够用。
攻击者怎么破解密码:暴力破解与字典攻击
理解密码安全,先要理解你的对手。现实中的密码破解主要分两类。
暴力破解(brute force) 是最笨也最彻底的办法:从 aaaaaaaa 开始,把所有可能的字符组合挨个试一遍。它的速度取决于密码的”搜索空间”——可能的组合总数。一台普通 GPU 离线破解时每秒可以尝试几十亿到上百亿次哈希,所以搜索空间的大小直接决定了密码能撑多久。
字典攻击(dictionary attack) 则聪明得多:攻击者不逐个尝试组合,而是拿一份”常用密码字典”来试。这份字典里有泄露数据库中出现过的真实密码、常见英文单词、键盘模式(qwerty、123456),以及这些词的常见变体(把 a 换成 @、把 o 换成 0、末尾加 ! 或年份)。字典攻击的效率极高,因为人类想出来的”复杂密码”往往高度可预测。
这就是为什么 P@ssw0rd! 不安全:它有 10 位、四种字符类型俱全,但它就是 password 加了一层人尽皆知的”壳”,在任何一份破解字典里都排得很靠前。字符替换骗不了攻击者,只能骗过网站的格式校验。
用熵来衡量密码强度
要精确比较两个密码,需要一个量化的指标,这个指标就是熵(entropy)。对于”从 N 个字符中随机选出 L 个”的密码,熵的计算公式是:
熵 = L × log₂(N)
直觉上,熵表示攻击者平均需要猜多少次:熵为 E 的密码,穷举空间是 2 的 E 次方。几个常见的字符集大小:
字符集大小 N每个字符的熵纯小写字母26约 4.7 bit大小写 + 数字62约 5.95 bit大小写 + 数字 + 符号94约 6.55 bit
注意这个公式有一个关键前提:每个字符都是独立随机选取的。你自己”想”出来的密码不满足这个前提——人脑选字符时有强烈的偏好,实际熵远低于公式计算值。所以熵公式衡量的是随机密码的强度,而不是”看起来很随机”的密码的强度。
为什么长度比复杂度更重要
把公式摆出来,答案就一目了然了:熵随长度线性增长,随字符集大小对数增长。加长一位,搜索空间乘以 N;扩大字符集,只是每位的贡献从 4.7 bit 涨到 6.55 bit。算几笔账(假设离线攻击每秒尝试 100 亿次):
密码熵穷举时间8 位纯小写约 37.6 bit约 20 秒8 位四种字符混合约 52.4 bit约 14 年12 位四种字符混合约 78.6 bit约 190 万年16 位四种字符混合约 104.8 bit远超宇宙年龄
8 位密码无论多”复杂”,在现代 GPU 面前都是纸糊的;而把长度加到 12 位以上,安全性发生质变。这就是为什么安全界的共识已经从”8 位混合字符”转向”越长越好,16 位起步”。NIST 在最新的数字身份指南(SP 800-63B)中也明确建议:优先要求长度,而不是强制字符组合。
想亲手验证这些数字,可以把密码输入 密码强度测试工具。它正是用上面的熵公式计算强度,并按每秒十亿次猜测估算破解时间,你可以直观地看到每加一位长度带来的变化。
这些密码绝对不要用
无论多长,以下几类密码都应该直接排除:
泄露榜单常客:123456、password、qwerty、iloveyou 这类密码是字典攻击的第一批目标,几毫秒内就会被试到。
个人信息:生日、手机号、宠物名、偶像名字。这些信息在社交媒体上几乎是公开的,社工库攻击会优先尝试。
键盘模式:1qaz2wsx、zxcvbnm,看似无规律,其实是固定模式,字典里都有。
单词加数字后缀:Summer2026、Dragon88。这是人类最常用的”造密码”套路,破解字典里按这个规则批量生成。
任何网站上用过的旧密码:数据泄露事件层出不穷,攻击者拿到泄露库后的第一件事就是”撞库”——拿同一个邮箱密码组合去试其他所有网站。
密码管理器:唯一密码的唯一切实可行的方案
到这里结论已经很清楚了:安全的密码必须又长、又随机、又每个网站都不一样。这显然不是人脑能完成的任务——没人能记住几十个 16 位随机字符串。所以真正的答案是:不要记,用密码管理器。
密码管理器(Bitwarden、1Password、KeePassXC 等)为每个网站生成并保存独立的随机密码,你只需要记住一个主密码。这样即使某个网站的数据库泄露,攻击者拿到的也只是一个对其他网站毫无用处的随机字符串,撞库攻击对你完全失效。主密码本身建议用”密码短语”——四五个随机拼在一起的常见词,比如 正确-马-电池-订书钉 这种形式,既长又相对好记。
如何生成真正随机的密码
“随机”的关键在于来源。人脑不是好的随机数源,普通程序里的伪随机数生成器(如 Math.random())也不安全——它们的设计目标是分布均匀,而不是不可预测。安全的做法是用密码学安全随机数生成器(CSPRNG):浏览器里的 crypto.getRandomValues()、操作系统的 /dev/urandom、各语言标准库里的 secrets/secure-random 模块。
最省事的方式是使用现成的工具。本站的 密码生成器 就是基于浏览器的 crypto.getRandomValues() 实现的:所有计算都在你自己的浏览器里完成,生成的密码不会发送到任何服务器。实际使用时的建议配置:
长度拉到 16 位以上,反正不用自己记,越长越稳;
四种字符类型全部勾上,最大化每个字符的熵;
如果需要手打或口头念出密码(比如 Wi-Fi 密码),勾选”排除易混淆字符”,去掉 l、1、I、O、0 这类看走眼的字符。
生成后顺手把它粘贴到 密码强度测试工具 里看一眼破解时间的估算,确认强度达标再投入使用。
总结:一份可执行的密码策略
把全文压缩成几条可落地的行动项:
密码长度至少 12 位,重要账户 16 位起步;
每个网站使用唯一的随机密码,交给密码管理器生成和保管;
绝不用个人信息、常见词及其变体做密码;
主密码用长密码短语,并为重要账户开启两步验证(2FA);
随机数必须来自 CSPRNG,不要自己”想”随机。
密码安全的本质是一场数学竞赛:你不需要造出绝对无法破解的密码,只需要让破解你的成本高到攻击者放弃为止。长度加随机,就是赢下这场比赛最简单的方式。
LOL冰雪节有哪些类型?2026热门活动皮肤攻略一文全解决
如何申领狗牌及续牌?