随机数取自 crypto.getRandomValues,并用拒绝采样去掉取模偏差;每一位都单独抽样,再用 Fisher–Yates 打乱位置,所以「每类字符至少出现一个」不会固定排在开头。长度滑杆和四类勾选改完立刻重算字符池并重新生成;两个输入框(只允许哪些符号、排除哪些字符)是你停手后约四分之一秒算一次,免得打一个字换一把密码。「隐藏明文」和「四位分组」只改显示、不改密码本身。这个页面不提供 Math.random 兜底:浏览器拿不到密码学随机数时会直接停下,而不是给你一个看着像随机、其实可预测的结果。
口径是 长度 × log2(字符池大小),再扣掉「每类字符至少出现一次」这条规则带来的收缩;强度行里同时把池子大小写出来,方便你自己核对。默认 16 位、四类全勾时池子是 26+26+10+27 = 89 个字符,朴素算是 16 × log2(89) ≈ 103.6,页面显示「约 103 bits」。为什么要扣:页面保证每种勾过的类型至少出现一个,于是有一批组合它根本生成不出来,攻击者不必试。这个差别只在短密码上才值钱——4 位、四类全勾时真正能生成的组合只有 4! × 26 × 26 × 10 × 27 = 438 万种,即约 22.1 bits,朴素口径会报 25.9,差出 3.8 bit(穷举时间差十几倍),所以这里按 22 显示并直接标成极弱;12 位以上差值已经不到 0.5 bit,正常长度下你看到的就是标准算法。另外两个前提是:每一位都在整池里等概率取(页面确实这么取),以及攻击者知道你的池子和规则。
按上面折算出来的熵分五档:40 bits 以下极弱、40~56 较弱、56~80 中等、80~120 强、120 以上极强。分档看的是「能不能被机器批量试完」,不是位数:4 位四类全勾只有 22 bits,直接落进极弱;8 位约 51 bits 只是较弱;12 位约 77 bits 才够中等;默认 16 位约 103 bits 是强;同一套字符池要 19 位才升到极强。所以「我勾了 4 种类型」不等于安全,位数才是主要变量。
这是一道纯算术:2 的熵次方 ÷ 每秒 1011 次,页面按最坏情况(穷举到最后一颗针)给数,平均值再减一半;只给数量级,不给精确年份。默认那套 16 位设置给出的是「约 1013 年」。每秒 1011 次是把「一块高端显卡跑快速哈希」当参照的假设值,不是对任何具体设备的测量。它只在一种场景成立:密码库被拖走、攻击者在你看不见的地方离线猜哈希。正常网站登录有失败次数限制,套不上这个数,所以「一亿年」不等于「你的账号绝对安全」——账号安全更取决于有没有复用密码、有没有开二次验证。
两种改法:关掉「特殊符号」就只剩字母与数字;或者在「只允许这些符号」里原样填进站点允许的那几个字符(不要求在原表内;空格一律直接去掉,字母和数字会被去掉并点名提示——它们归上面三个复选框管,混进符号框会让两类重叠、熵算不准)。反方向的限制用「排除这些字符」,比如某个老系统不接受 & 与 <,就把它们填进去。点「填安全符号」会填入 - _ . ~ ! $ ( ) * , 这 10 个:前四个是 URL 规范里的 unreserved 标点,后六个是规范允许直接出现在链接里的子分隔符,刻意避开了 & + = ? # % / : < > 这些在链接、表单、命令行里会被当成结构字符的符号,适合要粘进网址或配置文件的场合;这时字符池变成 26+26+10+10 = 72 个,16 位约 98 bits。
会,但很有限。默认的 il1ILoO0 八个字符里有六个是字母、两个是数字,符号表里一个都没有,所以四类全勾时池子从 89 降到 81,16 位折算熵从约 103.4 掉到约 101.1,也就是差 2 bit 上下。要手抄、要在电话里念给对方听,这 2 bit 换掉的误读风险更值;纯在系统里复制粘贴,就不必排。
只存在当前页面的内存变量里,逐条复制、或按「复制全部」一次拿走(每行一条,正好粘进表格)。不写 localStorage、不写 Cookie、不进浏览历史、也不写进地址栏;刷新页面或关掉标签页就都不在了。所以先粘进密码管理器再点「重新生成」,否则上一批找不回来。
页面先试系统的剪贴板接口,不可用时退回隐藏文本框方式再试一次。两条路都被浏览器挡住时,会自动取消「隐藏明文」和「四位分组」,把整段明文选中并告诉你怎么办:电脑上按 Ctrl+C,手机上长按选区。这样「手动选中」这条退路是真的能用,而不是把你刚选上的东西又清掉。
只勾「数字」、长度调到 4–8 就是纯数字码。注意强度行会诚实地把它标成极弱:4 位纯数字只有 13 bits、总共一万种组合,强度行给的耗时是「不到 1 秒」,只适合机械门锁、临时访客这类根本没人批量试的场景,别用在能被远程反复提交登录的账号上。