密码到底需要多强?
大多数密码建议关注的是抗暴力破解能力,但现实中大多数账户被盗,根本不是靠暴力破解发生的。这里讲清楚真正重要的是什么。
· 阅读需 1 分钟
暴力破解问题,简短作答
密码强度通常用"熵"(以比特为单位)来衡量——大致上,是指暴力破解攻击者需要尝试多少次才能穷尽所有可能性,每多一比特,这个数字就翻一倍。一个从合理大小的字符集中随机抽取的密码,其强度——对于 14 到 16 个字符长度的密码,大约在 70 到 80 比特左右——已经远远超出了针对受妥善保护账户的任何暴力破解攻击在实际可行时间内能穷尽的范围,无论攻击者是在线针对有速率限制的登录表单进行猜测,还是离线针对被窃取、经过妥善哈希处理的密码数据库进行破解。超过这个门槛之后,继续增加理论上的强度比特数,只能在某种抽象意义上让密码"更抗暴力破解",而这种意义在实践中已经不再重要,因为对于已经达到这个范围的密码来说,暴力破解从一开始就不是现实的威胁。
一个令人不安的统计事实:大多数账户被盗根本不是暴力破解
安全研究和数据泄露事后分析一致指出,大多数真实世界账户被接管的原因,其实是另一种远没那么"高科技"的方式:撞库攻击——攻击者拿着从某个被入侵服务泄露出来的邮箱和密码配对列表,直接拿去尝试登录其他服务,赌的就是极其常见的"多个账户复用同一密码"的习惯。一个单独来看极其强健的密码——数十比特的熵、从巨大的字符集中抽取——如果在其他地方被复用,而那个"其他地方"曾经被泄露过,那么这个密码提供的保护基本等于零,因为攻击者根本不需要去猜这个密码;他们已经从完全不同的一次泄露事件里,一字不差地拿到了它。这正是为什么,密码在不同服务之间的唯一性,很可能是真实世界账户安全里比单纯的密码强度更有分量的实际杠杆——这个结论会让那些把"设置得更强"当作密码建议全部内容的人感到意外。
为什么密码管理器能为大多数账户彻底解决这个问题
密码管理器绕开了"强度与好记之间的取舍"这整个问题:它可以为每个账户生成并存储一个足够长、完全随机、独一无二的密码,完全不需要人去记住任何一个,从而对它所管理的每一个账户彻底关闭撞库攻击这个途径,因为任何两个账户的密码都绝不相同,一次泄露不会给攻击者提供任何能用在其他账户上的信息。这正是为什么,对绝大多数在线账户而言,诚实且实用的建议就是使用密码管理器,让它生成最大长度的随机密码——大多数密码建议纠结不休的"强度与好记之间的取舍",只对极少数确实无法存进密码管理器的密码才是真正需要考虑的设计取舍,主要就是管理器自身的主密码和全盘加密口令,这也正是为什么由随机词典单词组成的、便于记忆的密码短语,对这种狭窄但确实无法避免的场景来说,仍然是特别有用的工具。
官方密码建议发生了什么变化,以及原因
多年来,来自 NIST 等机构的官方指南一直建议强制执行密码复杂度规则——要求必须混合大写字母、小写字母、数字和符号——以及每 60 或 90 天强制轮换一次密码,各类组织也普遍将两者都采纳为标准策略。后来这份指南的修订版本撤销了这两项建议,依据是有证据表明,这两者在实践中其实适得其反:强制复杂度规则会把人们推向攻击者的字典早已考虑到的可预测替换模式(强制要求的符号往往可靠地变成结尾的"!",强制要求的数字往往可靠地变成把字母"o"替换成"0"),而强制定期轮换会促使人们对现有密码做出微小、可预测的渐进式修改,而不是真正想出全新的密码,同时还带来了实实在在的使用摩擦,明显增加了人们把密码写下来或在其他地方复用密码的频率,出于挫败感而妥协。目前的指南转而强调长度、将新密码与已知泄露密码列表进行比对,并放弃强制轮换,改为只在某个特定账户确实已知被入侵时才轮换——这一转变是基于什么真正能改善实际安全性的证据,而不是基于什么在合规检查表上看起来最严谨。
关于"多强才算够用",今天一个实用的标准
对于使用密码管理器保护的普通在线账户:一个至少 16 个字符、从大字符集中完全随机抽取的密码,其强度已经远远超过了"强度成为限制因素"的那个点,实践中真正重要的一步,只是确保这个密码不与其他任何账户共用。对于必须靠记忆并手动输入的主密码或加密口令:由五六个从大词库中随机抽取的单词组成的密码短语,能达到与较短的随机字符密码相当的强度,同时依然真正可以被记住并可靠地输入——这正是"长度与好记"之间的取舍真正存在、值得仔细权衡的场景。而对于介于两者之间的每一个账户,最具杠杆效应的习惯,不是在抽象意义上纠结这个密码够不够强——而是确保它不是同时保护着其他任何账户的那同一个密码,因为那才是真正导致大多数账户被盗的失败原因。