跳到正文

随机密钥生成

Random Key Generator

按指定长度生成密码学随机字节,输出十六进制、Base64 或 Base64URL,用作应用的 secret。

一个 `SECRET_KEY` 或者 JWT 签名密钥,需要的是指定长度、指定编码的随机字节,而常见的临时凑合——乱敲键盘、一个 UUID、项目名的哈希——熵都比看起来少。这里产出这些字节并编码。

🔒 完全在你的浏览器里运行randomkeysecretgenerator

随机密钥串

FjJJH_0aUHKakXGpAtdXK0OLXfXxIDCCbv2GrnGXoEY
以 JWK(oct)查看
{
  "kty": "oct",
  "k": "FjJJH_0aUHKakXGpAtdXK0OLXfXxIDCCbv2GrnGXoEY",
  "ext": true
}

WebCrypto 密钥

一个真正的 CryptoKey,导出成 JWK,可以直接交给 crypto.subtle 用。

每一个字节都来自 crypto.getRandomValues,而且不会离开这个标签页。既不在服务器上生成,也不会送到服务器去。

怎么用

  1. 选择字节长度

    32 字节(256 比特)几乎覆盖一切——HMAC-SHA256、AES-256、会话密钥。对这些算法来说更长并不更强;有用的长度由算法定义。

  2. 选配置需要的编码

    十六进制没有歧义,长度是两倍。Base64URL 避开了 `+`、`/` 和 `=`,在 URL、请求头或者会被别的东西解析的 `.env` 文件里,你要的就是这个。

  3. 放进密钥存储,不要放进仓库

    提交过一次的密钥就是必须轮换的密钥,不管那次提交回滚得多快。每个环境生成一个不同的。

常见问题

随机性来自哪里?

`crypto.getRandomValues`,浏览器的 CSPRNG,由操作系统播种。什么都不传输,什么都不保存。

浏览器里生成的密钥和 `openssl rand` 出的一样好吗?

随机性的质量相同——两者都取自操作系统。区别在于密钥显示在哪里:在屏幕上,可能在一个会同步的浏览器里,可能有一个扩展在盯着 DOM。在不由你控制的机器上,用命令行。

能用它生成 UUID 吗?

用 UUID 生成器——UUIDv4 有固定布局,有六个比特用在版本和变体上,所以一串原始随机字符串不是一个有效的 UUID。

可以从这些接进来

接下来

这些工具吃得下当前工具的产出,结果可以直接送过去。