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` 定死,否则这个选择便向攻击者敞开了。
验证的步骤
- 贴入待验的 JWT 那是以点分作三段的字符串。
- 贴入 PEM 形式的公钥 **要的是公钥,不是私钥。** RS256 取 RSA 密钥,ES256 取 P-256 曲线上的密钥。
- 验证签名 工具会报出密钥与签名是否相符。
- 核对解码内容与有效期 **签名通过的令牌,一旦过期仍然不可使用。** 两者都要看。
用好本工具的小技巧
- 输入的公钥必须是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
- 给出令牌自何时起可用的声明。在此之前,令牌尚未生效。
- 算法混淆
- **某些实现的弱点在于:令牌的标头指名哪种算法,便照着哪种去验证。** 可接受的方式须在验证一方定死。
常见问题
闲话 ― 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中采用日益增多。