随机 Base64 生成器

使用浏览器内置的安全随机数生成器创建随机 Base64 字符串。可按字节或字符设置长度,一次最多生成 1000 个,并可选择标准或 URL 安全格式。

完全在浏览器中运行,不会上传任何数据。

使用方法

  1. 设置长度,并选择按随机数据的字节数还是按 Base64 字符数计算。生成密钥时建议按字节,32 字节即 256 位密钥。
  2. 设置需要生成的数量,以及各结果之间的分隔符:换行、逗号或空格。
  3. 选择标准或 URL 安全变体。按字节生成时,如果目标系统不需要末尾的等号,还可以关闭填充。
  4. 点击“生成”获取新的随机值,然后点击“全部复制”或“下载”。

字节、字符与熵

随机字符串的强度用熵(以位为单位)来衡量。每个随机字节提供 8 位熵,因此 16 字节是 128 位,32 字节是 256 位。Base64 只是改变了这些字节的书写方式:每个字符承载 6 位,每 3 个字节变成 4 个字符。工具会显示每个字符串的熵,方便你随时核对。

选择字节单位时,输出解码后正好是指定数量的随机字节,这正是密钥和机密所需要的。选择字符单位时,会得到精确数量的字符,每个字符都从 64 个字符的字母表中均匀选取,适合系统要求固定长度、并按文本保存的令牌。

字节数Base64 字符数熵典型用途
121696 位AES-GCM 的 nonce(IV)
1624(不填充时 22)128 位盐值、会话令牌、CSRF 令牌、AES-128 密钥
3244(不填充时 43)256 位AES-256 和 HMAC-SHA256 密钥、HS256 密钥、API 密钥
6488(不填充时 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 字节、选择标准变体并开启填充时,每个结果都是 44 个字符,末尾有一个 =,解码后是 32 个随机字节。当然,每次生成的具体值都不一样。
应该按字节还是按字符设置长度?

如果字符串之后要被解码,例如加密密钥和 Kubernetes Secret,请按字节。如果系统需要固定长度、直接按文本使用的令牌,请按字符。按字符生成的字符串,只有长度是 4 的倍数时才能保证正常解码。

什么时候需要 URL 安全变体?
只要值会放进 URL、查询参数、Cookie 或文件名中就需要。在标准 Base64 中,/ 会分隔 URL 路径,+ 在表单编码的查询字符串里会变成空格。URL 安全的 Base64 改用 - 和 _,通常也不带填充。
生成的值会被保存或上传吗?

不会。所有值都由浏览器中的 JavaScript 生成,不会传输到任何地方,离开页面后即消失。一旦把某个值用作真正的机密,请把它保存在密码管理器或密钥管理服务中,不要放在聊天记录或工单里。