使用方法
- 设置长度,并选择按随机数据的字节数还是按 Base64 字符数计算。生成密钥时建议按字节,32 字节即 256 位密钥。
- 设置需要生成的数量,以及各结果之间的分隔符:换行、逗号或空格。
- 选择标准或 URL 安全变体。按字节生成时,如果目标系统不需要末尾的等号,还可以关闭填充。
- 点击“生成”获取新的随机值,然后点击“全部复制”或“下载”。
字节、字符与熵
随机字符串的强度用熵(以位为单位)来衡量。每个随机字节提供 8 位熵,因此 16 字节是 128 位,32 字节是 256 位。Base64 只是改变了这些字节的书写方式:每个字符承载 6 位,每 3 个字节变成 4 个字符。工具会显示每个字符串的熵,方便你随时核对。
选择字节单位时,输出解码后正好是指定数量的随机字节,这正是密钥和机密所需要的。选择字符单位时,会得到精确数量的字符,每个字符都从 64 个字符的字母表中均匀选取,适合系统要求固定长度、并按文本保存的令牌。
| 字节数 | Base64 字符数 | 熵 | 典型用途 |
|---|---|---|---|
| 12 | 16 | 96 位 | AES-GCM 的 nonce(IV) |
| 16 | 24(不填充时 22) | 128 位 | 盐值、会话令牌、CSRF 令牌、AES-128 密钥 |
| 32 | 44(不填充时 43) | 256 位 | AES-256 和 HMAC-SHA256 密钥、HS256 密钥、API 密钥 |
| 64 | 88(不填充时 86) | 512 位 | HMAC-SHA512 密钥、HS512 密钥 |
随机 Base64 的常见用途
- JWT 密钥。RFC 7518 要求 HMAC 密钥长度不小于哈希输出长度:HS256 至少 32 字节,HS384 至少 48 字节,HS512 至少 64 字节。有的程序库直接把密钥字符串当作密钥,有的会先做 Base64 解码,请确认你所用的库属于哪一种。JWT 解码工具可以用这两种形式的密钥验证 HS256 到 HS512 签名,HMAC 生成器也支持以文本、十六进制或 Base64 形式输入密钥。
- 应用密钥。例如 Laravel 会把 32 字节的加密密钥以
APP_KEY=base64:...的形式写在.env文件中,与本工具按 32 字节生成的字符串格式相同。 - Kubernetes Secret。
data下的值必须是带填充的标准 Base64。按字节、标准变体并开启填充生成的字符串可以直接填入,Pod 拿到的是原始随机字节。如果应用需要的是 Base64 文本本身,请改用stringData。 - URL 中的令牌。重置密码链接、邀请码等需要放进 URL 的令牌应使用 URL 安全变体,它用
-和_代替+和/,详见 Base64URL。
为什么用 crypto.getRandomValues 而不是 Math.random
Math.random() 是快速的通用随机数生成器,其输出并不保证不可预测,在某些 JavaScript 引擎中,只需少量输出就能推算出内部状态。本工具使用 crypto.getRandomValues(),这是由操作系统提供种子的加密安全随机数生成器,与 openssl rand 和 Python 的 secrets 模块属于同一类随机源。所有值都在你的设备上生成,不会被发送或保存。
在代码中生成随机 Base64
# Shell:32 个随机字节的 Base64(44 个字符)
openssl rand -base64 32
head -c 32 /dev/urandom | base64
# Python
import base64, secrets
base64.b64encode(secrets.token_bytes(32)).decode()
secrets.token_urlsafe(32) # URL 安全,无填充,43 个字符
// Node.js
const crypto = require('crypto');
crypto.randomBytes(32).toString('base64');
crypto.randomBytes(32).toString('base64url'); // URL 安全,无填充
// 浏览器
const bytes = crypto.getRandomValues(new Uint8Array(32));
btoa(String.fromCharCode(...bytes));
常见问题
随机密钥应该多长?
如果只要求值唯一且无法被猜到,例如会话 ID、CSRF 令牌和盐值,16 字节(128 位)就足够了。AES-256 密钥、HMAC-SHA256 密钥和 HS256 密钥建议使用 32 字节(256 位),HMAC-SHA512 和 HS512 则使用 64 字节。
和 openssl rand -base64 32 的结果一样吗?
=,解码后是 32 个随机字节。当然,每次生成的具体值都不一样。应该按字节还是按字符设置长度?
如果字符串之后要被解码,例如加密密钥和 Kubernetes Secret,请按字节。如果系统需要固定长度、直接按文本使用的令牌,请按字符。按字符生成的字符串,只有长度是 4 的倍数时才能保证正常解码。
什么时候需要 URL 安全变体?
/ 会分隔 URL 路径,+ 在表单编码的查询字符串里会变成空格。URL 安全的 Base64 改用 - 和 _,通常也不带填充。生成的值会被保存或上传吗?
不会。所有值都由浏览器中的 JavaScript 生成,不会传输到任何地方,离开页面后即消失。一旦把某个值用作真正的机密,请把它保存在密码管理器或密钥管理服务中,不要放在聊天记录或工单里。