JWT签名验证工具(RS256/ES256,公钥验证)

一款开发者工具,可使用SPKI格式的公钥(PEM)在浏览器中即时验证以RS256或ES256签名的JWT(JSON Web Token)。同时显示解码后的Header/Payload以及过期时间检查结果。所有输入内容仅在浏览器内处理,不会发送到服务器。

支持的签名算法一览

算法 密钥类型 哈希函数 说明
RS256 RSA(RSASSA-PKCS1-v1_5) SHA-256 基于RSA公钥密码体制的签名方式,是Google、Auth0、Okta等主流OAuth 2.0/OpenID Connect提供商为ID令牌采用的标准默认算法。
ES256 ECDSA(P-256椭圆曲线) SHA-256 基于椭圆曲线密码学的签名方式,可用比RSA更短的密钥长度和签名长度实现同等安全性,越来越多地应用于移动应用和物联网设备。

用公钥验证 JWT 的签名

本工具以 SPKI 形式的 PEM 公钥,验证由 RS256 或 ES256 签署的 JWT,并同时列出解码后的标头与载荷以及有效期。您输入的一切都在浏览器内处理,不会外传。

**值得强调的是:签名有效与令牌有效,本是两回事。** 签名通过,只证明内容自签发以来未被改写而已。真正的认证还须核对 `exp`(有效期)、`nbf`(生效时刻)、`iss`(签发者)与 `aud`(预期受众)是否合乎您的预期。**另一个在实现上众所周知的陷阱,是让令牌自己的标头来决定用哪种算法验证。** 除非服务端事先把可接受的 `alg` 定死,否则这个选择便向攻击者敞开了。

验证的步骤

  1. 贴入待验的 JWT 那是以点分作三段的字符串。
  2. 贴入 PEM 形式的公钥 **要的是公钥,不是私钥。** RS256 取 RSA 密钥,ES256 取 P-256 曲线上的密钥。
  3. 验证签名 工具会报出密钥与签名是否相符。
  4. 核对解码内容与有效期 **签名通过的令牌,一旦过期仍然不可使用。** 两者都要看。

用好本工具的小技巧

  • 输入的公钥必须是PEM格式(SPKI,以「-----BEGIN PUBLIC KEY-----」开头)。直接粘贴私钥文件或证书(.crt)无法完成验证。
  • 系统会根据JWT Header中alg字段的值(RS256或ES256)自动切换所使用的验证算法,无需手动选择。
  • 验证签名的同时也会检查Payload中的exp声明,若已过期会显示警告。即使签名正确,过期的令牌通常也应被拒绝。
  • 本工具仅支持RS256和ES256。若需确认HS256等共享密钥方式签名的JWT,可使用姊妹工具JWT编码器用相同的共享密钥重新签名并比对结果。
  • 用于验证的公钥并非机密信息,直接粘贴从身份提供商公开端点(如JWKS)获取的公钥即可,无需担心泄露问题。

这些场景会用到

查看 ID 令牌的内容

由身份提供方签发的令牌,可拿它的公钥来核。

分辨密钥有误还是签名损坏

**验证失败时,可在本地判明这二者中究竟是哪一个出了岔子。**

检验密钥轮换

依次试过新旧两把密钥,便可确认更替能否照计划走完。

追查故障的根由

接到认证失败的报告时,可先判明问题是否出在令牌本身。

JWT 验证的术语

RS256
以 RSA 密钥搭配 SHA-256 的签名方式。**签署用私钥,验证用公钥。**
ES256
以 P-256 曲线搭配 SHA-256 的签名方式。密钥与签名都比 RSA 来得短。
SPKI
承载公钥的标准形式。在 PEM 中以 `-----BEGIN PUBLIC KEY-----` 开头。
exp
给出有效期的声明。**签名再无可挑剔,过了这一刻的令牌也不得接受。**
nbf
给出令牌自何时起可用的声明。在此之前,令牌尚未生效。
算法混淆
**某些实现的弱点在于:令牌的标头指名哪种算法,便照着哪种去验证。** 可接受的方式须在验证一方定死。

常见问题

仅支持RS256和ES256的验证。HS256、HS384、HS512属于共享密钥方式,需要发签名方和验证方共用同一密钥,因此无法用只输入公钥的本工具验证。若需确认HS256签名,可使用姊妹工具JWT编码器用相同密钥重新签名并比对结果。

身份提供商(Google、Auth0、Okta等)通常通过名为JWKS(JSON Web Key Set)的公开端点发布公钥。可以使用JWKS转PEM的转换工具,或直接使用对应服务文档中提供的公钥。

常见原因包括:①所输入的公钥与签发该JWT的私钥不成对;②JWT的Header、Payload或Signature在传输过程中被篡改或损坏;③复制粘贴时丢失了字符。建议从来源重新准确复制JWT字符串和公钥。

目前仅支持RS256和ES256。RS384/RS512、ES384/ES512等使用更长哈希函数的变体,属于后续考虑扩展支持的候选方向。

是的,签名的有效性与exp是否过期是分别判断并各自显示的。即使签名正确,过期的令牌在实际系统中通常也应被拒绝,请务必同时留意页面上显示的有效期警告。
工具君

闲话 ― HMAC与公钥签名,区别在哪里

JWT的签名方式大致分为共享密钥方式(HMAC,如HS256)和公钥方式(RSA/ECDSA,如RS256、ES256)两大类。共享密钥方式要求签名方与验证方持有相同的秘密字符串,而公钥方式中只有签名方持有私钥,任何人都可以用公开的公钥进行验证。这一差异直接决定了API设计中的角色分工:姊妹工具JWT编码器(HS256)适合「签发者与验证者同处一台服务器」的场景,而本工具所处理的RS256、ES256则更适合「签发者与验证者分属不同组织或不同服务器」的场景。

实际上,Google的OAuth 2.0、OpenID Connect、Auth0、Okta等主流身份提供商签发的ID令牌几乎无一例外地采用RS256签名(部分也可选择ES256)。这是因为只有身份提供商一方持有私钥进行签名,而数量庞大的客户端应用(验证方)只需使用公钥即可完成验证,无需向每个客户端分发密钥,从而将密钥泄露的风险集中在签名方这一个点上。

RS256与ES256都使用SHA-256进行哈希计算,但底层的密码算法不同。RS256采用RSA密码体制(通常为2048位或更长的密钥),签名长度往往较大,但胜在实现成熟、支持的库众多。ES256采用椭圆曲线密码学(P-256),能以远比RSA更短的密钥和签名长度实现同等的安全强度,因此在移动端和对负载大小敏感的API中采用日益增多。