随机与安全

随机密码与口令短语生成

生成随机密码,或者好输入、好记的口令短语。所有内容都在你的设备上,用浏览器的密码学随机数生成器产生,不会被保存或发送。

    ·

    按离线攻击快速、无盐哈希,每秒 100 亿次猜测估算,这是偏悲观的情形。有登录次数限制的在线攻击要慢得多。

    全部在你的浏览器里运行,这里输入的内容不会上传。

    怎么用

    1. 选密码会得到一串随机字符;选口令短语会得到几个随机英文单词,更容易输入和记忆。
    2. 生成密码时,用滑块设置长度,并勾选字符类型。如果密码需要念给别人听,或者要照着纸条输入,建议勾选避开易混淆字符。
    3. 生成口令短语时,选择单词个数和分隔符。
    4. 每次同时给出五个候选,复制你喜欢的那个即可。点重新生成再换五个。
    5. 看一下强度这一行:熵有多少 bit,以及在写明的假设下平均要多久能被破解。

    生成的密码不会保存在任何地方,既不在服务器上,也不在你的浏览器里。没复制就关掉页面,它就消失了。请把实际使用的密码存进密码管理器。

    密码是怎么生成的

    密码学安全的随机源

    每个字符都用 crypto.getRandomValues 选出。这是浏览器提供的密码学安全随机数生成器,种子来自操作系统。大家更熟悉的 Math.random 并不是为「不可预测」设计的,绝不能用来生成任何秘密。

    没有取模偏差

    生成器先取一个 32 位随机数,再把它变成比如 94 个字符里的一个。最直接的做法是除以 94 取余数,但这并不公平:2^32 不是 94 的整数倍,排在前面的几个字符出现的概率会略高一点点。本工具改用拒绝采样:落在取值范围顶端、凑不满一整轮的那部分随机数直接丢弃重抽,这样每个字符出现的概率都完全相等。

    熵

    强度用熵来衡量,也就是按当前设置一共可能生成多少种等概率的结果,用 bit 表示。长度为 L、字符集大小为 N 的密码,熵是 L × log2(N)。四类字符全选时 N = 94(26 个小写、26 个大写、10 个数字、32 个符号),16 位密码的熵是 16 × log2(94) ≈ 104.9 bit。口令短语同理:从 1296 个词的 EFF 短词表里每选一个词,增加 log2(1296) ≈ 10.3 bit。

    每多 1 bit,攻击者的工作量就翻一倍,所以长度比奇怪的符号重要得多。12 位字母数字密码再加 4 位,熵增加约 24 bit,破解工作量变成原来的 1600 多万倍;而在同样长度下勾选符号,只增加大约 7 bit。

    破解时间

    破解时间的估算假设攻击者已经偷到了密码哈希数据库,可以离线每秒尝试 100 亿次。对于快速、无盐的哈希,用现代显卡做到这个速度是现实的。平均来说,攻击者要试完一半的可能性才能猜中。如果网站用 bcrypt、Argon2 这类慢哈希算法保存密码,或者限制登录次数,攻击难度会再高几千到几百万倍,所以请把这个数字当作最坏情况来看。

    示例

    设置熵每秒 10¹⁰ 次猜测下的平均破解时间
    8 位小写字母37.6 bit约 10 秒
    8 位字母和数字47.6 bit约 3 小时
    12 位字母和数字71.5 bit约 5112 年
    16 位,四类字符全选104.9 bit约 5.9 × 10¹³ 年
    6 个词的口令短语62.0 bit约 8 年
    7 个词的口令短语72.4 bit约 9730 年

    像「ruby-otter-spend-cloth-tidy-sulk」这样 6 个词的口令短语,强度不如 12 位随机密码,但在手机上输入、以及记住它都要容易得多。用来保护其他账号的密码,比如密码管理器的主密码,建议用 7 个词以上。

    常见的「8 位、字母加数字」的规则,在上述离线攻击假设下只能撑大约 3 小时。这也是为什么现在的安全建议普遍把长度放在复杂度之前。

    局限与建议

    • 熵只在原样使用时才成立。 把其中一个词换成宠物的名字,或者在末尾加上「2026!」,都会让密码比显示的数字更容易被猜中。
    • 有些网站不接受某些符号,或者限制了最大长度。网站拒绝时,取消勾选符号或缩短长度,不要手动改字符。
    • 「每种类型至少一个」会排除少量缺某一类字符的组合,影响远小于 1 bit,显示的熵没有扣除这部分。
    • EFF 词表里有一个词带连字符(yo-yo)。用连字符作分隔符时,它看起来像两个词;强度不受影响,但如果容易让你混淆,可以改用空格分隔。
    • 口令短语用的是英文词表。 中文用户输入英文单词同样方便,而把中文词语转成拼音再用,并不会增加强度。
    • 请使用密码管理器。 每个网站都用不同的随机密码,比任何一个密码本身有多长更重要,而没有人能记住几十个随机密码。

    常见问题

    生成的密码会被保存或上传吗?

    不会。密码在你的浏览器里生成,只存在于当前页面,关闭就消失。不会被记录、传输,也不会写入浏览器存储。

    密码多长才够?

    字母加数字的随机密码至少 12 位,重要账号 16 位以上。口令短语至少 6 个词,主密码建议 7 个词以上。

    口令短语安全吗?

    只要单词是随机选出的(本工具就是这样),就是安全的。它的强度来自单词的个数,而不是单词有多生僻。

    为什么不用 Math.random?

    Math.random 为速度而设计,不保证不可预测,它的输出有时可以被推算出来。crypto.getRandomValues 才是浏览器为安全用途提供的接口。

    「熵多少 bit」是什么意思?

    它是可能生成的等概率密码总数取以 2 为底的对数。每多 1 bit,攻击者需要尝试的次数就翻一倍。

    参考资料

    用到这个工具的指南

    ↵ 打开 · Esc 关闭