JWT编码器(生成与签名)
根据Header和Payload的JSON,使用HS256、HS384或HS512生成HMAC签名的JWT(JSON Web Token),全部在浏览器内完成。包括密钥在内的输入内容不会发送到服务器。
支持的HMAC签名算法一览
| 算法 | 哈希函数 | 签名长度 | 说明 |
|---|---|---|---|
| HS256 | SHA-256 | 256位(32字节) | 使用最广泛的默认HMAC签名,是OAuth 2.0、OpenID Connect ID令牌等许多实现的标准选择。 |
| HS384 | SHA-384 | 384位(48字节) | 当需要比HS256更长的签名以提升安全余量时可选用的中间选项。 |
| HS512 | SHA-512 | 512位(64字节) | 签名长度最长,通常与足够长的随机密钥搭配使用。 |
生成并签署 JWT
本工具由标头与载荷的 JSON 当场组装出 JWT,并以 HS256、HS384 或 HS512 施加 HMAC 签名。包括密钥在内,您输入的一切都只在浏览器内处理,绝不送往服务器。
**这里最常被误解的一点是:签名是为了察觉篡改,而非加密。** JWT 的标头与载荷只是经过 Base64URL 编码,**因此凡是拿到令牌的人,都能把里头的内容照原样读出来。** 密码与个人资料不该放进载荷,正是这个缘故。另一个要点在于密钥的性质:HS 系列的做法是**签署的一方与验证的一方共用同一把密钥**。若想把验证交给别处,便该选 RS256 或 ES256 这类公钥方式,从而免去把密钥交出去。
生成的步骤
- 输入标头的 JSON 形如 `{"alg":"HS256","typ":"JWT"}`,请与所选的算法保持一致。
- 输入载荷的 JSON 写上所需的声明,如 `sub`、`iat`、`exp`。**凡是想保密的值,一概不要放进来。**
- 选择签名算法 可在 HS256、HS384、HS512 之间选择,数字即哈希的位长。
- 输入密钥取得令牌 得到的是以点连接三段的字符串。
用好本工具的小技巧
- 生成的JWT仅通过浏览器内的Web Crypto API签名,包含密钥在内的输入内容不会发送到toolbase.cc的服务器。
- 切换签名算法(HS256/HS384/HS512)会自动更新Header JSON中的
alg字段。若需添加kid等其他声明,可直接编辑Header。 - 本工具仅支持HMAC(对称密钥)方式。如需RS256、ES256等公钥方式的签名,请使用Node.js等服务器端的库。
- 编辑Header或Payload后,请务必再次点击"生成JWT",否则显示的仍是编辑前内容生成的旧JWT。
- 如需立即确认生成的JWT内容,可将其粘贴到姊妹工具JWT解码器中查看Header和Payload。
这些场景会用到
测试接口的行为
**能随手铸出带有任意声明的令牌,便可迅速把授权规则的各个分支都走一遍。**
检验有效期的处置
造一个 `exp` 落在过去的令牌,确认过期的令牌确实会被挡下。
为测试准备令牌
可产出内容固定的令牌,充作自动化测试里的夹具。
学习 JWT 的构造
一面改动输入一面生成,便能眼看着每一部分落到令牌的哪个位置。
JWT 的术语
- 标头
- 第一段,说明算法与类别,带有 `alg` 与 `typ`。
- 载荷
- 第二段,收纳各项声明。**它仅仅经过 Base64URL 编码,并未加密。**
- 签名
- 第三段,由标头与载荷连同密钥算出。**它用来察觉篡改,对隐藏内容则毫无作用。**
- 声明
- 载荷中的每一项。标准的有 `sub`(主体)、`iat`(签发时刻)、`exp`(有效期)等。
- HMAC
- 使用共享密钥的消息认证方式。**签署的一方与验证的一方必须持有同一把密钥。**
- Base64URL
- 把符号换过、以便放进网址的 Base64:`+` 与 `/` 换作 `-` 与 `_`,末尾的填充也略去。
常见问题
alg字段的值不一致,其他实现在验证该JWT时可能会报错,因此请务必保持两者一致。
闲话 ― 为什么JWT的签名可以「仅在浏览器内」完成
JWT的签名算法大致分为两类:发送方和接收方共享同一密钥的「对称密钥方式(HMAC,即HS256/HS384/HS512)」,以及用私钥签名、用公钥验证的「公钥加密方式(RS256、ES256等)」。前者可以借助W3C标准化的Web Crypto API(SubtleCrypto)中的crypto.subtle.sign(),无需任何外部库即可在浏览器内完成计算,因此本工具刻意只支持HMAC方式。
HMAC签名的安全性完全取决于密钥是否难以被猜到,而与Header或Payload的内容无关。RFC 7518(JSON Web Algorithms)建议HS256的密钥长度应至少为256位(32字节);若使用短单词或字典中常见的字符串作为密钥,签名就有被暴力破解伪造的风险。在实际生产环境中,应使用随机数生成器生成的足够长的随机字符串作为密钥。
本工具是面向开发者的实用工具,主要用于API开发时的调试或测试Webhook签名验证逻辑。您输入的密钥仅在浏览器内存中处理,不会向外部发送,但共享设备或浏览器扩展收集剪贴板或输入内容的风险并非为零。强烈建议即使只是为了调试,也不要将生产环境中实际使用的密钥输入此类工具。