使用方法
JWT编码分编码与解码两段,都只在你本地运行:
- 在「头部 Header」填 JSON,示例为
{"alg":"HS256","typ":"JWT"};在「载荷 Payload」填 JSON,示例含 sub、name、iat 三个字段。 - 选算法并填签名密钥;点「生成令牌」,或在头部/载荷框按 Ctrl / Cmd + Enter 即可生成。
- 把得到的令牌粘到「待解析的 JWT」里,点「解析令牌」查看解码后的声明,并自动用密钥校验签名。
- 文本输入较多,所以输入框用 Ctrl / Cmd + Enter 触发,而不是单按 Enter,避免打断换行。
JWT编码能解决什么问题
调试接口鉴权时,经常要手写或拆解一段 JWT。这个 JWT 编码工具覆盖四类真实需求:
- 快速造令牌:联调时把任意 JSON 载荷包成合法 JWT,省得临时写脚本。
- 看清里面是什么:拿到一段看不懂的 JWT,解码后直接看到 header 与 payload 的声明。
- 校验签名:用同样的密钥与算法重算签名,判断令牌有没有被改过。
- 离线安全:密钥和载荷都在本地处理,不上传服务器,适合含敏感声明的接口数据。
本页不做的事情:它不连接任何认证服务、不发请求,也不能替你签发真实账号的令牌;仅用于本地构造与查看。
原理和变量
六个技术内核问题,答案只对本页成立:
- 用到的算法:编码用 Base64URL 编码(不是普通 Base64),签名用
HMAC-SHA256/384/512,分别由 Web Crypto 的crypto.subtle.sign配合importKey完成;none 算法则直接输出空签名段。 - 参数取值原因:头部固定带
alg与typ:"JWT",因为 RFC 7519 规定 JWT 必须声明 alg,typ 帮助接收方识别类型;算法下拉只给 HS 家族与 none,因为对称签名是调试最常见、也最不需要证书的一类。 - 遵循的标准:结构遵循 RFC 7519(JWT)、签名遵循 RFC 7515(JWS);Base64URL 是 RFC 4648 第 5 节的 URL 安全变体,把
+/换成-_并去掉填充=。 - 输入怎样变成输出:先
base64url(header)与base64url(payload),用点连接成 signing input;HS* 时再算base64url(HMAC(secret, signingInput));最终拼成header.payload.signature三段。 - 边界与阈值:HS256 摘要固定 32 字节、HS384 为 48 字节、HS512 为 64 字节;JWT 本身没有长度上限但不要塞超大载荷;浏览器对超长字符串有性能上限,几 KB 内最舒服。
- 常见误用的正确解释:JWT 不是加密,payload 只是 Base64URL 编码、肉眼可解码,绝不要在里面放密码等机密;none 算法跳过签名,生产环境应拒绝接受,本工具提供它是为了方便本地测试。
完整示例
示例与上方默认值完全一致(数值仅作演示):头部 {"alg":"HS256","typ":"JWT"} 编码为 eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9;载荷 {"sub":"1234567890","name":"示例用户","iat":1516239022} 编码为 eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IuekuuS-i-eUqOaItyIsImlhdCI6MTUxNjIzOTAyMn0;以密钥 liuquan-demo 做 HS256 签名得到 Wb94IwocSaVFpnbRhZH28EHmrnAvR17MOipaTX3nOTI,三段用点连接即为完整令牌。点「生成令牌」应得到与此逐位相同的字符串。
输入范围与对照表
下面是 JWT 常见声明(claim)的对照表,填载荷时可直接参考;完整 18 行可一键导出。保留声明以 RFC 7519 为准,私有声明可自由添加。
| 声明 | 英文全称 | 类型 | 说明 |
|---|---|---|---|
| iss | Issuer | string | 签发者,标识谁发的令牌。 |
| sub | Subject | string | 主体,通常是用户唯一标识。 |
| aud | Audience | string/array | 受众,令牌发给谁。 |
| exp | Expiration | number | 过期时间,Unix 秒,过期即失效。 |
| nbf | Not Before | number | 在此时间前令牌不可用。 |
| iat | Issued At | number | 签发时间,Unix 秒。 |
| jti | JWT ID | string | 令牌唯一编号,防重放。 |
| name | Name | string | 常用私有声明,展示用姓名。 |
| string | 常用私有声明,邮箱。 | ||
| role | Role | string | 常用私有声明,角色权限。 |
| scope | Scope | string | 常用私有声明,授权范围。 |
| admin | Admin | boolean | 常用私有声明,是否管理员。 |
CSV 带 BOM(Excel 中文不乱码),JSON 不带 BOM;复制为 TSV 可直接粘进表格软件。
结果边界与精度说明
- 时间字段单位:exp、nbf、iat 都是 Unix 秒(10 位),不是毫秒;误填毫秒会导致令牌几百年后才生效或早已过期。
- 编码可逆但非加密:Base64URL 只是编码,解码就能读;签名只防篡改不防窥视,机密信息请走 JWE 加密而非 JWT。
- 签名校验失败的含义:校验不通过只说明「密钥或算法与签发时不一致」,并不直接证明令牌伪造,可能只是你填错了密钥或选错了 alg。
常见问题
为什么解码后 payload 是明文?
JWT 的 payload 默认只做 Base64URL 编码,不是加密,任何人拿到令牌都能解码查看。所以不要把密码、令牌本身之外的机密放进去。
none 算法安全吗?
不安全。none 表示不签名,任何人都可篡改载荷。它只适合本地测试,生产系统应当拒绝接受 alg 为 none 的令牌。
HS256、HS384、HS512 怎么选?
三者算法相同、摘要长度不同,分别是 32、48、64 字节。一般 HS256 足够;对安全性要求更高的场景用 HS384 或 HS512,但两端必须一致。
签名校验提示失败怎么办?
先确认密钥与编码时完全一致(区分大小写、别多空格),再确认算法下拉与签发时相同;两者任一不对都会校验失败。
Base64URL 和普通 Base64 有什么不同?
URL 安全变体把 + 换成 -、/ 换成 _,并去掉末尾的 = 填充,目的是能安全放进 URL 和请求头而不被转义。
header 或 payload 不是合法 JSON 会怎样?
生成时会提示「头部/Payload 不是合法 JSON,并标出大致位置」,不会静默生成坏令牌;请检查是否少了引号或逗号。
这个工具会把我的令牌上传吗?
不会。编码、解码、验签全部在浏览器本地用 Web Crypto 完成,页面不发起任何网络请求,可断网使用。
令牌太长粘不下怎么办?
令牌本质是文本,可直接整段粘贴;如果接口要求放在 Authorization 头里,请连同 Bearer 前缀一起填,本工具只负责生成令牌本身。
相关工具
JWT 属于编码解码大类,下面这些同站工具在密码、标识与编码方向与之互补: