跳到正文

← 全部工具

免费在线工具

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)

声明值含义
isshttps://auth.example.com签发者:谁生成了这个令牌
subuser-1234主体:令牌说的是谁,通常是用户 ID
audapi.example.com受众:令牌是发给谁用的
exp1760003600UTC: 2025-10-09 09:53:20 UTC过期时间:从这一刻起应拒绝该令牌
iat1760000000UTC: 2025-10-09 08:53:20 UTC签发时间:令牌生成的时间
nameAda Lovelace自定义声明
roleadmin自定义声明

时间按本设备的时钟判断,不留余量。服务器通常会容忍一两分钟的时钟误差。

签名

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 令牌。

相关阅读