⭐ 觉得好用?收藏备用,下次直接打开 ✨ 开通会员去广告 · 更多权益即将开放 ☕ 支持作者
JWT Token
🔒
公钥/密钥不会离开你的浏览器
所有验签计算均在本机 WebCrypto 内完成,密钥与 Token 不上传任何服务器、不写入存储。
请勿粘贴生产 HMAC Secret。本工具仅供调试和学习使用,因密钥外泄、误用、被盗导致的任何损失, 本网站不承担任何责任。
期望算法
Secret 密钥

JWT 验签 用公钥(或对称 Secret)核验 JSON Web Token 的签名是否合法、声明是否还在有效期内。所有计算在浏览器原生 WebCrypto API 完成,密钥与 Token 不会上传任何服务器。

验证流程

  1. 粘贴 Token → 工具自动 base64url 解码 Header 与 Payload,并把 token 中的 alg 标记到对应算法 chip 上
  2. 选择期望算法(默认与 token 同步,可手动指定以防 alg confusion)
  3. 输入对应公钥 / Secret
  4. 点击”验证签名”

通过则得到绿色 ✅,失败给出具体原因(签名无效、算法不匹配、密钥格式错、alg=none 被拒等)。下方“声明检查”独立展示 exp / nbf / iat / iss / sub / aud;其中时效会按当前时间判断,iss / sub / aud 主要用于人工核对。

算法-密钥 对照

算法系列期望密钥输入示例
HS256/384/512HMAC 对称 Secret字符串
RS256/384/512RSA 公钥BEGIN PUBLIC KEY / BEGIN RSA PUBLIC KEY / 证书 / JWK
PS256/384/512RSA 公钥(PSS 用)同上
ES256/384/512EC 公钥(P-256/P-384/P-521)BEGIN PUBLIC KEY / 证书 / JWK

仅签名 + 时效

工具的”签名有效”结论严格限定在密码学层面——签名能用对应公钥还原、Token 内容未被篡改。不做以下校验,需要的请在自己后端补:

  • iss / aud / sub 是否符合你的系统预期
  • jti 是否在重放黑名单中
  • scope / permissions 是否覆盖请求
  • 服务端撤销列表(被强制下线的 token)

时效检查(exp 必须大于当前时间、nbf 必须不晚于当前)与签名独立显示——签名有效但 token 已过期是真实存在的状态,不应误读为”完全无效”。

📍使用场景

  • 排查接口 401客户端拿到的 token 被后端拒绝时,本地用同一公钥/Secret 验一遍,定位是 token 篡改、过期、还是密钥不一致。
  • 校对签发实现实现完 JWT 签发后,自己签自己验跑通闭环;切算法迁移时双向核对。
  • 第三方 OIDC token 验证收到上游身份提供方的 ID Token,用其公布的公钥(JWKS / x5c)本地核签,确认未被中间人改写。
  • 安全审计 / CTF拿到一份 JWT 想搞清楚是哪种算法、签名是否真有效、是否落入 alg=none 等常见陷阱。

❓常见问题

为什么需要"期望算法",不能直接用 token 里的 alg 吗?

这是防 alg confusion 攻击的关键。如果工具直接信任 token.alg,攻击者可以把 RS256 改成 HS256,然后用泄露的"公钥字符串"当 HMAC secret 来伪造签名,验证就会通过。本工具强制让你显式指定期望算法,与 token 不一致直接拒绝。

支持哪些公钥格式?

PEM BEGIN PUBLIC KEY(SPKI 通用,最常用)、PEM BEGIN RSA PUBLIC KEY(PKCS#1 RSA,自动包装为 SPKI)、X.509 证书(自动从证书提取 SubjectPublicKeyInfo)、JWK JSON(kty=RSA 或 kty=EC)。HS 算法直接输入 Secret 字符串。

验证通过 = token 完全可信吗?

不等于。本工具只校验"签名 + 时效声明",并把 iss / sub / aud 等标准声明的值展示出来供你人工检查;它不会替你做业务准入决策,也不会判断撤销列表、重放、作用域覆盖或客户端绑定。完整可信判断仍要靠后端。

alg=none 怎么处理?

永远视为无效。RFC 7515 允许 none 算法(无签名),但这是著名的"alg=none 攻击"入口——服务端如果误信会让任何人伪造 token。本工具不论传什么密钥,遇到 alg=none 一律拒绝。

ECDSA 验签提示"签名校验未通过",但用 OpenSSL 验是对的?

检查签名编码格式:JOSE 规范要求 ECDSA 签名是 r||s 拼接的固定长度(IEEE P1363),长度 = 2 × 曲线字节数(ES256=64 字节)。OpenSSL dgst -verify 默认期望 DER 编码,长度可变。如果你的 token 是用 OpenSSL 签的,签名段需要先从 DER 转 raw 才能放进 JWT。

能不能用 JWKS(多个 kid 公钥)批量验?

当前不支持 JWKS 自动选 key——你需要从 JWKS 中按 token header 的 kid 字段挑出对应那把 JWK,单独粘进密钥框。这是个常见进阶需求,未来可能补;眼下先用单 key 模式跑通主路径。