密码生成器使用指南:如何创建强密码保护账号安全
密码是极少数完全由你自己设置、又几乎完全由你承担后果的安全措施。它的麻烦在于时间差:设置的那一刻只要几秒钟,代价却往往在几年后才出现;而且多数时候不是"被猜到了",而是"另一个网站的数据库里出现了你的邮箱和口令"。
本文不谈按钮怎么点,只讲三件可以计算、可以取舍的事:强度究竟由什么决定、攻击者实际在用哪些手法、以及一个普通人花多少精力就能把风险压下来。文中的搜索空间与耗时全部按公式实算,可以照着重算。
一、密码强度是一道可以算的题
把强度写成公式,只有两个变量:熵 = 长度 × log2(字符集大小)。字符集指口令可能用到的字符范围——10 个数字、26 个小写字母、62 个字母加数字、94 个不含空格的可打印 ASCII 字符。
这个公式的结构比它的具体数值更重要:长度是乘数,字符集只决定每个字符贡献多少位。字符集从 10 扩到 94,单字符贡献从 3.32 位升到 6.55 位,不到两倍;而长度每多一位,搜索空间就乘以整个字符集的大小。所以"加符号"和"加长度"从来不是同一量级的操作,下一节的算例会把差距算清楚。
还有第三个变量最容易被忽略:这些位是不是真的随机。如果口令由可预测的随机源产生——例如非密码学安全的伪随机函数,或用时间戳做种子——那么即使名义上有上百位长度,攻击者的实际搜索空间也可能塌缩到几分钟以内。随机源强弱是一个独立的工程问题,可以看随机数生成器使用指南和随机数生成器;这里只需要记住结论:长度与字符集决定上限,随机源决定这个上限是否成立。
二、拖库、撞库与"填充":泄露的代价为什么是链式的
数据库被拖走时,流出的数据形态决定了你的风险等级。如果口令以明文存储,泄露即等于公开;如果存的是哈希,还要看用了什么算法——专为拖慢暴力破解而设计的加盐慢哈希(bcrypt、scrypt、Argon2 这一类)会把每次尝试的代价抬高若干个数量级,而无盐的快速哈希(早年的 MD5、SHA-1)在专用硬件面前几乎等同于明文。
但真正把一次泄露放大成灾难的是复用。攻击者拿到 A 站的"邮箱 + 口令"组合后,不需要破解任何东西,直接把这套组合拿到 B 站、C 站登录,这就是撞库(credential stuffing)。它成本极低而命中率只取决于用户习惯,因此长期是最划算的攻击方式之一。与之配套的还有"密码填充"(password spraying):用少量最常见的弱口令横扫大量账号,专门绕开"同一账号连续失败即锁定"这类防护。
所以复用密码的真实代价不是"丢一个账号",而是一条链路:邮箱被接管之后,攻击者可以用"忘记密码"把其余账号依次重置,而你收不到任何异常信号——那些重置邮件确实发进了你的邮箱。
同一条链路上还有一个不需要口令的入口:会话。登录成功后浏览器持有的会话标识符如果可被猜测(例如自增 ID 或弱随机值),攻击者直接冒用即可,口令再长也拦不住。这类标识符必须是不可预测的随机值,UUID 生成器覆盖了"不可猜测的标识符怎么造"这一类需求。
三、攻击者实际在用的六种手法
把"改密码"当成唯一动作,通常是因为把攻击想象成了单一形式。现实中的手法打的是不同环节,对应的有效防御也完全不同:
| 攻击手法 | 打的是哪个环节 | 有效防御 | 看着有用其实没用的做法 |
|---|---|---|---|
| 在线暴力枚举 | 登录接口 | 失败次数限制、验证码、异常登录风控 | 把 8 位加到 10 位,但仍是可猜的模式 |
| 离线哈希破解 | 已泄露的数据库 | 服务端使用加盐慢哈希;用户端使用足够长的口令 | 只在系统提示"密码太弱"时把首字母改成大写 |
| 字典加规则变形 | 口令自身的构造方式 | 不使用词典词、姓名、日期及其变形 | 把 password 改成 P@ssw0rd,或在词尾补年份和感叹号 |
| 撞库与跨站复用 | 多站点之间的口令复用 | 每个站点独立口令,交给密码管理器生成与保存 | 在原口令后面拼一个网站名缩写 |
| 钓鱼与实时反向代理 | 人对站点的判断 | 硬件密钥或通行密钥,凭证与域名绑定,域名不符就不产生响应 | 反复叮嘱"看清网址",或用短信验证码当第二因素 |
| 短信拦截与 SIM 交换 | 短信这一条通道 | 改用验证器应用或硬件密钥 | 把手机号当成可靠的身份凭证 |
这张表里有两条反直觉的结论。第一,强口令防不住钓鱼:在实时反向代理式的钓鱼站点上,你输入的密码和一次性验证码会被即时转发给真实站点,"密码有多长"的努力全部失效,能挡住它的只有与域名绑定的硬件密钥或通行密钥。第二,改密码防不住会话劫持:如果攻击者手上已有有效会话令牌,你改多少次口令都不影响他持有的那一个,此时该做的是在账号安全设置里强制下线所有设备。
四、四个可以复算的算例
下面的数字全部按"搜索空间 = 字符集大小 ^ 长度"实算,并引入一个用于横向比较的攻击速率假设:每秒 10 亿次尝试(这是假设值,只用于比较量级;平均命中位置取搜索空间的一半)。
| 口令形态 | 字符集 / 词表 | 搜索空间 | 每秒 10 亿次下的平均耗时 |
|---|---|---|---|
| 8 位纯数字 | 10 | 1.0000 × 10⁸ | 0.05 秒 |
| 8 位小写字母 | 26 | 2.0883 × 10¹¹ | 约 1.7 分钟 |
| 8 位大小写字母加数字 | 62 | 2.1834 × 10¹⁴ | 约 30.3 小时 |
| 8 位字母数字加符号 | 94 | 6.0957 × 10¹⁵ | 约 35.3 天 |
| 12 位字母数字加符号 | 94 | 4.7592 × 10²³ | 约 754 万年 |
| 16 位字母数字加符号 | 94 | 3.7157 × 10³¹ | 约 5.887 × 10¹⁴ 年 |
| 4 个随机单词 | 7776 词表 | 3.6562 × 10¹⁵ | 约 21.2 天 |
| 6 个随机单词 | 7776 词表 | 2.2107 × 10²³ | 约 350 万年 |
算例一(字符集的边际收益):字符集从 10 扩到 94,8 位口令的搜索空间从 1.0000 × 10⁸ 涨到 6.0957 × 10¹⁵,是原来的 6100 万倍。但在每秒 10 亿次的假设下,平均耗时只是从 0.05 秒变成约 35.3 天——量级提升很大,绝对水平却依然落在"一次性攻击可以承受"的边缘,因为对手可以并行、可以长期占用机器。
算例二(长度的杠杆):字符集不变(都是 94),长度从 12 位增到 16 位,搜索空间从 4.7592 × 10²³ 涨到 3.7157 × 10³¹,涨了 7808 万倍;平均耗时从约 754 万年变成约 5.887 × 10¹⁴ 年。只多敲 4 个字符,结果就被推到了任何实际攻击都触及不到的范围。这就是"长度优先"的算术依据。
算例三(口令短语):短语的强度来自词表规模。从 7776 词的词表里随机抽词,4 个词的空间是 3.6562 × 10¹⁵(约 21.2 天),6 个词是 2.2107 × 10²³(约 350 万年)——每多一个词就乘以 7776,加两个词就是 6047 万倍。
算例四(换算到同一把尺子):4 个随机单词(51.7 位)与 8 位全字符集口令(52.4 位)基本等价;6 个单词(77.5 位)对应 12 位全字符集口令(78.7 位);8 个单词(103.4 位)对应 16 位全字符集口令(104.9 位)。结论不是"短语一定更强",而是短语用更低的记忆成本换到了同一档强度——这一点在下一节展开。要生成表中那一档随机串,可以直接用密码生成器。
五、口令短语:把"够长"和"记得住"同时拿到
口令短语(passphrase)的构造只有一条要点:从固定的词表里随机抽取,而不是自己"想"几个词。人自己想到的词高度集中在少数常见词、身边事物和个人经历上,实际熵远低于词表随机;"我喜欢蓝色的大海"读起来很长,可猜性却很高。
标准做法是选一份规模固定的词表(常见做法是数千词的列表),用密码学安全的随机源抽取 4 到 6 个词,再用分隔符连接。分隔符只承担可读性——把连字符换成符号,只给每个词加了一点点熵,远不如多加一个词。
什么时候用短语、什么时候用随机串,取决于这个口令要不要靠人脑记住:
- 必须记住的(密码管理器主密码、开机口令、主邮箱):用 6 个词左右的口令短语,强度约等于 12 位全字符集随机串,而输入出错率明显更低。
- 不需要记住的(各类网站与应用):用生成器出 16 位以上随机串,交给密码管理器保存。没有理由为了"好记"牺牲强度。
- 只临时用一次的(一次性注册、试用账号):同样用生成器,不要随手敲一个复用口令——这类低价值账号恰恰是最容易被拖库的一批,而它们常常绑着你的常用邮箱。
六、密码管理器与二次验证:它们各自挡住什么
密码管理器解决的是"唯一口令太贵"这个成本问题,而不是"口令不够长"这个问题。它带来三项实际收益:你可以给每个站点配不同的 16 位随机串;你只需要记住一个主密码;自动填充只在域名匹配时触发,因此在钓鱼站点上通常不会把口令交出去。它的风险则集中在一点——主密码与恢复流程成了单点。所以主密码必须是短语级强度,密码管理器账号本身必须开二次验证,恢复码要离线保存,并且尽量避免把明文库导出到聊天工具或云笔记里。
二次验证也不是"多一道麻烦"这么简单,而是一组强度差距很大的方案。按抗攻击能力从低到高大致是:短信验证码(可能被 SIM 交换与短信拦截绕过);验证器应用的动态码(本地计算、不依赖运营商,但仍会被实时钓鱼转发);推送确认(方便,但要防"疲劳轰炸"式的反复推送);硬件密钥与通行密钥(凭证与域名绑定,钓鱼站点上根本产生不了可用的认证响应)。选择的依据是账号的重要性——能用来重置其他账号的那一级,直接上最强的一档。
把账号分级,比"给所有账号设同一个强度"更现实,也更容易执行:
| 级别 | 典型账号 | 口令策略 | 二次验证 |
|---|---|---|---|
| 第一级:重置入口 | 主邮箱、手机账号、密码管理器主密码 | 独立口令短语,不复用,不与其他账号共享任何片段 | 硬件密钥或验证器应用;恢复码离线保存 |
| 第二级:资金与身份 | 网银、支付、政务、云盘 | 生成器出 16 位以上,每个账号独立 | 验证器应用,优先于短信 |
| 第三级:社交与工作 | 社交平台、办公协作、代码托管 | 生成器出 14 到 16 位,各自独立 | 开启即用,短信可作为过渡方案 |
| 第四级:低价值 | 论坛、试用、比价、一次性注册 | 生成器随机串,不绑定真实信息 | 不强制,但同样不要复用上一级的密码 |
这张表的排序依据不是"哪个账号听起来重要",而是攻击者的利用路径:只要能进第一级,其余级别几乎都能通过"忘记密码"拿到。所以资源有限时,先把第一级做扎实,收益远大于把二十个论坛账号逐个改强。
七、关于"定期更换":现代建议为什么收紧了这一条
早期制度性建议要求重要账号每 90 天更换一次口令,逻辑是缩短泄露后的可用窗口。问题出在副作用上:被迫频繁更换时,人会走向可预测的增量变形(季节加年份加感叹号,下次只改一个字符),而这类模式恰好被攻击者的规则字典覆盖;频繁更换也在推动人们选择更短、更好记的口令。换来的安全提升,往往抵不过强度下降的损失。
数字身份指南 SP 800-63B 在 2017 年的修订中不再建议对记忆型口令设置强制定期过期,转而建议在有泄露证据时更换。对个人来说,"有泄露证据"具体是这几种情况:平台明确告知数据泄露;出现陌生的登录记录或设备;曾在不可信的设备或公共网络上输入过;泄露查询服务提示你的邮箱出现在新的数据集中。
泄露查询的正确用法是查邮箱,不查密码:把邮箱地址填进公开的泄露查询服务,看它出现在哪些数据集里,进而判断风险类型。如果只是"某站的账户数据出现在数据集里",要关心的是该站是否泄露了口令原文;如果确认口令本身已泄露,那么只改那一个账号远远不够——凡是复用过该口令的站点都要一起换掉。
八、常见问题(FAQ)
- 密码里多加几个特殊符号,到底能提升多少?
- 提升有限,而且容易被高估。字符集从 62(字母加数字)扩到 94(再加上符号),单个字符的贡献只从 5.95 位升到 6.55 位;同样是 8 位,搜索空间从 2.1834 × 10¹⁴ 涨到 6.0957 × 10¹⁵,约 28 倍。而长度每加一位,搜索空间就直接乘以字符集大小——从 12 位到 16 位这 4 位,涨幅是 7808 万倍。符号的真正价值是让口令脱离词典词的形态,而不是充当主要的安全来源。
- 密码到底还要不要定期更换?
- 不需要按固定周期换,而是按事件换。没有泄露迹象时频繁更换会把人推向"季节 + 年份 + 感叹号"这类可预测变形,反而更容易被规则字典命中。该换的触发条件是:平台告知泄露、出现陌生登录、在不可信设备上输入过、或泄露查询显示邮箱出现在新的数据集里。更换时要换成全新的随机口令,而不是在原口令上做增量修改。
- 把全部密码交给一个密码管理器,风险是不是更集中了?
- 确实把风险集中到了主密码这一个点上,但同时消除了"复用"这个现实中发生率更高的风险。对冲方式有三条:主密码用 6 个词左右的口令短语而不是普通口令;密码管理器账号本身开启二次验证;恢复码离线保存,避免连自己都进不去。至于"服务商能不能看到我的密码",取决于它是否采用零知识加密的设计——数据在本地加解密,服务端只保存密文。
- 收到"你的密码已泄露"的提醒,第一步该做什么?
- 先判断泄露范围,再动手改。如果只是某个站点自身的数据集泄露,优先改该站点的口令,并检查它绑定的邮箱与支付信息;如果这个口令在别处也用过,就把所有复用它的站点一次性换掉——只改一个账号等于没改。改完之后检查登录记录与已授权设备,把不认识的会话强制下线,最后确认二次验证处于开启状态。
- 短信验证码算不算可靠的二次验证?
- 比没有强,但属于最弱的一档。它的安全性依赖运营商网络:SIM 交换可以把发给你的短信转到攻击者手上,短信在部分网络环境下也可能被截获;若遇到实时反向代理式钓鱼,你输入的验证码同样会被即时转发。重要账号优先换成验证器应用;能用来重置其他账号的那一级,建议直接用硬件密钥或通行密钥。
九、三个最常见的误区
误区一:把字符替换当成强密码。把 password 里的字母换成形近符号、在词尾补一个感叹号,得到的仍然只是一个"词典词的变体"。攻击者的规则字典本来就是按这套替换习惯生成的,变形只增加了几次尝试的成本。判断标准很简单:如果你的口令能被人一眼看出"它是由哪个词变来的",它就在字典的覆盖范围内。
误区二:以为换得越勤越安全。定期更换在个人场景里经常适得其反:为了记得住,人会构造可预测的序列(同一个词根换后缀、按月份加数字),一旦某一版泄露,攻击者顺手就能推出下一版。真正决定安全的是口令的随机性与唯一性,而不是它的"新鲜度"。
误区三:以为开了二次验证就万无一失。二次验证保护的是登录过程,保护不了已经建立的会话。如果设备被恶意程序控制、会话令牌被窃取,攻击者可以带着有效会话直接操作账号,此时验证码根本不会触发。相应的动作不是反复改口令,而是去安全设置里查看登录设备、强制下线,必要时重置全部会话。
十、四个可以今天就做完的建议
- 建议一:先分级,再动手。按"能不能用它重置其他账号"分两级就够用:主邮箱、手机账号、密码管理器属于第一级,其余属于第二级。先把第一级的三个账号换成独立的口令短语并开启二次验证,收益比逐个整理小账号大得多。
- 建议二:需要记的用短语,不需要记的交给生成器。要靠人脑记住的场合(主密码、开机口令)用 6 个词左右的随机短语;其余全部用密码生成器生成 16 位以上随机串并交给密码管理器。唯一必须守住的规矩是:任何两个账号之间不复用。
- 建议三:把恢复码当作账号的一部分来保存。开启二次验证时生成的恢复码要离线保存两份(例如打印一份、再在离线设备上存一份)。它既是"防止自己被锁在门外"的保险,也是设备丢失时唯一的退路。
- 建议四:把泄露检查变成常规动作。隔一段时间用主邮箱做一次泄露查询,收到平台安全提醒时立刻处理,同时顺手看一眼账号的登录设备列表。这两件事各只要几分钟,却能覆盖大部分"已经发生、你还不知道"的情况。