DevToolbox
跳到主内容

JWT 解析 / 签发

解析 / HS256 签发 / 验签,检查 exp 与篡改

签名算法

解析只是解码,不代表签名有效;需要校验请切到「验签」

JWT 输入
粘贴完整的 Token(Header.Payload.Signature)
等待输入
Header
描述签名算法与类型
Payload
业务声明(claims),任何人都能解码查看

关于JWT 解析 / 签发

JWT 由三段 Base64URL 组成,用 “.” 分隔:Header 描述签名算法与类型,Payload 承载声明(claims),Signature 用于验证。前两段只是 Base64URL 编码,任何人都可以解码查看,因此绝不能在 JWT 中放置密码等敏感信息。

本工具提供三件事:解析(格式化展示 Header 与 Payload,并把 exp、nbf、iat 换算成可读时间)、签发(用 HS256 生成一个可直接使用的 Token,可自动补 iat 与 exp)、验签(重新计算 HMAC-SHA256 并做定长比较,判断 Token 是否被篡改)。三段内容与密钥都只在浏览器内存中处理,不产生任何网络请求。

算法范围是刻意收窄的:只支持 HS256。签名校验必须拿到密钥,而 RS256 / ES256 还需要非对称密钥对与 SHA-384 / SHA-512 摘要,本项目的纯 JavaScript 哈希实现只覆盖 MD5 / SHA-1 / SHA-256。与其在界面上摆一排点了就报错的选项,不如明确只做实际使用最多、并且能真正算准的这一种。

常见问题

JWT 的内容是加密的吗?

不是。普通的 JWT 是 JWS(签名)结构,Payload 仅做 Base64URL 编码,任何人拿到 Token 都能解出内容。还有一种 JWE 是真正加密的,但它由五段组成、结构完全不同。不要把密码、身份证号等敏感信息放进 JWT。

验签和解码有什么区别?

解码只能看到内容,无法判断内容有没有被改过。任何人都可以把 Payload 换成 {"role":"admin"} 再拼回去,解码结果看起来完全正常。验签会用你填的密钥重新计算 HMAC-SHA256 并与第三段比较,只有两者一致才说明这个 Token 确实是由持有该密钥的一方签发且未被修改。本工具的比较使用定长算法,不会因为逐字符提前返回而泄露信息。

在这里填生产密钥安全吗?

密钥只参与浏览器内存中的计算,页面不发送任何包含密钥的请求,可以打开开发者工具的 Network 面板确认。不过仍建议用测试密钥试跑——长期有效的生产密钥一旦被浏览器扩展、代理或录屏记录就很难挽回。需要频繁签发与校验时,请在服务端完成。

为什么 exp 显示的过期时间和实际不符?

exp、nbf、iat 都是 Unix 秒级时间戳,与时区无关。如果发现偏差,通常是签发方使用了毫秒时间戳(少见)或服务器时钟不同步。本工具会同时显示解析出的 UTC 时间与本机时间供对照,验签时还可以设置时钟偏移容忍。