JWT 解码与签名验证
粘贴令牌,就能看到 header、payload 和每一项声明;过期时间和签发时间会显示成真正的日期,并告诉你距今多久。填入共享密钥或公钥还能验证签名。令牌不会离开本页。
开头的 "Bearer "、引号和换行会自动去掉。 令牌和密钥只在本页里处理,不会上传、保存或记录。
解码不等于验证。任何人都能做出一个解码后内容一模一样的令牌,只有用正确的密钥验过签名,才能确认它真的出自签发方。
Header(头部)
{
"alg": "HS256",
"typ": "JWT"
}Payload(载荷)
{
"iss": "https://auth.example.com",
"sub": "user-1234",
"aud": "api.example.com",
"name": "Ada Lovelace",
"role": "admin",
"iat": 1760000000,
"exp": 1760003600
}声明(claims)
| 声明 | 值 | 含义 |
|---|---|---|
| iss | https://auth.example.com | 签发者:谁生成了这个令牌 |
| sub | user-1234 | 主体:令牌说的是谁,通常是用户 ID |
| aud | api.example.com | 受众:令牌是发给谁用的 |
| exp | 1760003600UTC: 2025-10-09 09:53:20 UTC | 过期时间:从这一刻起应拒绝该令牌 |
| iat | 1760000000UTC: 2025-10-09 08:53:20 UTC | 签发时间:令牌生成的时间 |
| name | Ada Lovelace | 自定义声明 |
| role | admin | 自定义声明 |
时间按本设备的时钟判断,不留余量。服务器通常会容忍一两分钟的时钟误差。
签名
32 字节,base64url: WQbV-ewrpWMwGk_AJhqOfHb5Wl4F0ndaPKFE2cr7ArY
验证签名(可选)
粘贴应当用来签名的密钥。HS 开头的令牌需要共享密钥;RS、PS、ES 开头的令牌需要公钥,可以是 PEM(-----BEGIN PUBLIC KEY-----)或 JWK。密钥类型必须和令牌的 alg 对得上:HS 令牌绝不会用公钥来验,RS/PS/ES 令牌也绝不会用共享密钥来验,这样就挡住了经典的“算法混淆”攻击。
header 里的算法: HS256
示例令牌是用密钥 "demo-secret-change-me" 签名的。
正在验证…
它是怎么工作的
- •签名的 JWT 由点号连接的三段 base64url 组成:header、payload 和签名。本页把它拆开,把前两段按 UTF-8 JSON 解码并格式化显示。格式化的 header 和 payload 里,很长的数字按原样显示;在声明表格里则按 JavaScript 的读法显示,超过约 15 位的数字可能在表格里被四舍五入。
- •exp、nbf、iat 按 JWT 标准(RFC 7519)的定义,当作自 1970 年起的秒数(UTC),并且每秒和你设备的时钟比较一次。从 exp 那一秒起即算过期,不留余量。
- •提醒会指出常引发 bug 或安全漏洞的情况:alg 为 "none"、没有 exp、时间写成了毫秒、重复的声明、带填充或用了标准 base64、header 里夹带密钥。5 段的令牌会被识别为加密令牌(JWE),只能读出 header。
- •签名验证用的是浏览器自带的 Web Crypto:HS256/384/512 用 HMAC,RS256/384/512 用 RSA PKCS#1 v1.5,PS256/384/512 用 RSA-PSS,ES256/384/512 用 ECDSA(按 JWT 要求的原始 R||S 签名格式)。密钥可以是文本或 base64 形式的共享密钥、PEM 公钥或 JWK。
- •密钥必须和 header 里的算法匹配:HS 令牌绝不用公钥验证,RS/PS/ES 令牌也绝不用共享密钥验证,所以伪造的令牌没法靠改 alg 来骗过检查。
- •这个工具不保存任何东西:没有历史记录,刷新页面就会清空。输入上限是 2 MB。
常见问题
- 把真实的令牌粘贴到这里安全吗?
- 令牌和密钥只由本页里运行的代码处理,不会发送到服务器,也不会保存在浏览器里或写进日志。不过有效的令牌本身就是凭证,经过的屏幕和剪贴板都要留心,能用已过期或测试用的令牌就尽量用。
- 能解码就说明 JWT 是真的吗?
- 不能。header 和 payload 只是 base64url 编码,并没有加密,谁都能读,谁也都能造出带任意声明的令牌。只有用签发方的密钥验证签名,才能确认令牌是真的;服务器还必须检查 exp、aud 和 iss。
- 为什么我的令牌显示几千年后才过期?
- JWT 的时间是自 1970 年起的秒数。如果签发方写成了毫秒,数字就大了 1000 倍,读出来就是很远的将来。本页会给出提醒,并显示按毫秒理解时对应的日期。
- 为什么 HS256 令牌不能用公钥验证?
- HS256 用同一个共享密钥签名和验证。如果服务器把公钥当作这个共享密钥,知道公钥的攻击者就能自己签发令牌,这就是“算法混淆”攻击。所以本页只用共享密钥验证 HS 令牌,只用公钥验证 RS、PS、ES 令牌。