MiServe DevTools

我的贴纸

把工具固定在这里,会保存在此浏览器中。

JWT 解码、验证与签名

解码 JSON Web Token,查看其中的声明和过期时间,用密钥或公钥验证签名,并签发 HMAC 令牌。

在浏览器中运行。粘贴的内容不会被上传。

关于此工具

什么是 JWT

签名的 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 密钥生成令牌,适用于测试和本地开发。你输入的令牌、密钥和公钥都只留在当前标签页中:不会被发送、保存或记录。

常见问题

在这里粘贴 JWT 安全吗?

令牌由浏览器中的 JavaScript 解码和验证,不会发送到服务器。即便如此,未过期的令牌就是一份可用的凭据,所以对任何要求你提供令牌的工具都要谨慎,尽量使用已过期的令牌或测试令牌。

任何人都能读取 JWT 的内容吗?

是的。头部和载荷是经过 Base64URL 编码的 JSON,并没有加密,任何持有令牌的人无需密钥即可读取。签名不会隐藏任何内容:它只能证明令牌是由持有签名密钥的人创建的,并且之后没有被修改过。

HS256 和 RS256 有什么区别?

HS256 的签名和验证使用同一个共享密钥,因此每个负责验证的一方也都能创建令牌。RS256 用私钥签名、用公钥验证,这样许多服务都能验证只有签发者才能创建的令牌。

为什么我的令牌显示已过期?

按照你设备的时钟,它的 exp 声明是一个已经过去的时刻。有些服务器能容忍少量时钟偏差,但过期的令牌必须更换,可以重新登录,或者使用刷新令牌(refresh token)获取新令牌。

编码分类的其他工具