JWT 签名验证工具
在线验证 JSON Web Token 签名:支持 HS256/HS384/HS512(HMAC 对称密钥)、
RS256/RS384/RS512(RSA 公钥)、ES256/ES384/ES512(ECDSA 椭圆曲线公钥)、
none(无签名,仅识别)共 10 种算法。粘贴 JWT 即自动解析 Header 识别算法并切换密钥输入区,
实时校验 exp/nbf/iat 时间声明,可选算法白名单防御 alg=none 攻击,
验签结果三段拆分展示(Header/Payload/Signature base64url + 美化 JSON)。
基于 Web Crypto API 纯原生 TypeScript 零依赖实现,密钥不离开浏览器。
常见问题
验签与解码有什么区别?为什么解码不等于安全?
解码是把 JWT 字符串拆开还原 Header/Payload 内容,任何人都能做,不验证签名真实性—— 即使攻击者篡改了 Payload,解码工具也会照常显示。配套的 JWT 解码工具 负责解析内容。验签是用密钥重新计算签名并比对, 确认令牌未被篡改且确实由持密钥的签发方颁发。本工具负责验签。 典型流程:① 服务端用 JWT 签名生成器(或后端库)签发 token; ② 客户端携带 token 访问 API;③ 服务端用密钥验签(本工具即模拟此步骤); ④ 调试时用解码工具查看令牌内容。关键:只有验签通过才能信任 Payload 内容, 解码结果在未验签前一律视为不可信。
HS256/HS384/HS512 验签需要什么密钥?
HMAC 是对称密钥算法,验签密钥必须与签发密钥完全一致。
若签发方用 "my-secret-2026" 签发,验签方也必须用同一字符串。
本工具支持两种密钥输入格式:
- UTF-8 字符串:直接输入密钥文本(如 my-secret-2026)
- base64url 编码字节:输入 32 字节随机二进制的 base64url 编码
(适合密钥含不可见字符或严格 256 位随机密钥)
常见失败原因:① 密钥前后误加空格或换行;② 密钥格式选错
(签发用 UTF-8 但验签选了 base64url);③ 密钥大小写不一致。可先用
JWT 签名生成器 用相同密钥签发一个 token,再来本工具验证。
RS256/RS384/RS512 验签需要什么密钥?私钥还是公钥?
RSA 是非对称密钥算法,遵循「私钥签发、公钥验签」。
验签只需RSA 公钥,无需私钥——这正是非对称算法的优势:
公钥可公开分发(如 JWKS 端点),验签方无需持有敏感私钥即可验证令牌真实性。
本工具支持两种公钥输入格式:
- PEM 格式:-----BEGIN PUBLIC KEY-----(SPKI)或
-----BEGIN RSA PUBLIC KEY-----(PKCS#1)
- JWK 格式:含 kty:"RSA"、n、e 字段的 JSON 对象
公钥可从 JWT 签名生成器 生成的密钥对中复制「公钥」字段。
注意:切勿将私钥粘贴到验签工具——验签只需公钥,私钥泄露会导致任意令牌可被伪造。
ES256/ES384/ES512 验签需要什么密钥?曲线要匹配吗?
ECDSA 同样是非对称算法,验签只需 EC 公钥。关键要求:公钥曲线必须与算法匹配:
- ES256 → P-256 曲线公钥
- ES384 → P-384 曲线公钥
- ES512 → P-521 曲线公钥
本工具支持两种公钥输入格式:
- PEM 格式:-----BEGIN PUBLIC KEY-----(SPKI)
- JWK 格式:含 kty:"EC"、crv、x、y 字段的 JSON 对象
公钥可从 JWT 签名生成器 生成 EC 密钥对后复制「公钥」字段。
签名格式:JWT 的 ES 系列采用 raw 拼接格式 r || s(非 ASN.1 DER),
本工具基于 Web Crypto API 验签,原生支持 raw 格式,无需转换。想深入了解椭圆曲线原理?
参阅 椭圆曲线密码学与 ECDSA 签名实践。
什么是 alg=none 攻击?如何防御?
none 算法表示无签名,JWT 第三段为空。攻击场景:
攻击者截获一个合法的 HS256 JWT,把 Header 中的 {"alg":"HS256"}
改为 {"alg":"none"},清空签名段,并任意篡改 Payload(如把
role:"user" 改为 role:"admin")。若服务端信任 token 自身声明的 alg
而非硬编码算法白名单,就会跳过验签,接受伪造令牌。
防御措施:
- 服务端必须硬编码允许的算法白名单(如仅接受 HS256/RS256),不读取 token 声明的 alg
- 本工具默认开启「强制算法白名单」开关:若 token 声明的 alg 与检测到的不一致,直接拒绝
- 遇到 none 算法时显示红色安全警告,明确提示严禁生产使用
详见 JWT 安全实践 与
JWT 验签实战指南。
exp/nbf/iat 时间声明如何校验?过期 token 一定不能用吗?
JWT 标准定义三个时间声明(均为 Unix 秒级时间戳):
- exp(Expiration Time,过期时间):当前时间超过 exp 则令牌过期
- nbf(Not Before,生效时间):当前时间早于 nbf 则令牌尚未生效
- iat(Issued At,签发时间):令牌签发时刻,用于判断令牌年龄
本工具自动校验这三项并显示状态徽章:
✓ 有效 / ✗ 已过期 / ⏳ 未生效 / ○ 缺失,
并换算为本地时间与相对时间(如「剩余 2 小时」「已过期 3 天」)。
过期 token 一定不能用吗?不一定。在 OAuth2 刷新令牌流程中,
access_token 过期后可用 refresh_token 换取新令牌,此时 access_token 虽过期但 refresh_token 仍有效。
但 access_token 本身过期后不应再用于访问受保护资源,服务端必须拒绝。
验签通过就安全了吗?还需要校验哪些声明?
验签通过仅代表签名与密钥匹配、时间声明合规,并不等同于令牌完全可信。
生产环境还需校验以下业务声明:
- iss(Issuer,签发者):必须等于预期的签发方标识,防止其他系统签发的 token 被误信
- aud(Audience,受众):必须等于当前服务标识,防止跨服务的 token 被混用
- sub(Subject,主体):用户/主体 ID,用于业务鉴权
- jti(JWT ID):唯一标识,配合 Redis 实现防重放(同一 jti 只能用一次)
- scope/role:权限范围,用于细粒度授权
常见疏漏:只验签名不验 iss/aud,导致 A 服务的 token 可在 B 服务使用(跨服务越权)。
本工具聚焦签名与时间声明校验,业务声明需在服务端代码中补充校验。
什么是常量时间比较?为什么验签要用?
常量时间比较(Constant-time comparison)是指比较两个字节串的耗时与内容完全无关,
无论是否匹配、在第几位不同,耗时都相同。为什么需要:普通的逐字节比较(如 ===)
在发现第一个不同的字节时就提前返回,攻击者可通过测量响应时间逐字节猜出正确签名
(时序攻击 / Timing Attack)。Web Crypto API 的 verify 方法内部已使用常量时间比较,
本工具基于此实现,无需手动处理。反例:若用 token.signature === computedSignature
手动比对,存在时序攻击风险。后端验签库(如 Node.js 的 jsonwebtoken、Python 的 PyJWT)
均已内置常量时间比较。
什么是 JWKS?如何配合本工具验签?
JWKS(JSON Web Key Set,RFC 7517)是公钥集合的 JSON 格式,常见于 OAuth2/OIDC 提供商的
/.well-known/jwks.json 端点。格式示例:
{"keys":[{"kty":"RSA","kid":"key1","n":"...","e":"AQAB"}]}。
JWT Header 中的 kid(Key ID)字段用于指明用 JWKS 中的哪个公钥验签。
配合本工具:① 从 JWKS 端点找到与 token 的 kid 匹配的公钥;
② 将该公钥的 JWK 复制到本工具的「公钥输入框」;③ 验签。
生产实践:服务端应缓存 JWKS(如缓存 1 小时)并支持密钥轮换
(kid 变化时自动刷新缓存),避免每次验签都请求 JWKS 端点。常见 JWKS 端点:
Google https://www.googleapis.com/oauth2/v3/certs、
Auth0 https://your-domain.auth0.com/.well-known/jwks.json、
AWS Cognito https://cognito-idp.region.amazonaws.com/poolId/.well-known/jwks.json。
验签失败常见原因有哪些?如何排查?
常见失败场景与排查建议:
- 密钥不匹配:HMAC 密钥与签发时不一致;RSA/EC 公钥与签发私钥不配对。
可用 JWT 签名生成器 用同一密钥签发后验证。
- 密钥格式错误:HMAC 密钥格式选错(UTF-8 vs base64url);PEM 缺少
-----BEGIN PUBLIC KEY----- 标记;JWK 缺少必要字段(RSA 缺 n/e,EC 缺 crv/x/y)。
- 曲线与算法不匹配:ES256 必须用 P-256 公钥,ES384 用 P-384,ES512 用 P-521。
- token 被篡改:任何一段(Header/Payload/Signature)被改动,签名即失效。
- token 格式错误:段数不足 3(非 JWE)、base64url 解码失败、Header 不是 JSON 对象。
- 声明不合规:签名有效但 exp 过期、nbf 未生效——本工具会区分显示「签名无效」与「声明不合规」。
- Web Crypto API 不可用:非安全上下文(HTTP 非 localhost)下 crypto.subtle 为 undefined。
请在 HTTPS 或 localhost 环境使用。
none 算法的 token 能验签吗?为什么显示警告?
none 算法无签名段,格式为 header.payload.(末尾有一个点),
本质上不存在验签——任何人都能伪造。本工具对 none 算法的处理:
- 识别并警告:检测到 alg=none 时显示红色安全警告横幅,明确提示「任何人可伪造,严禁生产使用」
- 不进行验签:因无签名,无法验证真实性,结果标记为失败
- 仍解析内容:展示 Header/Payload 供调试查看(与解码工具一致)
RFC 7519 允许 none 算法仅用于调试与教学。生产环境必须拒绝任何 alg=none 的 token。
若你的服务端收到 none 算法 token,应立即记录安全日志并拒绝访问——这通常是攻击者在试探 alg=none 漏洞。
数据会上传到服务器吗?密钥安全吗?
不会上传。本工具完全在浏览器内运行,所有 JWT 解析、密钥处理、签名验证
均由 JavaScript 在你本地执行,输入的 token 与密钥不会发送到任何服务器。
Web Crypto API 的所有操作(importKey、verify)均在浏览器沙箱内完成,
密钥材料不离开设备内存。这对于调试真实业务的密钥尤为重要——
生产密钥泄露会导致任意 JWT 被伪造。额外提示:
① 不要在公共电脑上输入生产密钥;② 验签完成后建议清除浏览器历史记录;
③ 调试时可用 JWT 签名生成器 生成临时密钥对,避免使用生产密钥。
与 JWT 签名生成器如何联动?
本工具与 JWT 签名生成器 形成「签发 + 验签」闭环:
① 在 JWT 签名生成器选择算法(HS256/RS256/ES256 等)→ 输入或生成密钥 → 签发 JWT
② 复制签发的 JWT 与对应密钥(HMAC 密钥 / RSA 公钥 / EC 公钥)
③ 粘贴到本工具的 JWT 输入框与密钥输入框 → 点击「验证签名」
④ 验签通过即证明签发与验签逻辑正确,可移植到服务端代码
常见联调场景:
- 服务端集成 JWT 认证:先用本工具确认签发/验签密钥配对正确,再写服务端代码
- 跨语言对接:Java 签发的 token 在 Node.js 验签,先用本工具确认 token 格式与密钥一致
- 密钥轮换演练:生成新密钥对,用旧密钥签发的 token 用新公钥验签应失败,确认轮换生效
配合 JWT 解码工具 还可查看令牌内容,三者构成完整的 JWT 全家桶。