无需上传, 100% 本地处理, 无需账户

操作教程

如何在不泄露的情况下解码 JWT

JSON Web Token 携带着真实数据:令牌签发给哪个用户、授予哪些权限范围、何时过期。把它粘贴到随便一个在线解码器,就等于把这些数据连同往往仍然有效的会话,交给一台你无法掌控的服务器。下面的解码器完全在你的浏览器中运行,因此你可以读取令牌里的内容、检查它是否已过期,并在知道密钥时验证 HMAC 签名,整个过程不会有任何网络请求离开你的标签页。

分步操作

  1. 打开 JWT 解码器,把令牌粘贴到输入框。一个 JWT 是由点号连接的三段 Base64Url:头部、载荷和签名。带不带 Bearer 前缀都可以粘贴,工具会以任一形式读取其结构,并在格式有误时立即告诉你。
  2. 阅读解码后的头部和载荷。头部显示签名算法(例如 HS256 或 RS256),以及在存在时显示密钥 ID。载荷列出各项声明:令牌发给谁(sub)、由谁签发(iss)以及各个时间戳。工具会把数值型的 iat、nbf、exp 字段转换为可读日期,并标明令牌仍然有效还是已经过期。
    一个解码后的 JWT,显示头部算法以及带有可读签发日期和过期日期的载荷声明
  3. 如果令牌使用 HS256 而你持有共享密钥,就把密钥粘贴到验证框并点击 Verify。工具会对头部和载荷重新计算 HMAC 并与签名比对,于是你能知道令牌是真实的还是被篡改过。对于 RS256 或 ES256 令牌,签名使用的是你没有的私钥,所以工具会查看声明,但不会声称自己验证了签名。
    填入共享密钥的 HMAC 验证框,以及 HS256 令牌的有效签名徽章

为什么绝不该把令牌粘贴到随便的网站

JWT 没有加密。头部和载荷只是经过 Base64Url 编码,这意味着任何收到令牌的人都能读到里面的每一项声明:邮箱、用户 ID、角色、内部标志。如果这是一个尚未过期的访问令牌,持有它的人就能重放它,在它过期之前冒充你行事。当你把一个有效令牌粘贴到托管式解码器时,这一切都会进入那台服务器的日志。在自己的机器上、不做任何上传地解码令牌,是在不扩大可见范围的前提下查看它的唯一办法。你可以在解码时打开网络面板,确认流量为零。

签名能告诉你什么、不能告诉你什么

签名的作用,是阻止有人改动声明后还能蒙混过关。对于 HS256 令牌,签名和验证用的是同一个密钥,所以只要你知道密钥,就能在这里完全确认令牌是真实的。对于 RS256 和 ES256 令牌,由私钥签名、只有对应的公钥才能验证;私钥从不离开签发方,因此客户端工具能读取声明,但没有那个公钥就无法诚实地证明签名。在签名被验证密钥的持有者核对之前,请把解码出的载荷当作签发方提出的声明,而不是证据。若要单独对密钥做哈希或比对,本站的哈希生成器同样在本地运行。

JWT 结构及其每部分揭示的内容

JWT 是三个用点分隔的 Base64url 编码段:头部、有效载荷和签名。头部声明令牌类型("JWT")和算法:HS256(HMAC-SHA-256,共享密钥)或 RS256(RSA-SHA-256,公钥/私钥对)是最常见的。有效载荷携带声明,如 `sub`(主题,通常是用户 ID)、`iat`(颁发时间 Unix 时间戳)、`exp`(过期时间 Unix 时间戳)、`aud`(目标受众)以及角色或范围等自定义应用声明。Base64url 不是加密:它是 Base64 的 URL 安全变体,将 `+` 替换为 `-`,将 `/` 替换为 `_`,并省略填充。持有原始令牌字符串的任何人都可以在没有签名密钥的情况下解码头部和有效载荷。只有签名段需要密钥来验证。这就是为什么将实时生产令牌粘贴到外部在线解码器中存在安全风险:如果令牌的 `exp` 仍在未来且服务记录了输入,它所代表的会话可能会被泄露。

本指南用到的工具

常见问题

我解码令牌时,它会被发送到任何服务器吗?

不会。解码器把令牌拆开,对头部和载荷做 Base64Url 解码,并在内存中渲染出来。可选的 HMAC 检查使用浏览器内置的 Web Crypto API。没有任何内容经过网络传输,这一点很重要,因为 JWT 往往包含个人数据和一个仍然有效的会话。解码时打开浏览器的网络面板,你会看到没有任何请求发出。

这个工具能验证 RS256 或 ES256 签名吗?

不能完全验证,它也不会假装能。HS256 用同一个共享密钥来签名和验证,所以粘贴该密钥后工具就能在你的浏览器里确认签名。RS256 和 ES256 用私钥签名、用另外的公钥验证;工具会读取并校验声明和过期时间,但不会断言一个它无法核对的签名。对于这类令牌,请在持有公钥的服务上验证。

来源