"在一个随便找到的网站上生成密码安全吗?"这是个合理的问题——你在请求一个你无法控制的工具,生成一个即将被你用来托付账户安全的秘密。诚实的答案是:这完全取决于这个工具的实际运作方式,而你不需要仅凭网站的一面之词来判断。本文解释你可以自己动手检查什么。
太长不看版
- 真正的风险不在密码本身——而在于网站是否把生成的内容传输到服务器,从而存在被记录的可能。
- 你可以自己验证:打开浏览器开发者工具,切到网络面板,生成一个密码,观察是否有任何请求被触发。
- 真正的客户端生成器,在生成密码时不会产生任何网络活动——JavaScript 完全在你的浏览器里运行。
- 优先选择明确说明使用 Web Crypto API(
crypto.getRandomValues())的工具,而不是完全不披露随机性来源的工具。
简短回答
一个在线密码生成器只有在完全在你的浏览器里生成密码、且从不传输到任何地方时,才是安全的。PassGenerate 就是这样运作的:生成过程通过 Web Crypto API 在本地完成,你可以用浏览器自带的开发者工具,在一分钟之内自己验证这一点,不需要相信网站上的任何说法。
如何自己动手验证一个生成器
不需要是开发者也能做这个检查:
- 打开密码生成器网站。
- 打开浏览器开发者工具(大多数浏览器按 F12,或右键点击 → 检查)。
- 点击**网络(Network)**面板。
- 在页面上生成一个密码。
- 观察网络面板。如果这是一个真正的客户端工具,生成密码时你会看到没有新的请求被触发——什么都没有被发送到任何地方。如果你看到点击生成的瞬间有请求发往服务器,那就值得深入看看:检查一下请求体里发送了什么数据。
这个方法之所以有效,是因为浏览器里运行的 JavaScript 要么完全在本地完成工作(计算出随机密码并显示出来,仅此而已),要么把数据发送到服务器并等待响应。网络面板会告诉你实际发生的是哪一种——这不是网站能瞒着你伪造的东西,因为你检查的是浏览器实际发出的流量。
"客户端生成"在技术上到底意味着什么
真正的客户端密码生成器使用浏览器自带的 Web Crypto API,具体来说是 crypto.getRandomValues(),生成密码学安全的随机字节,然后完全在你设备上运行的 JavaScript 中,把这些字节映射到你选择的字符集。这个过程完全不需要——也不会因为有——网络请求而受益。如果一个工具需要让你的浏览器和服务器通信才能"生成"密码,那么这在架构上对这项任务来说是不必要的,这一点本身就值得质疑。
值得警惕的危险信号
- 不披露随机性来源。 如果一个网站没有说明它如何生成随机性,你就无法验证它使用的是 CSPRNG,还是像
Math.random()这样较弱的方法——后者在某些引擎中可预测到能从观察到的输出反推出来,不适合用于任何安全敏感的场景。 - 生成时有网络活动。 通过上面的开发者工具检查可以确认。即使网站声称不记录任何内容,只要存在请求,就存在被记录的可能,不管是故意的还是服务器端的 bug 导致的。
- 在你使用工具之前就要求注册账号或留邮箱。 生成一个随机字符串,没有任何正当理由需要你的邮箱地址。
- 过多的第三方脚本。 一个处理敏感信息的页面上堆砌了大量广告技术或分析工具,会扩大攻击面——页面上运行的第三方代码越多,一旦其中某个脚本被攻破,能截获页面上内容的机会就越多,即使生成器本身是客户端的。这不是假设性的担忧:2024 年 6 月,被广泛使用的 Polyfill.js CDN 遭到攻击,被注入的恶意代码被投放给了超过 49 万个网站的访问者——这些网站没有一个是被单独针对的,它们只是像日常依赖那样引入了这个脚本。现在一个普通网站平均要加载几十个脚本,其中大约三分之二来自第三方,而且第三方参与的安全事件比例逐年大幅上升。这并不意味着带有第三方脚本的页面就一定不安全——但这是一个真实的理由,让你更倾向于选择页面精简、便于审查的生成器,而不是捆绑了大量无关工具的那种。
为什么这对某些密码来说更重要
使用不可信生成器的风险,会随着这个密码所保护的内容而变化。为一次性的新闻订阅注册生成一个用完即弃的密码,即使工具本身有问题,风险也很小。而生成你的银行密码、邮箱密码,或者密码管理器的主密码,正是你应该坚持自己验证客户端行为、而不是轻信一面之词的场景——因为这些正是一旦有明文副本被记录下来会真正造成后果的密码。
关键要点
- 任何在线密码生成器的核心安全问题,是它是否把密码传输到了任何地方——通过网络面板自己验证,而不是轻信一面之词。
- 真正的客户端生成,在生成密码时会产生零网络请求。
- 优先选择明确披露使用 Web Crypto API CSPRNG 的工具,而不是完全不解释随机性来源的工具。
- 对高风险密码(银行、邮箱、主密码)使用的生成器要比对低风险、用完即弃的密码更加谨慎地审查。
为什么可以信任 PassGenerate
- 密码使用 Web Crypto API 在你的浏览器本地生成。
- 不会向服务器传输任何密码。
- 使用密码学安全伪随机数生成器(CSPRNG)。
- 遵循 NIST 和 OWASP 推荐的现代安全最佳实践。
参考资料
- Polyfill.js CDN 供应链攻击事件,2024 年 6 月
- MDN Web Crypto API 文档
- OWASP 密码存储速查表
- NIST SP 800-63B – 数字身份指南
结论
你不需要仅凭一个在线密码生成器的说法来判断它是如何工作的——用浏览器网络面板花一分钟检查一下,就能明确知道它是否在传输生成的内容。优先选择使用 Web Crypto API CSPRNG、除了生成密码之外不索取任何额外信息、并且你已经亲自确认不产生任何网络活动的工具——对那些一旦出问题后果最严重的密码,保留最高程度的审查。