tigtools

JWT 生成器

构建并签名一个用于测试的 JSON Web Token,或检查令牌的 HMAC 签名是否与密钥匹配。签名使用浏览器的 Web Crypto API。

在浏览器中运行 无需注册

模式
密钥仅保留在此浏览器标签页中,绝不会发送到任何地方。即便如此,请勿将生产环境的签名密钥粘贴到任何网站:任何持有该密钥的人都能为你的系统生成有效令牌。请在此使用测试密钥。

alg 由算法菜单设置;typ 默认为 JWT。

可包含 sub、iat 和 exp 等声明。时间为自 1970 年(UTC)以来的秒数。

请输入用于签名令牌的密钥。

使用方法

  1. 选择 HS256、HS384 或 HS512。
  2. 编辑载荷声明,然后点击“设置 iat 和 exp”以添加当前时间和过期时间。
  3. 输入测试密钥,或生成一个随机的 256 位密钥。
  4. 复制已签名的令牌。要检查令牌,请切换到“验证签名”,粘贴令牌并输入密钥。

工作原理

JSON Web Token(RFC 7519)包含三个经过 Base64URL 编码的部分:头部(header)、包含声明(claims)的载荷(payload)和签名。使用 HMAC 算法 HS256、HS384 和 HS512 时,签名是使用共享密钥对“header.payload”计算的 HMAC(SHA-256、SHA-384 或 SHA-512)。任何持有该密钥的人都可以创建和验证令牌。

该工具将头部和载荷序列化为紧凑 JSON,进行编码,并使用浏览器内置的 Web Crypto API 中的 crypto.subtle 进行签名。头部中的 alg 字段始终与所选算法一致,typ 默认为 JWT,其余头部字段(例如 kid)会保留。“Set iat and exp”会将当前时间写入 iat(签发时间),并按所选的有效期写入 exp,两者均为自 1970 年 1 月 1 日 UTC 起的秒数。结果与其他 JWT 库一致;例如,会精确重现经典的 jwt.io 示例令牌。

密钥可以是纯文本(其 UTF-8 字节作为密钥),也可以是许多框架使用的 Base64/Base64URL 编码字节。随机密钥按钮会使用 crypto.getRandomValues 创建 32 个随机字节。对于 HS256,请使用至少 32 个随机字节;人为选择的短密钥可以通过任意令牌被离线猜测出来。

验证时会解码令牌,检查其是否使用 HMAC 算法,并使用 crypto.subtle.verify 重新计算签名。它还会显示 exp 或 nbf 表示令牌已过期或尚未生效的情况。不支持 RS256、ES256 及其他公钥算法,并且此处的验证不会检查你的应用可能需要的签发者(issuer)、受众(audience)或其他声明。

示例

在本地测试 API

你的开发服务器需要使用“dev-secret-change-me”签名的 HS256 令牌。将 sub 设置为测试用户 ID,点击“Set iat and exp”并选择 1 小时,输入密钥,然后在 Authorization: Bearer 请求头中发送该令牌。

检查令牌由哪个密钥签名

一个预发布环境的令牌被拒绝。将其粘贴到“验证签名”中并尝试预发布环境的密钥:“签名无效”表示该令牌是用不同的密钥签名的,或者密钥的格式不同(文本与 Base64)。

重现 jwt.io 示例

使用头部 {"alg":"HS256","typ":"JWT"}、载荷 {"sub":"1234567890","name":"John Doe","iat":1516239022} 和密钥 “your-256-bit-secret”,令牌以 SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c 结尾,与 jwt.io 上的相同。

常见问题

我的密钥会被发送到您的服务器吗?

不会。签名和验证在您的浏览器内使用 Web Crypto API 运行,密钥不会被存储或发送到任何地方。我们仍建议仅使用测试密钥,因为真实的签名密钥绝不应输入到网站中。

为什么密钥正确但签名无效?

检查密钥格式。有些系统使用密钥的文本形式,其他系统会先从 Base64 解码,从而得到不同的密钥字节。还要检查令牌未被更改,并且使用了相同的算法。

我可以创建 RS256 或 ES256 令牌吗?

此工具不支持。它仅支持共享密钥 HMAC 算法 HS256、HS384 和 HS512。

载荷是否加密?

不是。已签名的 JWT 仅经过编码;任何人都可以解码并读取载荷。签名仅证明它未被更改。请勿将密码或其他机密信息放入载荷中。

隐私

令牌仅在您的浏览器中使用 Web Crypto API 创建和验证。头部、载荷、令牌和密钥不会被上传、存储或包含在分析中。