密码强度计算器
结果
信息熵
- 字符池大小
- 62
- 每个字符的熵
- 5.95 bit
- 组合数(10 的幂)
- 28
密码强度是可以算的,这一页把猜测换成算术。选一个长度、勾一组字符集,密码强度计算器会给出这组选择对应多大的口令空间、熵值是多少比特,以及一块现代显卡穷举全部组合要多久——分别按快速哈希与配置得当的慢速哈希两种场景给。这两个数字之间的落差是这一页最有用的一处:同一个密码,撞上泄露出来的 MD5 库三年就没了,撞上 bcrypt 要几百万年。另一半是长度:每多一个字符,工作量就乘以字符集大小;而在固定长度上把整套字符集打开,只乘这一次。要提醒的是,密码熵只是理论上界,人手挑出来的密码远低于它,而且暴力破解也从来不是密码失守的主要方式。这一页不生成密码,原因见下面「为什么这一页不给我生成密码」。
各熵档位的破解时间
| 档位 | 熵(比特) | 组合数 | 每秒 10^10 次(秒) | 每秒 10^4 次(秒) |
|---|---|---|---|---|
| 弱 | 28 – 35 比特 | 8 | -2 | 4 |
| 一般 | 36 – 59 比特 | 10 | 0 | 6 |
| 强 | 60 – 127 比特 | 18 | 8 | 14 |
| 极强 | 128 比特及以上 | 38 | 28 | 34 |
后两列里的数字都是十的幂次:−2 是 10⁻² 秒,3 是一千秒。右边那列是同一个攻击者对付配置得当的慢速哈希的结果,所以两列差着一百万倍。熵列取的是这一档的下界,这正是这张表与上面的强度徽章永远一致的原因。组合数一律向下取到十的幂,宁可少说不说过头。
公式
熵(比特)= 密码长度 × log₂(字符集大小),组合数 = 2^熵
- 密码长度
- 密码有多少个字符
- 字符集大小
- 一共有多少种可选字符:小写 26、大写 26、数字 10、符号 32
- log₂
- 以 2 为底的对数,所以结果的单位是比特
用它来比较两套密码策略,或者判断手上这个密码还值不值得留。对「从已知字符集里随机生成」的密码,这个数是精确的;对「人自己想出来」的密码,它只是上界——人会挑规律,所以一个 12 位的手编密码,熵远低于 12 位随机字符。另外,暴力破解不是唯一的攻击方式:一个在多个网站复用的密码,会被别的网站那次泄露直接带走,加多长都没用。想知道「已经泄露过没有」,要查的是泄露库,不是这一页。
算例
16 位,字母加数字
- 字符集:26 + 26 + 10 = 62 种
- 每个字符的熵:log₂(62) = 5.95 比特
- 总熵:16 × 5.95 = 95.3 比特
- 组合数:10^28——页面给的是十的幂次,不是那 29 位数字
95.3 比特离 60 比特那一档还差得远,已经落进通常留给 128 比特的那一档。再把符号也打开,字符集变成 94 种,熵升到 104.6 比特——多出来的 9.3 比特,相当于把长度再加 1.6 位。
8 位,只有小写字母
- 字符集:26 种
- 每个字符的熵:log₂(26) = 4.70 比特
- 总熵:8 × 4.70 = 37.6 比特
- 组合数:2^37.6 ≈ 2.1 × 10^11,取十的幂次就是 10^11
37.6 比特落在「一般」那一档——对快速哈希来说,一块卡大约七秒钟的事。把长度翻倍到 16 位是 75.2 比特;长度不动、把字符集全打开只到 52.5 比特。按一个键位算,长度比花样划算得多。
局限
熵这个数假设密码是从你选的字符集里均匀随机取出来的。凡是人自己挑的密码,熵都更低,往往低得多,因为人会去够那些破解工具第一个试的东西:词、日期、键盘上的连排。所以这一页量的是策略,不是某个具体密码。破解时间是「一块现代显卡」的量级估算,不是任何一台具体机器的实测:有集群的攻击者,或者只是换一张更新的卡,都能把它按倍数压下去;而拿到手的哈希库可以离线慢慢磨,没有时间上限。下面这些这一页一条都不管——复用、钓鱼、键盘记录、走客服流程重置——而它们才是密码真正失守的方式,也都与熵无关。最后,这一页不会替你生成密码,原因写在本文件第一段:安全的生成器需要密码学安全的随机源,而一个纯计算做不到这件事。
常见问题
- 密码熵是怎么算出来的?
- 熵等于密码长度乘以字符集大小的以 2 为底的对数。勾上小写、大写和数字,字符集是 62 种,log₂(62) = 5.95 比特/字符,所以 16 位密码的熵是 95.3 比特。组合数是 2 的熵次方,这也正是用熵做单位的意义:密码变长时它是相加的,好算。
- 60 比特的熵够不够?破解时间该怎么读?
- 完全取决于网站怎么存你的密码。按每秒 10^10 次猜测算——一块现代显卡对付不加盐的快速哈希大概就是这个数——60 比特是连续算三年左右。换成 cost 12 的 bcrypt,同一块卡每秒只能试 10^4 次上下,同一个密码要算几百万年。所以 60 比特对付一个称职的网站够了,对付一个马虎的网站只能算勉强;80 比特两边都够。这两个数字在结果面板上就是并列的两行。
- 该加符号和大小写,还是干脆加长?
- 加长通常更划算,而且肯定更好记。从 8 位纯小写变成 16 位是 37.6 比特;长度不动、把字符集全打开只有 15 比特。字符集放宽只乘一次,而每多一个字符就再乘一次。所以符号该在网站强制要求的时候加,别把它当成加强度的捷径。
- 为什么这一页不给我生成密码?
- 一个密码有多难猜,上限是它背后那个随机源有多随机;而一个只负责算数、把结果印在页面上的工具,做不到从密码学安全的随机源里取字符——那正是「生成器」与「计算器」的分界线。用你密码管理器里自带的生成器,或者操作系统自带的那个,它们都有这样的随机源;生成完再回到这一页,检查你选的长度和字符集是不是值得。
- 密码越长就越强吗?
- 只有随机生成的时候才是。长度是这个算术唯一奖励的东西,也正因如此,四个随机单词组成的口令可以胜过一小串杂乱的符号;但一个由歌词、生日和名字拼出来的 20 位密码,字典攻击就能拿下,它的真实强度和这一页量出来的 20 位随机字符完全不是一回事。这一页给的是一套策略的上限,人手编出来的密码在这个上限之下很远的地方。
参考资料
- [科普中国]密码强度 — 科普中国
- NIST Special Publication 800-63B: Digital Identity Guidelines — Authentication and Lifecycle Management — National Institute of Standards and Technology
- Password Storage Cheat Sheet — OWASP Foundation