JWT 解码、验证与签名
解码 JSON Web Token,查看其中的声明和过期时间,用密钥或公钥验证签名,并签发 HMAC 令牌。
- 头部
- 载荷
- 签名
| 声明 | 值 | 含义 |
|---|
验证签名
支持:PEM 公钥(SPKI 或 PKCS #1)、X.509 证书、JWK 或 JWK Set。如果是密钥集,会使用与令牌 kid 匹配的密钥;如果令牌没有指定 kid,则逐一尝试所有类型相符的密钥。
把工具固定在这里,会保存在此浏览器中。
固定一个工具,它的贴纸就会出现在这里。
解码 JSON Web Token,查看其中的声明和过期时间,用密钥或公钥验证签名,并签发 HMAC 令牌。
| 声明 | 值 | 含义 |
|---|
验证签名
支持:PEM 公钥(SPKI 或 PKCS #1)、X.509 证书、JWK 或 JWK Set。如果是密钥集,会使用与令牌 kid 匹配的密钥;如果令牌没有指定 kid,则逐一尝试所有类型相符的密钥。
签名的 JSON Web Token(RFC 7519)是用点连接起来的三个 Base64URL 字符串:头部、载荷和签名。头部说明令牌的签名方式(alg)。载荷是由声明(claim)组成的 JSON 对象,声明说明令牌涉及谁(sub)、由谁签发(iss)、何时过期(exp)等信息。签名基于前两部分计算得出。
解码不等于验证。头部和载荷只是经过编码,并没有加密:任何持有令牌的人都能读取它们,就像本页面无需任何密钥即可读取一样;任何人也都能写出带有任意声明的令牌。切勿在 JWT 载荷中放入机密信息,在签名通过验证之前也不要信任任何声明。
HS256、HS384 和 HS512 是 HMAC:签名和验证使用同一个密钥,因此能验证的人也能伪造。RS256、PS256 和 ES256 及其 384、512 变体是非对称算法:签发者用私钥签名,你用公钥验证,公钥通常以 JWK Set 的形式发布在签发者的 jwks_uri 上。
粘贴密钥,或者以 PEM、X.509 证书或 JWK 的形式粘贴公钥。验证由浏览器的 Web Crypto API 完成。结果有三种:签名有效、签名无效,或者无法验证。对于最后一种情况,页面会说明原因:没有密钥、密钥类型或曲线不对、算法不受支持,或者头部写着 "alg": "none",即令牌根本没有签名。
签名有效是必要条件,但并不充分。真实的服务还必须检查过期时间、签发者和受众,并且应由自己决定接受哪种算法,而不是相信令牌头部的说法。
exp、nbf 和 iat 是以秒为单位的 Unix 时间戳。声明表把它们显示为你所在时区的日期,表格上方的标记则按照你设备的时钟,说明令牌已过期、尚未生效,或者还剩多长有效期。
页面打开时会显示一个在浏览器中生成的示例令牌,签发时间为当前时刻,有效期一小时。它使用 HS256 和示例密钥 devtools-sample-secret-not-for-production 签名,所以能通过验证。这个密钥是公开的:不要把它用于任何真实场景。
签名模式根据你编辑的头部、载荷和 HMAC 密钥生成令牌,适用于测试和本地开发。你输入的令牌、密钥和公钥都只留在当前标签页中:不会被发送、保存或记录。
令牌由浏览器中的 JavaScript 解码和验证,不会发送到服务器。即便如此,未过期的令牌就是一份可用的凭据,所以对任何要求你提供令牌的工具都要谨慎,尽量使用已过期的令牌或测试令牌。
是的。头部和载荷是经过 Base64URL 编码的 JSON,并没有加密,任何持有令牌的人无需密钥即可读取。签名不会隐藏任何内容:它只能证明令牌是由持有签名密钥的人创建的,并且之后没有被修改过。
HS256 的签名和验证使用同一个共享密钥,因此每个负责验证的一方也都能创建令牌。RS256 用私钥签名、用公钥验证,这样许多服务都能验证只有签发者才能创建的令牌。
按照你设备的时钟,它的 exp 声明是一个已经过去的时刻。有些服务器能容忍少量时钟偏差,但过期的令牌必须更换,可以重新登录,或者使用刷新令牌(refresh token)获取新令牌。
它会在独立窗口中打开,离线时也能使用。
要安装,请点按“分享”按钮,然后选择“添加到主屏幕”。