如何生成密钥
- 点击与你要配置的内容相符的预设。页面打开时默认选中 32 字节。
- 从 随机值 中复制密钥。带配置行的预设,例如 Laravel 或 Auth.js,还会在 可直接粘贴 下显示完整的一行。
- 点击 重新生成 获取另一个密钥,或者调大 数量 一次生成多个,例如每个环境一个。
预设会替你设置字节数和格式。修改其中任意一项,工具就会切换回 自定义,并保留你填写的值。
各预设及密钥的用途
| 预设 | 生成内容 | 长度 | 常见用途 |
|---|---|---|---|
| 16 / 32 / 64 字节 | Base64 编码的随机字节 | 24 / 44 / 88 | 通用密钥、盐值、secret |
| Laravel APP_KEY | base64: + 32 字节 | 51 | .env 中的 APP_KEY |
| AES-128 密钥 | 16 字节,Base64 | 24 | AES-128-GCM 或 -CBC |
| AES-256 密钥 | 32 字节,Base64 | 44 | AES-256-GCM 或 -CBC |
| HMAC 密钥 | 32 字节,Base64 | 44 | HMAC-SHA256 签名、webhook |
| JWT HS256 密钥 | 32 字节,Base64URL | 43 | HS256 令牌的 JWT_SECRET |
| Auth.js 密钥 | 32 字节,Base64 | 44 | AUTH_SECRET(原 NEXTAUTH_SECRET) |
| Django SECRET_KEY | 取自 Django 字母表的 50 个字符 | 50 | settings 中的 SECRET_KEY |
| Rails secret_key_base | 64 字节,hex | 128 | secret_key_base |
| API 令牌 | 32 字节,Base64URL | 43 | Bearer 令牌、邀请链接 |
| UUID v4(Base64URL) | 短格式的随机 UUID | 22 | 紧凑的 ID;同时也会显示标准格式的 UUID |
CSP nonce 预设用于另一类场景,它有单独的页面:CSP nonce 生成器。
各个长度取决于对应的算法。AES 密钥必须恰好是 16、24 或 32 字节,其他长度都会被拒绝。RFC 7518 要求 HS256 密钥至少 256 位,所以 JWT 预设使用 32 字节。HMAC 密钥短于哈希输出会削弱 HMAC,所以 32 字节适合 HMAC-SHA256,64 字节预设适合 HMAC-SHA512。Django 预设用拒绝采样抽取 50 个字符,字母表中每个字符出现的概率相同,这与 Django 自带的 get_random_secret_key() 行为一致。
Base64 密钥是文本,真正的密钥是字节
你复制的值是随机字节的 Base64 表示。使用它的代码必须先解码:
import base64, os
key = base64.b64decode(os.environ["AES_KEY"])
assert len(key) == 32
在 Node.js 中对应的写法是 Buffer.from(process.env.AES_KEY, "base64")。如果把 44 个字符的字符串直接交给 AES 库,它要么拒绝(Python 中报 AESGCM key must be 128, 192, or 256 bits,Node.js 中报 Invalid key length),要么在宽松的库里不声不响地用了错误的字节。自己读取密钥的框架,例如带 base64: 前缀的 Laravel,会替你完成解码。
Base64URL 和标准 Base64 解码后是相同的字节,但解析器对接受哪一种往往很严格。除非你确定使用方也接受另一种,否则请保持预设生成的格式。
Fernet 密钥及其他格式
Python 的 cryptography 包要求 Fernet 密钥是 32 字节、带填充的 URL 安全 Base64,共 44 个字符。JWT 和 API 令牌预设生成的是不带 = 的 URL 安全形式,所以要在末尾补一个,或者直接在 Python 中生成:
from cryptography.fernet import Fernet
print(Fernet.generate_key().decode())
其他情况请从字节数入手:选择 自定义,填入你所用库文档中要求的字节数,再选择 Base64、Base64URL 或 hex。随机 Base64 生成器 讲解了输出长度;用 HMAC Base64 或 AES 加密 可以马上试用新生成的密钥。
生成之后如何保管密钥
在这里生成的密钥在你复制之前只存在于当前标签页中。复制之后,它的安全程度就取决于你把它粘贴到哪里。生产环境的密钥请存放在平台的密钥存储或密钥管理服务中,每个环境使用不同的密钥,并且绝不要提交到仓库;进入过 Git 仓库的密钥应视为已公开,必须更换。轮换加密密钥意味着要重新加密旧数据,或者保留旧密钥用于解密,所以在线上系统中更换 APP_KEY 之前要先规划好。
常见问题
怎么生成一个 32 字节的 Base64 密钥?
页面打开时默认选中 32 字节 预设,所以输出中的密钥就是:44 个字符,以 = 结尾。在终端里,openssl rand -base64 32 效果相同。
44 个字符的 Base64 字符串能直接当 AES-256 密钥用吗?
不能。AES-256 需要 32 个原始字节,而这 44 个字符是它们的 Base64 文本。请先解码字符串;直接传入文本会报错,例如 Node.js 中的 “Invalid key length”。
不用 artisan,怎么生成 Laravel APP_KEY?
选择 Laravel APP_KEY 预设,把 APP_KEY=base64:… 这一行复制到 .env。它与 php artisan key:generate 写入的格式相同:base64: 前缀加上 32 个随机字节,用于默认的 AES-256-CBC 加密。
怎么在这里生成 Fernet 密钥?
没有 Fernet 预设。选择 32 字节,把 格式 设为 Base64URL,再在 43 个字符后面补一个 =,因为 Fernet 要求 44 个字符、带填充的 URL 安全 Base64。也可以在 Python 中运行 Fernet.generate_key()。
在浏览器里生成生产环境的密钥安全吗?
密钥来自密码学安全的随机数生成器 crypto.getRandomValues,页面也无法把它发送到任何地方。更大的风险在于之后怎么处理:把密钥放进密钥管理服务或受保护的环境变量,绝不要提交到代码仓库。