跳到主要内容
AZ Tools

密码与口令短语:什么才真正决定强度

关于密码的建议大多已经过时十年。许多网站仍在强制的规则——一个大写、一个数字、一个符号、每九十天更换一次——源于猜测,结果是让密码对人难了很多,对机器却几乎没难多少。真正重要的东西比这些规则暗示的更简单,而且值得理解,而不是背诵。

长度胜过小聪明

密码的强度就是攻击者必须穷举的可能性数量,而这个数量随长度呈指数增长,随字符集大小却只呈线性增长。给一个纯小写密码加一个字符,工作量乘以 26;而给一个短密码的字符集加入符号,整体上只乘以小得多的倍数。随机的 12 个小写字母,远比从整个键盘取的 8 个字符要强得多。

这正是替换小把戏失效的原因。把字母换成形似符号——用 @ 代替 a、用 3 代替 e——产生的字符串人打起来费劲,破解工具却在毫秒内就展开了,因为这些替换恰恰是所有词表最先尝试的项目。对一个常见词做可预测的变形,会原封不动继承那个常见词的脆弱。

强度检测条在哪里误导人

只统计字符种类的检测条会痛快地把 Password1! 判为「强」:大写、小写、数字、符号一应俱全——而它正是任何攻击者最先几千次尝试之内的候选。更好的检测器会建模词典、键盘走位、日期和常见替换,估算这个密码能扛住多少次猜测——这个问题比「包含哪些字符类型」有用得多。

把任何检测条都当作「脆弱程度的下限」,而不是「强度的证书」。它能有说服力地告诉你某个密码很糟,却无法知道你的密码是否已经出现在泄露库里——而那恰恰是关于它最重要的事实:唯一且从不复用,比分数好看更重要。

口令短语:真正记得住的强度

口令短语就是把若干随机单词连起来,它的强度来自单词个数和取词列表的大小,而不是看上去有多复杂。从一个 7,776 词的列表中随机取六个词,约有 77 比特的熵,稳稳超出离线破解所能触及的范围,同时仍是人能记在脑子里、在手机上打得出来的东西。

关键词是「随机」。你自己挑的词并不随机:人会挑相关联的词、名字,以及歌词或书里出现过的短语,而这种结构正是攻击者所建模的。单词必须来自真正的随机过程——这正是掷骰子方法存在的意义,也是你自己想出来的口令短语不等同于生成出来的那种的原因。

真正的风险是复用

几乎没有人是因为攻击者暴力破解了密码而失守的。人们失守,是因为多年前注册过的某个网站被拖库,而同一个密码在他们的邮箱上也能用。撞库——把泄露的账号密码对拿到其他服务上重放——成本低、可自动化且极其有效,而复用的密码无论多复杂都挡不住它。

所以值得优化的属性是「唯一性」,而规模化的唯一性需要密码管理器。当每个密码都是唯一且生成的,单个密码好不好记就不再重要,你需要记住的只剩保护管理器本身的那一个——长口令短语的价值恰恰体现在这里。

双因素认证实际保护什么

第二因素防的是被盗或被猜中的密码,而且做得很好:知道密码不再足够。基于时间的一次性验证码由共享密钥和当前时刻推导而来,所以它能离线工作,也因此设备的时钟必须大致准确。

但要清楚它防不住什么。一个做得像样的钓鱼页面索要验证码和索要密码一样轻松,并能立刻把两者一起转发;短信验证码则可能因手机号被劫持而遭截获。验证器应用的验证码明显优于短信;而会拒绝在错误域名上认证的硬件密钥更好,因为它把人从这个判断中彻底移出去了。

  • 优先考虑长度而非字符种类的杂技——争取一条长口令短语。
  • 绝不复用密码;唯一性比复杂度更能保护你。
  • 生成密码而不是自己想;人的选择是有规律的。
  • 用验证器应用而非短信,有硬件密钥选项时就用它。
  • 有理由时才更换密码,而不是按任意的时间表。

相关工具