跳到主要内容
Tooletto

密码生成器

在你的浏览器中生成密码学安全的密码和便于记忆的密码短语。没有任何内容被传输或记录,随机性来自你的操作系统本身。

  • 文件永不离开你的设备
  • 免费,无需注册
  • 无水印
  • 加载后可离线使用
Loading tool…

如何密码生成器

  1. 1

    选择一种风格

    选择随机字符密码,或者便于记忆的多单词密码短语。

  2. 2

    设置长度和字符集

    强度指示器会随你调整实时显示真实的熵(单位为比特)。

  3. 3

    复制它

    把密码直接复制进你的密码管理器。

为什么长度几乎总是胜过复杂度

一个随机密码的强度,是由给定长度和字符集下可能存在多少种密码决定的,而这个数字会随着长度呈指数级增长,却只随字符集大小呈线性增长——多一个字符位置,会让总的可能性空间成倍增加,而多允许一种符号类型,几乎不会带来多少变化。一个只用小写字母的 20 位密码,每个位置有 26 种可能,20 个位置组合起来,总组合数远远超过一个从更丰富的 94 种可能字符(大写、小写、数字和符号合计)中抽取、却只有 8 个位置的密码。这正是长度在密码强度中占主导地位的数学原因,也是为什么"加符号、混合大小写"这条流传已久的建议,重要性远不如单纯把密码加长。

"密码学安全"在这里究竟意味着什么

并非所有随机数生成器都同样不可预测。JavaScript 内置的通用随机函数 `Math.random()`,是为动画或打乱一个游戏棋盘这类场景的速度和统计分布设计的——它不是为了抵御一个专门试图预测其输出的攻击者而设计的,在某些实现里,它的内部状态甚至可以从少量观测到的输出中被部分还原。这个工具改用的 `crypto.getRandomValues()` 接口,取用的是操作系统的密码学随机数源——和生成加密密钥所使用的是同一个底层源——它的构建和审计,专门就是为了抵御这类预测攻击。在生成密码时使用 CSPRNG(密码学安全的伪随机数生成器)之外的任何其他方式,都是一个真实、可被利用的弱点,而不只是理论上的风险——已经有好几个公开披露的密码生成器 bug,正是源于这种替换。

读懂熵值,以及那些常见门槛数字的来源

熵,以比特为单位,描述的是攻击者需要多少次尝试才能穷举完所有可能性,找到正确的那一个——每多一比特,这个数字就翻一倍,所以这种关系是指数级的,而不是线性的,从 60 比特跳到 70 比特,代表的是攻击者工作量一千倍的增长,而不是一个温和的十点提升。低于大约 50 比特,用现代硬件进行持续的暴力破解,在实际可行的时间范围内确实是可能的。70–80 比特这个区间,对一个保护普通在线账户的日常密码来说是比较让人放心的。超过 100 比特,已经远远超出了当前任何可以想象的算力能穷举的范围,这正是这个工具的建议和它的强度指示器,都围绕这几个具体门槛来锚定,而不是给出一句模糊的"再强一点"建议的原因。

常见问题

在一个网站上生成密码安全吗?

对这个工具来说是安全的——密码由 `crypto.getRandomValues` 生成,这是你操作系统的密码学随机源,永远不会离开这个页面。没有网络请求可供截获,也没有任何存储的内容。你可以断开网络连接,它依然能正常工作,你可以自己验证这一点。

密码应该多长?

至少 16 个字符,来自一个混合字符集,这能提供大约 100 比特的熵——远远超出任何可行的暴力破解范围。长度远比特殊字符重要得多:一个 20 位纯小写字母的密码,比一个带符号的 8 位密码更强。

熵这个数值代表什么?

熵的比特数衡量的是攻击者需要尝试多少次猜测。每多一比特,这个数字就翻一倍。低于 50 比特是弱密码,70–80 比特算合理,超过 100 比特就超出了当前任何攻击手段的能力范围。

密码短语和随机密码一样安全吗?

是的,前提是这些单词是随机选取的。从一个很大的词表里随机选四个词,大约能提供 52 比特的熵;六个词大约是 78 比特。它的优势在于你真的能记住并输入它们——这对那些没法存进密码管理器的少数密码来说很重要。

为什么要避免使用容易混淆的字符?

因为 0/O 和 1/l/I 在很多字体里根本无法区分。排除它们只会损失几比特的熵,却能在密码需要被朗读出来或者从打印件上抄录时,省去实实在在的麻烦。

密码生成器常见任务