piapia123
zh

JWT 签发

编码

所有处理都在浏览器本地完成,数据不上传服务器

输入
把文件拖到这里可直接载入
输出

这个工具补上了「只有解析、没有签发」缺的那一半。填载荷、选算法、给密钥,得到可以拿去用的 JWT。 ⚠️ 密钥写在正文里,不在选项里,因为 PEM 必然有多行,而单行输入框放不下: ``` { "sub": "1234567890" } --- -----BEGIN PRIVATE KEY----- ... -----END PRIVATE KEY----- ``` 一行只有 `---` 的分隔线之后是密钥。没有分隔线时整段都当载荷 —— 而 HS* 的密钥可以走选项里那个单行输入框(base64 密钥本来就短)。 ⚠️ 关于把生产的签名私钥贴进网页:这里全部在本地完成,不上传也不存储 —— 但仍然不建议把生产私钥贴进任何网页(包括这一个)。理由不是你该怀疑这个页面,而是你没法审计一个网页的代码是不是真只做了它说的事,而你自己的脚本可以。签测试用令牌很方便;真要签发生产令牌,用你机器上跑得起来的命令。这条提醒在结果的最上面。 ⚠️ 私钥只吃 PKCS#8 格式(`-----BEGIN PRIVATE KEY-----`)。`BEGIN RSA PRIVATE KEY`(PKCS#1)与 `BEGIN EC PRIVATE KEY`(SEC1)都会被认出来并给出 `openssl` 转换命令 —— 直接把它们的 base64 丢给浏览器加密接口不会报「格式不对」,而是抛一个语焉不详的错误。

功能

  • 13 种算法:HS256/384/512、RS256/384/512、PS256/384/512、ES256/384/512、EdDSA
  • ⚠️ 「别把生产私钥贴进网页」的提醒放在结果最前面,不藏进 FAQ
  • ⚠️ 没有 `exp` 时明确说这个令牌永久有效 —— 忘了它等于签了一个不会失效的凭证
  • 自动补 `iat` 与 `exp`(`iat` 只在你没写的时候补,免得覆盖你想构造的时间)
  • 有效期可选 5 分钟到 1 年,也可以不设、自己在载荷里写
  • ⚠️ 私钥只认 PKCS#8;PKCS#1 与 SEC1 会被认出来并给出 `openssl pkcs8 -topk8` 转换命令
  • ⚠️ ES512 用的是 P-521 曲线(不是「P-512」—— 那个不存在)
  • ⚠️ ES* 的签名按 JWS 规定输出定长 r‖s,不是 ECDSA 常见的 DER 编码
  • ⚠️ PS* 的盐长度按 JOSE 规定取哈希长度,而不是浏览器接口的默认值
  • 载荷与头部的结果都能整段复制
  • 全部在浏览器本地完成,密钥不上传

使用方法

  1. 在正文里写载荷 JSON(要私钥的话,下一行写 `---`,再贴 PEM)
  2. 选算法;HS* 的密钥可以直接填在选项里
  3. 选有效期,结果给出 JWT、头部、载荷与签名

常见问题

为什么提醒我别在这里签生产令牌?
因为这是一个网页,你没法审计它是不是真只做了它说的事 —— 而你自己的脚本可以。这个页面确实全部在本地完成、不上传也不存储,但「相信我的话」和「自己看到代码」是两回事,尤其当贴进来的是一把生产签名私钥。签测试令牌、调接口时临时造一个,用这里很方便;真要签发生产令牌,用你自己机器上跑得起来的命令或库。
为什么密钥要写在正文里而不是选项里?
因为 PEM 格式的私钥必然有多行(头、base64 正文、尾),而通用外壳的「文本」选项渲染成的是一个单行输入框,物理上放不下。所以约定用一行 `---` 作为分隔线:上面是载荷,下面是密钥。HS* 的密钥是单行的 base64,可以直接填在选项里,两条路都通。
为什么我的 RSA 私钥被拒绝了?
多半是格式问题。浏览器加密接口只接受 PKCS#8(`-----BEGIN PRIVATE KEY-----`),而很多工具导出的是 PKCS#1(`-----BEGIN RSA PRIVATE KEY-----`),EC 密钥还有一种是 SEC1(`-----BEGIN EC PRIVATE KEY-----`)。三者都是 PEM、看起来几乎一样,但内部结构不同。把 PKCS#1 的 base64 直接喂进去,接口不会说「格式不对」,而是抛一个看不出原因的错。所以这里先把它们认出来,并给出 `openssl pkcs8 -topk8 -nocrypt -in old.pem -out new.pem`。
签出来的令牌怎么验证?
HS* 用同一把密钥算一次 HMAC 比对即可;RS / PS / ES / EdDSA 要把公钥给验证方(这也是非对称算法的意义 —— 验证方不需要持有能签发的密钥)。注意 ES* 的签名在 JWS 里是定长的 r‖s 而不是 DER,有些库需要显式指定这个编码,否则会验签失败而看不出原因。
没有 exp 会怎样?
绝大多数验证库把没有 `exp` 的令牌当作永久有效。这不是规范上的漏洞,而是规范本来就这样:`exp` 是可选的,不写就是没有过期时间。所以签发时忘了它,等于签发了一个永远不会失效的凭证 —— 而它看起来和正常的令牌一模一样。这个工具会在结果里明确提醒。

相关工具