一个比特到底买到了什么
发布于 2026-11-03 · 最近复核 2026-11-06
几乎每一个密码强度条都会在屏幕上画一根条,说它强或弱,却几乎没有一个告诉你那根条量的是什么。而这正是值得知道的部分:它背后的数字是一次任何人都能重做的算术——密码有多长、抽它用的字符集合有多大、攻击者要把这个集合走一遍需要猜多少次。其余的一切——颜色、标签、「要几百年」那句话——都只是这一次乘法的包装。
问题的另一半是随机性从哪来,而这一半没法用截图证明:一个从可预测的源头生成的密码,再长也一文不值。在站上,这两半都写在用到它们的那一页上,而这一篇是长的那个版本。
一个比特,就是攻击者必须猜对的一次抛硬币
一比特熵的意思是:可能答案的空间比少一比特时大了一倍。十六个字符取自一张 86 个字符的字母表,填满的空间是 86 的 16 次方种可能;而比特数就是以二为底写同一个数时需要的指数:16 × log2(86) = 102.8 比特。所以这个数会同时随两个因子增长——多一个字符,整个空间乘上整张字母表;而字母表变宽,每次乘上去的数小一点,因为底数越大,对数长得越慢。
比特数不是一个概率,也不是对你输入的那个密码的测量;它是这个密码被抽出来时那个空间的大小,只是用攻击成本天然的单位写了出重。比特数相同的两个密码,暴力穷举起来的代价相同——这就是这条公式能支持的结论,不多也不少。
字母表的大小是从哪里来的
本站的生成器从四个字符类里抽,并且老老实实地数:26 个小写、26 个大写、10 个数字,加上它愿意打出来的 24 个标点,一共 86 个字符。标点是一张挑过的清单,而不是全部可打印字符——没有引号、没有反斜杠,于是结果可以直接粘进终端或表格,不用转义任何东西。
去掉易混字符会改变这个数,而页面把两个都印出来:去掉 I、l、1、O、0 与 o 之后还剩 80 个字符,于是十六位是 16 × log2(80) = 101.2 比特,而不是 102.8。那 1.7 比特的代价,换来的是别人照着屏幕手打时不会打错,在十六位这个长度上很划算。
强度计量表故意用另一组数:26 + 26 + 10 + 33 = 95,也就是所有计量表都在用的常规可打印标点大小。两个数字不同,因为它们回答的是不同的问题——生成器从哪张表里抽,和一个不是在本站生成的密码可能是从哪张表里抽——两个都印出来,而不是悄悄凑成一个。
口令短语按词算,不按字符算
口令短语用的是同一条公式、换了一张字母表:每个词都是从 324 个具体短词里抽一次,于是 6 个词是 6 × log2(324) = 50.0 比特。这差不多等于最宽字母表的十二个字符,却远比十二个随机字符好记好打,这正是这个模式存在的全部理由。由此得到一条值得重复的规则:想要更强,加词,不要加标点。
诚实的那一半是那处盲点。一个按字符集合算的公式,拿到一句人写的长短语,会看到 28 个字符并印出一座堡垒;而懂英语的攻击者会把它切成词,去搜词与词的组合,那是小得多的空间。所以本站的计量表在能算的时候把两条公式并排印出来,并且拒绝只凭字符数就说一句短语很强。
为什么这套算术发生在这个标签页里
随机的那一半来自 crypto.getRandomValues,浏览器自带的加密源——和操作系统用来生成密钥的是同一类东西。有两个细节让它不只是「看起来随机」:第一,每一次抽取都是均匀的,因为把一个 32 位整数对字母表大小取模,只要大小除不尽整个空间就会带偏,所以代码会拒掉区间顶部再抽一次;第二,页面上没有任何种子框——一个能从某个数字重新生成的密码,就是任何知道那个数字的人都能重新生成的密码。
在标签页里做这件事不是性能考虑,而是唯一能守住页面承诺的安排。输入和生成的东西一个字节都不往外发,于是没有一个能记下密码的服务器,没有留在历史里的请求,也没有可配置错的接收端点。计量框是一个密码字段,框架拒绝把它的值写进地址栏——所以粘进计量框的密码不会跑进书签或分享链接。这个安排的代价是页面没法查泄露库(那需要一次查询)、也没法在刷新之后记住某一批(那需要存储),页面把这两件事说出来,而不是假装没有。
这些数字从哪里来
- 上面每一个数字都是算出来的,不是抄下来的读数。字母表、比特数与词库都遵循同一套熵计算:它给出这组设置可抽取的字母表,按「长度 × log2(字母表)」算字符密码的比特数,把短语的三项加起来算口令短语,并用词库里的词数作除数。工具页与这一篇用的是同一套计算。
- 每次发布都会直接核对恒等式:页面印出的比特数等于长度 × log2(页面承诺的那张字母表),每条密码的每个字符都落在那张表里,剔除易混字符之后它们一个都不出现,而导出的 TXT 与 CSV 恰好是一行一条、每条正好是填进去的长度。
- 公式是引用来的,不是编的。长度 × log2(字母表) 是标准的密钥空间估计;在本站它还是一个上界,因为生成器保证你留下的每一类至少出现一次。破解时间除的那三个攻击速度是印在旁边的假设,而不是对某台机器的测量。
这一篇没有说什么
它不衡量你的密码在现实里有多强:重复使用、钓鱼、以及把哈希存坏了的网站,才是真正让人被入侵的原因,而这些在比特数里一个都看不见。它也不讲密码管理器、双因素认证,或者一个服务应该怎样存密码——那些属于服务,不属于挑密码的人。它同样不谈生成密钥:给人用的密码和给机器用的密钥有不同的威胁模型,像这样的页面不该被用来铸造 API 密钥。
到 密码生成器与强度检测 里生成一个;也可以把同一个加密源用在不是密码的地方: UUID 与随机字符串生成器 与 哈希生成器。
以上只是解释——不构成针对任何具体系统的安全建议。 阅读完整免责声明。