密码到底要不要「密码学随机」?Pseudo‑random 与 CSPRNG 的差别一次讲清
作者:Safe Local Tools 编辑组
**口令强度本质上取决于生成过程的不可预测性。**一旦随机流程可被推算或显著收窄搜索空间,再花哨的特殊字符规则也像纸门锁。
开发者常会不假思索调用语言内置「随机」方法;这些方法多半追求速度与统计特性(仿真、游戏、抽样),而不是对抗攻击者在观察到部分输出后仍可预测的抗性。
本文对照伪随机与密码学安全伪随机(CSPRNG),并结合 Mozilla 文档中的 Crypto.getRandomValues() 说明浏览器侧的稳妥用法;也会提到更广泛背景的 CSPRNG 维基条目。与此同时,Safe Local Tools 在浏览器本地完成口令草稿生成:适合你先在可控环境里试错,而不是随手把候选秘密发往不明的在线接口。

先把术语说清楚:PRNG 和「密码学安全」差在哪
伪随机数发生器 PRNG 用确定性的数学迭代把小种子扩展成长序列——种子或可推断状态时,后续输出就不再是真正的秘密。
CSPRNG 则在更强的假设下工作:即便攻击者看到过往输出片段,短期内也难以区分后续比特与均匀抛硬币的差异(措辞会因密码学模型而异,但工程结论是:生成密钥请走平台提供的安全随机接口)。
为什么 Math.random 不适合生成凭证
Math.random() 面向渲染动画与便捷抽样,不提供对抗逆向所需的语义。
// 仅为反面示例:不要用这种方式生成密钥材料
const unsafe = Math.random().toString(36).slice(2);表面上像乱码,底层状态空间未必有你想象的那么大。
const buf = new Uint8Array(16);
crypto.getRandomValues(buf);第二段从浏览器提供的安全随机源取字节,才是拼接令牌、临时口令的常见原材料(仍需配合无偏编码与威胁建模)。
在线速率限制救不了离线爆破
登录接口可以做节流与验证码;但一旦哈希库泄露,攻击者可以在离线集群里大规模试探。对抗离线爆破靠的是慢哈希(Argon2id / bcrypt / scrypt 等)、足够长的随机口令,以及不止依赖单一静态口令的第二因子。
熵与字符集:长度往往比「复杂度表演」重要
若均匀地从大小写与数字共 62 个符号里抽取,可能性大致随长度指数增长;人类自创口令往往集中在字典与键盘轨迹上,攻击者会用规则缩小范围。
{
"minLength": 16,
"requireUpper": false,
"requireDigits": true,
"charset": "base94-safe-subset"
}JSON 策略争论很常见:随机源正确只是第一步,还要避免模运算取余导致的抽样偏差,否则字符频率不再均匀。
模运算陷阱:为什么手写映射要小心
把 0..255 的随机字节简单 % alphabetLength 映射到自定义字母表,会造成轻微但不均匀的分布;样本一大,偏差就可能被利用。优先使用库内置的无偏映射或拒绝采样。
服务端:口令哈希 ≠ 令牌生成
用户口令入库应使用专用慢哈希与每用户盐值;API 密钥与会话令牌通常是可直接存放的高熵随机串,二者威胁模型不同——别混用一套「万能生成函数」不经评审。
虚拟化与启动早期的随机种子议题
现代操作系统大多能把硬件熵源喂饱随机池;但在克隆镜像、极度密集的冷启动场景里,仍要以厂商文档为准,不要盲目照搬十年前的都市传说。
浏览器生成与企业合规
前端生成适合原型与本地草稿:审计演示里临时捏一串密码很常见,但真正签发凭证仍要服从你们的日志与留存策略。Safe Local Tools 强调本地处理,降低「为了省事把候选口令粘贴到外部站点」的概率,但不能替代正式的密钥管理流程。
Diceware、口令短语与可记忆性
可记忆的短语若来自歌词或名言,往往在泄露库里出现过;骰子词表式的均匀抽取才是另一套工程方案。面向人类的口令与放进密码管理器 clipboard 的高熵串,UX 要求完全不同。
SSO 普及之后,随机口令仍然无处不在
即便企业统一身份认证普及,SSH key、Webhook、数据库连接串、临时一次性链接仍然大量依赖随机材料——这些都值得用同一套「安全随机 + 清晰编码」的工程纪律贯穿评审。
交付随机密码生成器 UI 前的自检清单
- 秘密字节来源使用
crypto.getRandomValues(或平台等价物)。 - 避免模偏差;不要自建看起来很聪明的
%映射。 - 向用户解释字符集与长度对应的含义。
- 提示剪贴板历史、录屏与聊天窗口等真实泄露面。
写在最后:随机性必要但不充分
密码学随机消灭了许多模板化弱点,但系统性安全仍取决于哈希参数、凭证存储、钓鱼防护与 MFA。Safe Local Tools 让你在本地快速迭代强口令草案——下一步就用 试用密码生成工具 → 对照你们的策略生成一版看得懂的样本。