免费 JWT 密钥生成器 — HS256/384/512
为 HS256/384/512 生成强壮、符合 RFC 规范的 JWT 密钥——100% 在浏览器中运行,绝不发往服务器。支持 base64url、base64 或 hex,可复制到 .env。
等效 CLI 命令
什么是 JWT 密钥生成器?
JWT 密钥生成器产生的是 HMAC 签名 JSON Web Token 用来证明自己未被篡改的随机签名密钥。当你用 HS256、HS384 或 HS512 签发令牌时,算法会用一个共享密钥对令牌的头部和载荷运行 HMAC;验证方用同样的密钥重新计算同样的 HMAC,只有当签名相符时才接受令牌。该方案的全部安全性都建立在密钥足够长且不可预测之上——而这正是本工具所创建的:一个高熵随机字符串,在你的浏览器中生成,并为你所选的算法正确定长。
值得精确说明本工具做什么、不做什么。它生成的是密钥本身——也就是你放进 JWT_SECRET 环境变量的那个值——而不是一个完整的令牌。如果你想组装头部和载荷并把它们签成一个真正的 JWT,那是 JWT 编码器 的活儿;要拆解一个现有令牌并验证它的签名,请使用 JWT 解码器。可以把密钥想成钥匙,把编码器想成它操作的那把锁:你生成一次钥匙、安全存放它,再用它反复签发和验证众多令牌。
密钥应该多长?答案由规范固定,而非由偏好决定。RFC 7518 §3.2——JSON Web Algorithms 标准——要求 HMAC 密钥至少与哈希输出同等大小:「必须使用与哈希输出同等大小(例如 HS256 为 256 位)或更大的密钥。」这给出生成器自动遵循的一张清晰表格:
| Algorithm | HMAC | Min bytes | Min bits | hex chars | base64 chars | base64url chars | |-----------|------|-----------|----------|-----------|--------------|-----------------| | HS256 | HMAC-SHA-256 | 32 | 256 | 64 | 44 | 43 | | HS384 | HMAC-SHA-384 | 48 | 384 | 96 | 64 | 64 | | HS512 | HMAC-SHA-512 | 64 | 512 | 128 | 88 | 86 |
这些字符数来自上述字节长度的 RFC 4648 编码:hex 把字节数翻倍;base64 带填充地扩展为原来的 4⁄3;base64url 去掉填充,因此 32 字节的密钥是 43 个 base64url 字符而非 44。base64url 是 JWT 的原生编码——URL 安全字母表、无填充——这正是它在这里作为默认输出的原因;base64url 的密钥可以放在头部、URL 或配置值里而无需任何转义。
随机性是你绝不能妥协的部分。本生成器从 crypto.getRandomValues 取得字节,这是浏览器的密码学安全伪随机数生成器,也是支撑 Web Crypto 密钥生成的同一原语。它从不使用 Math.random——后者虽快却可预测,完全不适合用作签名密钥——可预测的 RNG 意味着可猜测的密钥,而可猜测的密钥意味着可伪造的令牌。由于 HMAC 验证在本地用共享密钥进行,捕获到令牌的攻击者可以无限速地离线爆破弱密钥;hashcat(模式 16500)和 jwt_tool 这类工具正是为干这事而存在。反观一个满熵的 32 字节随机密钥,则在计算上遥不可及。教训很直白:绝不要用密码、字典单词或手敲字符串作为 JWT 密钥——生成一个随机的。
最后,在客户端生成密钥本身就是一项安全属性。签名密钥绝不应被传输给第三方,哪怕是帮你创建它的网站。这里的每个字节都在你的浏览器中产生和编码;任何内容都不会上传、记录或存储。当你准备好交付密钥时,「Copy for .env」按钮会递给你一行 JWT_SECRET=…,如果你需要把它折叠进更大的配置,JSON 转 .env 转换器可以帮忙。生成、复制、存进密钥管理器——时机到来时,再用 kid 头和重叠的有效期窗口来轮换它。
// The secret you generate here goes straight into your signing code.
// Node.js with jsonwebtoken — the JWT_SECRET env var holds the key.
import jwt from 'jsonwebtoken';
const secret = process.env.JWT_SECRET; // e.g. base64url value from this tool
// Sign a token with HS256 (HMAC-SHA-256).
const token = jwt.sign({ sub: 'user-42', role: 'member' }, secret, {
algorithm: 'HS256',
expiresIn: '15m'
});
// Verify it — pin the algorithm to a whitelist; never trust the token's alg.
const payload = jwt.verify(token, secret, { algorithms: ['HS256'] });
// ---------------------------------------------------------------
// Python with PyJWT — same secret, same algorithm pinning.
// import jwt
// token = jwt.encode({"sub": "user-42"}, key, algorithm="HS256")
// payload = jwt.decode(token, key, algorithms=["HS256"]) # whitelist!
// ---------------------------------------------------------------
// Equivalent-strength CLI generation (32 bytes for HS256):
// openssl rand -base64 32
// node -e "console.log(require('crypto').randomBytes(32).toString('base64url'))"
// python -c "import secrets; print(secrets.token_urlsafe(32))" 核心功能
算法感知的密钥长度
选择 HS256、HS384 或 HS512,生成器会自动设定 RFC 7518 §3.2 规定的最小密钥大小——32、48 或 64 字节。你可以请求更长的密钥,但永远不会意外预置一个违反规范、或被严格库拒绝签名的过短密钥。
三种文本安全输出格式
并排获得同样随机字节的 base64url(JWT 原生、URL 安全、无填充编码——默认)、标准 base64 或 hex。base64url 是 JWT_SECRET 最安全的默认;当某个特定加载器或库需要其他格式时再切换。三者的熵完全相同。
密码学安全的随机性
每个密钥都取自 crypto.getRandomValues,即浏览器的 CSPRNG,也是 Web Crypto 密钥生成背后的原语。绝不用 Math.random。这保证了一个没有可预测结构的满熵密钥——正是这一属性让密钥超出离线爆破的能力范围。
一键 Copy for .env
「Copy for .env」会把值包装成惯用的 JWT_SECRET=… 赋值,一行、无引号——无需手敲键名即可粘贴进 .env 文件、Docker secret 或 CI 变量。普通的「Copy」则在你只需要值本身时抓取原始密钥。
等效 CLI 命令
面板会为所选算法打印对应的 openssl rand、Node crypto.randomBytes 和 Python secrets 单行命令,让你能在预置脚本或 Dockerfile 中复现等强度密钥。多数同类工具省略了这一点;这里它是内置的。
显示 / 隐藏遮罩
密钥默认被遮罩,因此在演示、教程或屏幕共享时它都不显示在屏幕上。只在你准备好复制时用眼睛图标显示它。无论显示还是隐藏,复制操作始终把真实密钥放到剪贴板上。
100% 私密、仅在浏览器中运行
密钥完全在你的设备上生成、编码和展示。没有网络请求、没有日志、没有存储——可在开发者工具 → 网络中验证。签名密钥绝不应抵达第三方,而在这里它永远不会,这正是在客户端生成它的全部原因。
支持 15 种语言
完整的界面——标签、说明和指引——已本地化为 15 种语言,因此无论你的团队身在何处,工具都能使用、安全建议都清晰可懂。
实战示例
以 base64url(默认)生成 HS256 密钥
Algorithm: HS256 · Format: base64url
3sJ9aFq2kP7mWcZ1xL0nVtRbYdGhU8eAoI4QpNlKj0
HS256 使用 HMAC-SHA-256 签名,因此 RFC 7518 §3.2 要求密钥至少 32 字节(256 位)。生成器通过 crypto.getRandomValues 取得 32 个密码学安全的随机字节,并编码为 base64url——也就是 JWT 自身使用的无填充、URL 安全字母表。32 字节会变成 43 个字符的 base64url 字符串。直接把这个值放进 JWT_SECRET 即可。每次点击都会重新生成全新密钥,绝不会两次相同。
生成 HS512 密钥(64 字节 / 512 位)
Algorithm: HS512 · Format: base64url
k2Lp9XqA0mNbVcZ7rT4wYsHfGjUe8RoIdPlNkBvM3xQ1aWtCyZuS6FhEgJ (86 chars)
HS512 使用 HMAC-SHA-512,其哈希输出为 64 字节,因此 RFC 7518 §3.2 要求密钥至少 64 字节(512 位)。工具会识别算法并自动提高字节数——你无需记住这个最小值。64 个随机字节编码为 86 个字符的 base64url 字符串、88 个字符的标准 base64,或 128 个 hex 字符。在这里选用更长的算法,就是一键预置更高熵密钥的方式。
把密钥复制为一行 .env
Click "Copy for .env"
JWT_SECRET=3sJ9aFq2kP7mWcZ1xL0nVtRbYdGhU8eAoI4QpNlKj0
「Copy for .env」会把生成的值包装成惯用的 JWT_SECRET=… 赋值形式,让你无需手敲键名即可直接粘贴进 .env 文件、Docker secret 或 CI 变量。该值占一行、无两侧引号——正是 dotenv 风格加载器所期望的格式。需要把变量嵌入更大的配置?可搭配下方链接的 JSON 转 .env 转换器使用。
用命令行复现密钥(等强度)
Show the CLI command
openssl rand -base64 32
CLI 面板会按所选算法打印 openssl、Node 和 Python 命令,它们取得相同数量的安全随机字节——HS256 用 openssl rand -base64 32,HS384 用 …48,HS512 用 …64。输出是等强度的密钥,但并非逐字节相同的字符串:openssl 输出带填充的标准 base64,而本工具默认 base64url,因此字母表和末尾字符不同。选用最适合你预置脚本的那一种即可,熵是一样的。
显示与隐藏密钥
Toggle the eye icon
••••••••••••••••••••••••••••••••••••••••••• ↔ 3sJ9aFq2kP7m…
密钥默认被遮罩,因此在演示或屏幕共享时不会被偷窥,也不会被录屏捕获。准备好复制时点击眼睛图标显示它,之后再次隐藏。无论值是显示还是遮罩,「Copy」和「Copy for .env」都照常工作——落到剪贴板上的始终是真实密钥,绝不是那些圆点。
如何使用 JWT 密钥生成器
- 1
选择签名算法
选择 HS256、HS384 或 HS512。生成器会立即为该 HMAC 变体应用 RFC 7518 §3.2 规定的最小密钥长度——32、48 或 64 字节——因此你无需查找这个数字,也不会冒密钥过短的风险。
- 2
选择输出格式
base64url 是默认值——JWT 原生的 URL 安全、无填充编码。若加载器需要,切换到标准 base64;当系统只接受 0–f 字符时则用 hex。三者编码的是同样的随机字节,熵完全相同。
- 3
显示并复制密钥
密钥默认被遮罩,以在演示或屏幕共享时不显示在屏幕上。点击眼睛图标显示它,然后用「Copy」获取原始值,或用「Copy for .env」复制一行可用于 .env 文件或 CI 变量的 JWT_SECRET=… 。
- 4
按需重新生成
点击「重新生成」获得一个取自 crypto.getRandomValues 的全新、独立密钥。每个环境生成一个——绝不要在开发、预发布和生产之间重用同一个签名密钥。
- 5
使用 CLI 等效命令或继续签名
CLI 面板会显示用于脚本化预置的对应 openssl、Node 和 Python 单行命令。拿到密钥后,用 JWT 编码器签发令牌,再用 JWT 解码器确认签名。
常见的 JWT 密钥错误
用密码或短语作为密钥
人为选定的字符串作为签名密钥熵太低,可以通过字典或爆破攻击离线还原,随后任意令牌都能被伪造。请改为生成一个满熵的随机密钥。
JWT_SECRET=mySuperSecret123 → low entropy, brute-forceable
JWT_SECRET=3sJ9aFq2kP7mWcZ1xL0nVtRbYdGhU8eAoI4QpNlKj0 → 32 random bytes
密钥短于算法所要求
RFC 7518 §3.2 要求 HMAC 密钥至少与哈希输出同等长。给 HS256 用 16 字节的密钥低于 32 字节的下限——它削弱签名,有些库会直接拒绝。
16-byte key with HS256 → below the 32-byte minimum
32-byte key with HS256 → meets RFC 7518 §3.2
用 Math.random 生成密钥
Math.random 不是密码学安全的——它的输出可预测,因此用它构建的密钥是可猜测的,它所签发的令牌也是可伪造的。签名密钥必须来自像 crypto.getRandomValues 这样的 CSPRNG。
Math.random()-based key → predictable, unsafe
crypto.getRandomValues key → full entropy
签名前重新编码密钥
存储并喂入工具产出的确切字符串。在一个服务里把它 Base64 解码成字节、在另一个服务里却当作字面字符串,会让两侧得到不同的密钥,每次签名校验都会失败。
Service A: raw string · Service B: base64-decoded → signatures never match
Both services use the identical stored string → signatures verify
在所有环境间重用同一密钥
一个 JWT_SECRET 被开发、预发布和生产共用,意味着任何一处泄露都能在各处伪造令牌,而轮换也变成要么全换、要么不换。请为每个环境预置一个不同的密钥。
Same JWT_SECRET in dev, staging, prod → one leak breaks all
A unique secret per environment → blast radius contained
验证时信任令牌的 alg
让验证方接受令牌所声明的任意算法,会引发 alg:none 和 HS/RS 混淆伪造。无论密钥多强,都要传入显式的算法白名单。
jwt.verify(token, secret) → accepts the token's alg
jwt.verify(token, secret, { algorithms: ['HS256'] }) → pinned 谁在使用本工具
- 为新服务预置 JWT_SECRET
- 正在搭建一个签发 HMAC 签名令牌的 API?选择你的库所用的算法,把密钥复制成一行 JWT_SECRET=…,再放进服务的环境。为开发、预发布和生产分别生成不同的密钥——绝不要在多个环境间共用同一个密钥。
- 轮换已泄露或老化的密钥
- 当怀疑密钥泄露或它单纯到了该轮换的时候,在这里生成一个新密钥,给它分配一个新的 kid,并用重叠窗口推出它,让现有令牌在过期前仍能通过验证。在确认泄露时,立即轮换并把旧密钥从接受集合中移除。
- 替换弱密钥或手敲密钥
- 接手了一个 JWT_SECRET 是短语或抄来的示例值的代码库?那个密钥可被离线爆破。生成一个满熵的 32 字节替代品,在轮换窗口后换上它,在被利用之前堵住令牌伪造漏洞。
- 在流水线中脚本化生成密钥
- 需要在 CI 或 Dockerfile 中创建密钥而非手动生成?使用 CLI 面板的 openssl、Node 或 Python 单行命令在你的预置脚本中铸造一个等强度密钥,并用本页面理解每条命令产生的字节长度和编码。
- 安全地讲解 JWT 签名
- 带一个团队走一遍 HS256 的原理,而绝不暴露真实的生产密钥——在屏幕上生成一个一次性密钥(显示前一直遮罩),用 JWT 编码器签发一个示例令牌,再用 JWT 解码器验证它,让整个签名-验证流程一目了然。
- 比较 HS256、HS384 和 HS512 的密钥大小
- 在拿不准该把哪个 HMAC 变体定为标准时?在各算法间切换,看看所需密钥长度和编码后字符串如何增长——43、64 和 86 个 base64url 字符——并在写进配置前挑选适合你系统的强度与令牌大小折中。
- 为本地开发生成密钥
- 需要一个快速、有效的密钥来跑起本地认证流程?一键生成、复制到 .env,你就不再被卡住了——而且用的是真正的 CSPRNG 密钥,而不是一个你会忘记在部署前替换掉的占位符。
生成器的工作原理
- crypto.getRandomValues(CSPRNG)
- 密钥通过用 crypto.getRandomValues 填充一个 Uint8Array 生成,它是 Web Crypto 的密码学安全伪随机数生成器,与支撑 Web Crypto 密钥生成的熵源相同。任何地方都绝不使用 Math.random——它在统计上可预测,不适合任何密码学密钥。
- RFC 7518 §3.2 密钥定长
- 每个算法的字节数遵循 JSON Web Algorithms 的要求,即 HMAC 密钥至少与哈希输出同等大小:HS256(SHA-256)32 字节,HS384(SHA-384)48 字节,HS512(SHA-512)64 字节。选择算法即设定最小值;生成器不会输出低于规范下限的密钥。
- RFC 4648 编码(base64url / base64 / hex)
- 原始字节用 RFC 4648 字母表编码。base64url 使用无填充的 URL 安全字母表(32 字节 → 43 字符),标准 base64 使用 +、/ 和 = 填充(→ 44 字符),hex 每字节写两个字符(→ 64 字符)。切换格式会重新编码同样的字节——底层熵保持不变。
- 为何 base64url 是默认
- JWT 各组成部分本身就是 base64url 编码的,而 URL 安全、无填充的字母表意味着 base64url 的密钥在头部、URL 或配置文件中从不需要转义。标准 base64 的 + 和 / 以及末尾的 = 在这些上下文中可能出错,因此 base64url 是 JWT_SECRET 稳妥的默认选择。
- Copy-for-.env 格式
- 「Copy for .env」会输出单行、无两侧引号的 JWT_SECRET=
——正是 dotenv 风格加载器无需改动即可解析的形态。原始密钥绝不会包含在 .env 文件中需要加引号的字符,因此该行可原样粘贴。 - 等强度 CLI 命令,并非逐字节相同
- CLI 面板的 openssl rand -base64 N、Node randomBytes(N).toString('base64url') 和 Python secrets.token_urlsafe(N) 命令都会为所选算法取得 N 个安全随机字节。它们产生等强度的密钥,而非相同的字符串——openssl 输出带填充的标准 base64,因此其字母表和末尾字符与本工具默认的 base64url 不同。
JWT 密钥最佳实践
- 让密钥长度匹配算法
- 按 RFC 7518 §3.2 的要求,HS256 至少用 32 字节、HS384 用 48、HS512 用 64。本生成器会替你处理,但如果你手动定长,绝不要低于哈希输出长度——过短的 HMAC 密钥既削弱签名,也可能被严格的库拒绝。
- 始终用 CSPRNG 生成,绝不用密码
- JWT 密钥是无人需要记忆的机器凭证,所以把熵用满:使用密码学安全的随机密钥,而非口令、字典单词或手敲字符串。人为选定的密钥是 JWT 破解工具所自动化的离线爆破攻击最容易得手的目标。
- 每个环境用唯一密钥
- 开发、预发布和生产应各有自己的 JWT_SECRET。共用一个密钥意味着低风险环境中的泄露能在各处伪造令牌,也让轮换变成要么全换、要么不换。请在这里为每个环境生成单独的密钥,并把每个存进各自的密钥管理器作用域。
- 验证时锁定算法
- 在验证一侧,始终传入显式的算法白名单——jsonwebtoken 中是 algorithms: ['HS256'],PyJWT 中是 algorithms=["HS256"]——并绝不信任令牌内部的 alg 字段。接受令牌自我声明的算法会引发经典的算法混淆和 alg:none 伪造攻击,无论你的密钥多强。
- 用 kid 头和重叠密钥轮换
- 给已签发的令牌打上密钥标识符(kid),并通过 JWKS 端点发布活跃密钥,这样你就能无停机地轮换:用新密钥签发新令牌,同时仍接受旧密钥直到它的令牌过期。在怀疑泄露时,跳过重叠,立即吊销旧密钥。
常见问题
我生成的 JWT 密钥会被发送到你们的服务器吗?
如何生成一个安全的 JWT 密钥?
HS256 的 JWT 密钥应该多长?
base64url、base64 和 hex 有什么区别,我该选哪个?
弱 JWT 密钥会被破解吗?
我可以用密码作为 JWT 密钥吗?
如何在不破坏现有有效令牌的前提下轮换 JWT 密钥?
HMAC(HS*)密钥与 RSA 或 ECDSA(RS*/ES*)密钥有何不同?
相关工具
查看所有工具 →Bcrypt 哈希生成器与验证器
安全工具
在线生成并验证 bcrypt 密码哈希——可调成本因子,支持 $2b$/$2a$/$2y$ 前缀。100% 在浏览器中运行,密码绝不上传。
JWT 解码器 · 在线解码工具
安全工具
免费 JWT 解码器,在线即时解码 JWT 令牌。查看头部、载荷、签名以及过期时间、算法和声明详情。100% 浏览器本地运行——令牌绝不离开你的设备。无需注册、无跟踪。
JWT 编码器与生成器
安全工具
免费在线 JWT 生成器与编码器。构建头部和载荷,使用 HS256、RS256 或 ES256 即时签名。100% 浏览器本地运行——你的密钥和私钥绝不离开设备。
在线 MD5 哈希生成器与文件校验工具
安全工具
在线生成 MD5、SHA-256、SHA-1、SHA-512 哈希值 — 完全免费,浏览器本地运算,无需注册。支持文本和文件哈希、校验和验证、哈希值对比,一键复制,数据绝不离开你的设备。
随机密码生成器 — 自定义长度、强度与安全性
安全工具
免费在线随机密码生成器,一键生成高强度安全密码。支持自定义长度、字符类型,批量生成多个密码。所有密码仅在浏览器本地生成,不上传不存储。
SHA-1 哈希生成器(160 位遗留算法)
安全工具
在浏览器中生成 SHA-1 哈希值 — 40 字符十六进制输出,无需上传。适用于 Git 指纹查询、旧证书核验和迁移审计的遗留工具。数据绝不离开你的设备。