JWT 编码器与生成器
免费在线 JWT 生成器与编码器。构建头部和载荷,使用 HS256、RS256 或 ES256 即时签名。100% 浏览器本地运行——你的密钥和私钥绝不离开设备。
什么是 JWT 编码器?
JWT 编码器从头部和一组声明的载荷构建并加密签名出一个 JSON Web Token。JWT 由 RFC 7519 定义,是三段由点连接的 Base64URL 编码内容:header.payload.signature。头部指明签名算法;载荷承载声明(令牌关于谁、能做什么、何时过期);签名则是在头部和载荷上用密钥或私钥计算出的加密凭证,让接收方能检测篡改。
「JSON Web Token(JWT)是一种紧凑的声明表示格式,适用于 HTTP Authorization 头和 URI 查询参数等空间受限的环境。」——RFC 7519 第 1 节
编码是解码的逆操作。JWT 解码器读取已有令牌的声明;而编码器接受你提供的声明,产生一个全新的签名令牌。签名这一步正是真正的 JWT 与任意 Base64 的区别所在——没有有效的签名,任何验证方都不会接受该令牌。本工具通过浏览器原生的 Web Crypto API,在 HMAC(HS)、RSA(RS、PS)和 ECDSA(ES)各系列上完成签名,因此整个操作都在你的设备上进行,零依赖、零网络调用。
开发者会频繁用到 JWT 编码器:签发一个令牌来访问受保护的 API 端点、重现 OAuth 服务器签发的确切声明结构以便调试 Bug、为集成测试构建测试数据,或者给队友一个可直接用于 curl 命令的 Bearer 令牌。由于载荷是编码而非加密,JWT 可以安全地通过网络传输,但绝不能携带秘密——任何持有令牌的人都能读取每一项声明,只有签名能阻止他们篡改其中之一。
JWT 相关工作天然与其他开发工具配合。签名后,解码令牌以确认其声明,在 Unix 时间和人类日期之间转换 exp 和 iat,或者在需要 HS256 的 HMAC 所基于的底层哈希函数时计算一个 SHA-256 哈希。由于每个 JWT 段都是 Base64URL 编码的,手动检查令牌时 Base64 工具会很方便;想深入了解这种编码,请阅读我们的 Base64 基础指南。
// Sign a JWT in the browser with the Web Crypto API (HS256)
async function encodeJwt(payload, secret) {
const b64url = (bytes) =>
btoa(String.fromCharCode(...new Uint8Array(bytes)))
.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
const enc = (obj) =>
b64url(new TextEncoder().encode(JSON.stringify(obj)));
const header = { alg: 'HS256', typ: 'JWT' };
const signingInput = `${enc(header)}.${enc(payload)}`;
const key = await crypto.subtle.importKey(
'raw', new TextEncoder().encode(secret),
{ name: 'HMAC', hash: 'SHA-256' }, false, ['sign']);
const sig = await crypto.subtle.sign(
'HMAC', key, new TextEncoder().encode(signingInput));
return `${signingInput}.${b64url(sig)}`;
}
const token = await encodeJwt({ sub: 'user_123', exp: 1999999999 }, 'my-secret');
// → eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c2VyXzEyMyIsImV4cCI6MTk5OTk5OTk5OX0.... 核心功能
即时生成并签名 JWT
编辑载荷,实时看到签名令牌更新——头部、载荷和签名即时计算。没有「生成」按钮,也没有发往服务器的往返。
全算法覆盖
支持 HS256/384/512、RS256/384/512、PS256/384/512 和 ES256/384/512 签名——涵盖所有常见 JWS 系列,全部通过浏览器原生的 Web Crypto API。
密钥绝不离开设备
你的密钥和 PKCS8 私钥完全在浏览器中使用。任何内容都不会被上传、记录或存储——可安全用于开发和事故响应。
快捷声明助手
一键插入 iss、sub、aud、iat、nbf 或一小时后的 exp——无需手动填写 Unix 时间戳,也不会出现语法错误。
颜色标注的输出
签名令牌按头部、载荷和签名分段,以不同颜色标注,结构一目了然,方便复制。
零依赖
仅基于浏览器的 Web Crypto API 和 JSON 构建——无外部库、无埋点、无任何网络调用。
示例
HS256 会话令牌
{
"sub": "user_123",
"name": "Alice",
"role": "admin",
"iat": 1715000000,
"exp": 1999999999
}
secret: a-string-secret-at-least-256-bits-long eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c2VyXzEyMyIsIm5hbWUiOiJBbGljZSIsInJvbGUiOiJhZG1pbiIsImlhdCI6MTcxNTAwMDAwMCwiZXhwIjoxOTk5OTk5OTk5fQ.<HMAC-SHA256 signature>
使用共享密钥签名的 HMAC-SHA256 令牌——无状态会话认证最常见的方案。任何持有相同密钥的一方都能验证它。
RS256 访问令牌
{
"iss": "https://auth.example.com",
"aud": "api.example.com",
"sub": "90087165",
"scope": "read:user write:post",
"iat": 1715000000,
"exp": 1999999999
}
private key: -----BEGIN PRIVATE KEY----- (PKCS8) eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJodHRwczovL2F1dGguZXhhbXBsZS5jb20iLCJhdWQiOiJhcGkuZXhhbXBsZS5jb20iLCJzdWIiOiI5MDA4NzE2NSIsInNjb3BlIjoicmVhZDp1c2VyIHdyaXRlOnBvc3QiLCJpYXQiOjE3MTUwMDAwMDAsImV4cCI6MTk5OTk5OTk5OX0.<RSA signature>
RSA 签名的 OAuth 风格访问令牌。令牌用你的私钥签名,任何持有对应公钥的一方都能验证——当验证方不应具备签发令牌的能力时,这是理想的选择。
ES256 紧凑令牌
{
"sub": "device-42",
"iat": 1715000000,
"exp": 1999999999
}
private key: -----BEGIN PRIVATE KEY----- (P-256) eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJkZXZpY2UtNDIiLCJpYXQiOjE3MTUwMDAwMDAsImV4cCI6MTk5OTk5OTk5OX0.<ECDSA P-256 signature>
基于 P-256 曲线的 ECDSA 令牌。ES256 签名远短于 RSA,却提供同等安全性,从而让令牌在资源受限的环境中保持小巧。
使用方法
- 1
编辑载荷声明
在载荷编辑器中以 JSON 形式写出令牌所需的声明。使用快捷声明标签插入 iss、sub、aud、iat、nbf 或一小时后的 exp,无需手动输入时间戳。
- 2
选择算法并输入密钥
选择一种签名算法。HS256/384/512 输入密钥;RS、PS 或 ES 算法粘贴 PKCS8 PEM 私钥。令牌会在你输入时本地签名。
- 3
复制签名后的 JWT
签名后的令牌即时出现,按段以颜色标注。点击「复制」即可把它放入 Authorization 头、curl 命令或测试中。你的密钥从未离开浏览器。
Common Errors
使用弱 HMAC 密钥
HS256 的安全性完全取决于密钥的熵。短或易猜的密钥会让攻击者暴力破解并伪造令牌。请使用至少 256 位的随机性。
secret: "password123" // guessable, low entropy
secret: base64(crypto.randomBytes(32)) // >=256 random bits
遗漏 exp 声明
没有 exp 的令牌永不过期。一旦泄露,就没有自然的吊销节点。请始终根据令牌类型设置合适的过期时间。
{ "sub": "user_123", "role": "admin" } // no exp { "sub": "user_123", "role": "admin", "exp": 1715003600 } 粘贴 PKCS1 密钥而非 PKCS8
Web Crypto API 只导入 PKCS8 私钥。传统的 RSA PKCS1 密钥会导入失败——请先转换。
-----BEGIN RSA PRIVATE KEY----- // PKCS1, not supported
openssl pkcs8 -topk8 -nocrypt -in pkcs1.pem -out pkcs8.pem
常见使用场景
- 为 API 测试生成令牌
- 数秒内生成一个 HS256 Bearer 令牌,从 curl、Postman 或集成测试访问受保护端点。
- 重现 OAuth 与 OIDC 令牌
- 构建一个与你的授权服务器签发内容一致的 RS256 或 ES256 令牌,以便调试声明和受众不匹配的问题。
- 创建测试数据
- 无需搭建完整的认证服务器,即可为单元测试和集成测试产生确定性的签名令牌。
- 调试授权失败
- 重建客户的令牌结构——签发者、受众、作用域、过期时间——以查明后端为何拒绝它。
- 验证一个验证方
- 用已知密钥签名令牌,确认你的验证中间件接受有效令牌并拒绝被篡改的令牌。
- 原型化认证流程
- 在搭建新的登录、微服务或服务间调用时,给队友提供可直接使用的令牌。
技术细节
- 符合 RFC 7519 / 7515 / 7518
- 产生符合 RFC 7519(JWT)、RFC 7515(JWS)和 RFC 7518(JWA)的 JWS 令牌,头部带有注册的算法标识符。
- 浏览器原生 Web Crypto 签名
- 通过 crypto.subtle 为 HMAC、RSASSA-PKCS1-v1_5、RSA-PSS 和 ECDSA 签名。ECDSA 签名以原始 r||s 形式输出,完全符合 JWS 的要求。
- Base64URL、零依赖
- 头部和载荷使用 URL 安全字母表(RFC 4648)进行 Base64URL 编码,无填充。无外部库、无网络调用、无埋点。
最佳实践
- 始终设置过期时间
- 加入 exp 声明,让泄露的令牌会失效。较短的有效期能缩小爆炸半径——访问令牌用分钟级,而非天级。
- 不要把秘密放进载荷
- JWT 载荷对任何持有令牌的人都可读。可以放标识符和作用域;切勿放密码、API 密钥或完整的 PII。
- 生产环境在服务端签名
- 本工具用于测试和调试。在真实系统中,应在服务端用维护良好的库和来自密钥管理器的密钥签名令牌。
常见问题
如何在线生成 JWT?
什么是 JWT 生成器?
header.payload.signature 字符串。它是 JWT 解码器的逆操作:解码器读取已有令牌,而生成器创建一个用你的密钥(HS256)或私钥(RS256/ES256)签名的新令牌。本生成器完全在你的浏览器中运行,因此令牌即时产生,你的签名密钥绝不离开设备。 这个 JWT 生成器免费且使用安全吗?
在这里输入我的密钥或私钥安全吗?
HS256 和 RS256 有什么区别?
这个 JWT 编码器支持哪些算法?
如何设置 exp(过期)声明?
exp 声明,以秒为单位的 Unix 时间戳表示——例如 "exp": 1999999999。最快的方式是载荷下方的 exp +1h 快捷标签,它会插入一个从现在起一小时后的过期时间。你也可以用同样的方式添加 iat(签发时间)和 nbf(生效时间)。请记住 exp 的单位是秒而非毫秒,而且验证方会用它们各自的时钟进行比较,因此要保持服务器时间同步,避免过早被拒。要把人类日期转换为 Unix 时间戳,请使用我们的 Unix 时间戳转换器。 如何为 RS256 或 ES256 获取 PKCS8 PEM 私钥?
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out private.pem。ECDSA P-256:openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 -out ec-private.pem。这两条命令都会输出一个以 -----BEGIN PRIVATE KEY----- 开头的 PKCS8 PEM 块,正是本工具所需的格式。粘贴整个块,包括头部和尾部行。对应的公钥——用于验证令牌——可以用 openssl pkey -in private.pem -pubout 导出。 如何验证我刚生成的令牌?
jwt.verify(token, secretOrPublicKey, { algorithms: ['HS256'] }),Python 中用 PyJWT.decode(token, key, algorithms=['RS256']),Go 中用 jwt.Parse(token, keyFunc)。生产环境中绝不要用空的算法列表验证,也不要使用 verify_signature=False——始终固定你期望的确切算法。 载荷里应该放什么?
iss(签发者)、sub(主题——通常是用户 ID)、aud(受众)、exp(过期时间)、nbf(生效时间)、iat(签发时间)和 jti(令牌 ID)。除此之外,你还可以添加 role、scope 或 email 等应用声明。不要在载荷中放入秘密——JWT 是编码而非加密,因此任何持有令牌的人都能读取每一项声明。把令牌控制在约 4 KB 以内,使其能放入 Authorization 头和 Cookie。 JWT 是加密的吗?
为什么我的 RS256 或 ES256 签名失败了?
openssl pkcs8 -topk8 -nocrypt -in old.pem -out pkcs8.pem 转换传统的 -----BEGIN RSA PRIVATE KEY-----(PKCS1)密钥;(2)曲线与算法不匹配——ES256 需要 P-256 密钥,ES384 需要 P-384,ES512 需要 P-521;(3)你粘贴的是公钥或证书,而不是私钥;或者(4)密钥用口令加密,而 Web Crypto API 无法直接导入。请先用 openssl pkey 解密,再粘贴未加密的 PKCS8 块。 这个工具支持 alg:none 未签名令牌吗?
alg:none 令牌没有签名,意味着任何人都能伪造——它是经典 JWT 认证绕过漏洞的根源。由于编码器的全部意义在于产生一个已签名的令牌,本工具只提供真实的签名算法。如果你出于安全研究在研究 alg:none,可以手动构造:对头部和载荷做 Base64URL 编码,并把签名段留空——令牌仍以一个末尾的点结尾(header.payload.)——但你绝不应在生产环境接受这样的令牌。 我能改用代码生成 JWT 吗?
jsonwebtoken.sign(payload, secret, { algorithm: 'HS256', expiresIn: '1h' })。在 Python 中:用 PyJWT 的 jwt.encode(payload, key, algorithm='RS256')。在 Go 中:jwt.NewWithClaims(jwt.SigningMethodES256, claims).SignedString(privateKey)。本工具是为快速测试、curl 请求或测试数据产生令牌的最快方式——但在应用代码中,你应当用维护良好的库在服务端生成令牌,密钥从你的密钥管理器加载,切勿硬编码。 相关工具
查看所有工具 →JWT 解码器 · 在线解码工具
安全工具
免费 JWT 解码器,在线即时解码 JWT 令牌。查看头部、载荷、签名以及过期时间、算法和声明详情。100% 浏览器本地运行——令牌绝不离开你的设备。无需注册、无跟踪。
在线 MD5 哈希生成器与文件校验工具
安全工具
在线生成 MD5、SHA-256、SHA-1、SHA-512 哈希值 — 完全免费,浏览器本地运算,无需注册。支持文本和文件哈希、校验和验证、哈希值对比,一键复制,数据绝不离开你的设备。
随机密码生成器 — 自定义长度、强度与安全性
安全工具
免费在线随机密码生成器,一键生成高强度安全密码。支持自定义长度、字符类型,批量生成多个密码。所有密码仅在浏览器本地生成,不上传不存储。
SHA-1 哈希生成器(160 位遗留算法)
安全工具
在浏览器中生成 SHA-1 哈希值 — 40 字符十六进制输出,无需上传。适用于 Git 指纹查询、旧证书核验和迁移审计的遗留工具。数据绝不离开你的设备。
SHA-256 哈希生成器与校验和工具
安全工具
免费在线生成 SHA-256 哈希值。在浏览器中对文本或文件进行哈希、验证校验和,复制 64 字符十六进制输出。无需注册,数据不离开页面。
SHA-3 哈希生成器(Keccak SHA3-256)
安全工具
免费在线生成 SHA-3 哈希值。NIST FIPS 202 海绵构造——SHA-2 后的新一代标准。SHA3-256 输出 64 个十六进制字符。纯浏览器运行,通过懒加载 js-sha3 实现,零上传。