使用方法
- 打开页面已经填好 8 位长度、62 字符集、单机 GPU 1e6 次/秒,结果区给出平均命中时间。点「估算」,或在数字框里按回车,结果立刻刷新。
- 「口令长度」范围 1 到 64,步长 1。填了小数或超出范围会给出指明原因的提示,不自动夹回边界。
- 「字符集」五档:数字 10、小写 26、大小写 52、字母数字 62、字母数字符号 94。默认 62。
- 「尝试速率」四档加自定义:在线限速 10、单机 GPU 1e6、集群 GPU 1e10、bcrypt cost=12 的 3.33333333333 次/秒。选「自定义」后下面那个数字框生效。
- 结果区分三层:上面一行是结论,中间是明细(空间、熵、平均秒数与年数),下面一段是同样长度下换三种速率的对照。
- 「复制结果」复制整段明细;「复制对照表」复制正文那张速率对照表,制表符分隔。
- 下面的长度与字符集对照表共 20 行(长度 6、8、10、12、16 × 字符集 26、52、62、94),默认显示 12 行。点「加载更多」展开全部,点「导出 CSV」存成带字节序标记的文件。
- 空间超过 1e15 时按科学计数法显示并注明「量级估计」——这是双精度的精度墙,不是页面偷懒。
这个 Brute力时间计算器能解决什么问题
第一类是把「我的口令够不够长」变成能比较的数字。说「12 位很安全」没有意义,要说清是 12 位什么字符集、在什么速率下。8 位 62 字符集在单机 GPU 上平均要 3.45946125571 年,在集群上只要 0.000345946125571 年——同一个口令,速率差 4 个数量级,结论完全反过来。
第二类是给口令策略定值。要定「最短几位」,得先知道目标速率:如果对手能做到 1e10 次/秒,8 位 62 字符集撑不过一小时;把长度加到 12 位,同样速率下的时间就抬了 4 个数量级。这一页能把这条曲线算出来。
第三类是评估慢哈希的收益。bcrypt cost=12 把速率压到 3.33333333333 次/秒,同样 8 位 62 字符集平均要 1037838.37671 年,比在线限速还慢 3 倍。这个数字能直接回答「要不要上慢哈希、cost 定多少」。
第四类是把「看起来复杂」的口令打回原形。Password123! 有大写、小写、数字、符号,看起来 12 位很够,但它在字典变体里的排名非常靠前,实际熵远低于 12 位随机的理论值。这一页给出理论空间与真实熵的差距,让人明白长度之外还要看随机性。
计算原理与变量说明
整页只有三个公式,加一个常量。
| 变量 | 公式 | 说明 |
|---|---|---|
| 理论空间 | 空间 = 字符集 ^ 长度 | 穷举要试的组合总数 |
| 信息熵 | 熵 = 长度 × log₂(字符集) | 单位是位 |
| 期望命中时间 | 空间 / (2 × 速率) | 平均要试一半 |
| 年换算 | 1 年 = 31556952 秒 | 按 365.2425 天 |
| 每位熵 | log₂(字符集) | 26 → 4.70043971814 |
期望时间是空间的一半,不是全部——这是本页最常被算错的一条。平均而言要试到一半才撞上:运气最差试完整个空间,运气最好第一次就中,均匀分布下的期望是空间除以 2。8 位 62 字符集空间是 218340105584896,除以 2 再除以 31556952 秒,才是下面这几档结果:在线限速 10 次/秒下平均需要 345946.125571 年;单机 GPU 1e6 次/秒下 3.45946125571 年;集群 GPU 1e10 次/秒下 0.000345946125571 年,约合三小时。速率每提升 6 个数量级,破解时间就降 6 个数量级——长度与速率是同一场竞赛的两边,只谈一边没有意义。
慢哈希是工程上唯一能主动压速率的手段。bcrypt cost=12 单次约 0.3 秒,速率降到 3.33333333333 次/秒,同样 8 位 62 字符集平均要 1037838.37671 年——比在线限速的 345946.125571 年还慢 3 倍。加长口令加的是指数上的位数,慢哈希砍的是底数上的速率;前者要说服用户,后者只改服务端配置。argon2id 与 scrypt 同理,其中 memory-hard 的设计专门用来对抗 ASIC 与 GPU 的并行优势。
理论空间不等于人的实际熵,这是本页最重要的一条。8 位随机小写字母的理论熵是 37.6035177451 位,但真人选的口令集中在词典与常见模式上,口令本前 10 的 6 次方条覆盖的实测熵只有约 20 位:在 1e10 次/秒下平均 0.00005 秒就撞上。所以「加长度」不如「加随机性」——8 位真随机的抗穷举能力远超 12 位常用词变体。本页算的是均匀随机前提下的穷举时间,真人口令的真实强度要用词典攻击的模型去估,两者差好几个数量级。
字符集每扩一档,每位熵的增量其实很小。小写 26 是 4.70043971814 位/字符,大小写 52 是 5.70043971814,字母数字 62 是 5.95419631039,字母数字符号 94 是 6.55458885168。从 26 扩到 94 只让每位多 1.85 位,而长度多加一位就多 4.7 位——「长度优先于符号」是有量化依据的,不是经验之谈。这也是为什么把强制「必须含大写和数字」换成「至少 12 位」通常更划算。
完整示例(数值仅作演示)
默认值 8 位 × 62 字符集:空间 218340105584896,熵 47.6335704831 位,速率 1e6 次/秒时平均 109170052792.45 秒 = 3.45946125571 年。
换字符集看同一长度:8 位小写 26 是 208827064576;8 位大小写 52 是 53459728531456;8 位字母数字符号 94 是 6095689385410816。字符集从 26 到 94,空间扩大约 2.9 万倍。
换长度看同一字符集:62 字符集下 6 位是 56800235584,8 位是 218340105584896,10 位约 8.3930e+17,12 位约 3.2263e+21。每加两位,空间乘一次 62² = 3844。
精度墙那条:26 的 12 次方精确值是 95428956661682176,而双精度的 Math.pow 给 95428956661682180。两个都超过 2 的 53 次方(9007199254740992),页面这时只给 9.5429e+16 这样的量级,不装作精确。
长度与字符集对照表
第一张表是同一长度换四档字符集的空间,「复制对照表」复制的就是它。
| 长度 | 字符集 26 | 字符集 52 | 字符集 62 | 字符集 94 |
|---|---|---|---|---|
| 6 | 308915776 | 19770609664 | 56800235584 | 689869781056 |
| 8 | 208827064576 | 53459728531456 | 218340105584896 | 6095689385410816 |
| 10 | 1.4117e+14 | 1.4456e+17 | 8.3930e+17 | 5.3862e+19 |
| 12 | 9.5429e+16 | 3.9088e+20 | 3.2263e+21 | 4.7592e+23 |
| 16 | 4.3609e+22 | 2.8610e+27 | 4.7672e+28 | 4.7178e+31 |
第二张表是每位熵与整串熵,用来核对「长度优先」这个结论。
| 字符集 | 每位熵(位) | 8 位总熵 | 12 位总熵 |
|---|---|---|---|
| 26 | 4.70043971814 | 37.6035177451 | 56.4052766177 |
| 52 | 5.70043971814 | 45.6035177451 | 68.4052766177 |
| 62 | 5.95419631039 | 47.6335704831 | 71.4503557246 |
| 94 | 6.55458885168 | 52.4367108134 | 78.6550662201 |
| 62(16 位) | 5.95419631039 | 47.6335704831 | 95.2671409662 |
第三张表是速率档位,同一空间换速率的结果。
| 速率档 | 次/秒 | 8 位 62 平均耗时(年) |
|---|---|---|
| 在线限速 | 10 | 345946.125571 |
| 单机 GPU | 1e6 | 3.45946125571 |
| 集群 GPU | 1e10 | 0.000345946125571 |
| bcrypt cost=12 | 3.33333333333 | 1037838.37671 |
| 1 年秒数 | 31556952 | 365.2425 天 |
读法:第一张看长度与字符集的量级,第二张看每位熵的增量有多小,第三张看速率那一档有多关键。
结果边界、舍入与适用说明
- 长度留空、写成小数或超出 1 到 64 时,分别给出指明原因的提示,不自动夹回边界。
- 自定义速率为 0、负数或非数字时提示速率必须大于 0 且为有限数;写成 1e99 之类会提示超出上限。
- 空间大于等于 1e15 时按 4 位有效数字的科学计数法显示并注明量级估计,不再写完整数字。
- 年换算固定取 31556952 秒(365.2425 天),不按具体年份的实际天数调整。
- 平均命中时间按均匀分布算,即空间除以 2;最坏情况要再乘 2,本页不单列。
- 本页算的是均匀随机前提下的逐位穷举,不建模词典攻击、规则变换与撞库。
- 真人选的口令熵远低于理论值,8 位随机的理论值不能直接套到人设的口令上。
- 速率档位是典型量级,实际值取决于算法、硬件、盐与是否加盐、是否有限流。
- 整页不联网、不写本地存储;下载的 CSV 带字节序标记,复制的文本不带。
常见问题
为什么期望时间是空间的一半?
因为均匀穷举平均要试到一半才撞上。空间 218340105584896 除以 2 再除以速率,才是平均命中时间;最坏情况要试完整个空间。
为什么大数用科学计数法?
因为双精度只有 53 位有效尾数,2 的 53 次方是 9007199254740992,超过它的整数已经不精确。26 的 12 次方精确是 95428956661682176,Math.pow 给 95428956661682180,写完整数字是假的。
字符集越复杂越好吗?
增量很小。小写 26 是 4.70043971814 位/字符,94 也才 6.55458885168,扩 3.6 倍字符集只多 1.85 位;长度多加一位就有 4.7 位。所以长度优先于符号。
慢哈希真的有用吗?
有用,它砍的是速率这个底数。bcrypt cost=12 把速率压到 3.33333333333 次/秒,8 位 62 字符集平均要 1037838.37671 年,比在线限速还慢 3 倍。
为什么我的 12 位口令还是不安全?
因为理论空间不等于实际熵。真人选的口令集中在词典与常见模式上,口令本前 10 的 6 次方条覆盖的实测熵只有约 20 位,在 1e10 次/秒下平均 0.00005 秒。
一年为什么是 31556952 秒?
按 365.2425 天的平均回归年算:365.2425 × 86400 = 31556952 秒。用它会让长跨度估算不随具体闰年漂移。
集群 1e10 次/秒现实吗?
这是典型量级,用于对比不同档位的差距,不是某一台具体设备的指标。实际值取决于算法、硬件、是否加盐与是否有限流。
输入的口令会上传吗?
不会,而且本页也不需要你输入口令:只填长度、字符集与速率三个数,没有任何文本被发送,也没有写入本地存储。