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 规定取哈希长度,而不是浏览器接口的默认值
- 载荷与头部的结果都能整段复制
- 全部在浏览器本地完成,密钥不上传
使用方法
- 在正文里写载荷 JSON(要私钥的话,下一行写 `---`,再贴 PEM)
- 选算法;HS* 的密钥可以直接填在选项里
- 选有效期,结果给出 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` 是可选的,不写就是没有过期时间。所以签发时忘了它,等于签发了一个永远不会失效的凭证 —— 而它看起来和正常的令牌一模一样。这个工具会在结果里明确提醒。
相关工具
JWT 解析与验签
编码把 JWT 拆成 header、payload、signature,支持用密钥验证 HS256/384/512 签名,并把 exp、nbf 换算成可读时间。全部在浏览器本地完成。
哈希计算
编码算出文本的 MD5、SHA-1、SHA-256 或 SHA-512 摘要,也可算老系统用的 MD4 与 MD2,中文按 UTF-8 字节计算。全部在本地完成。
HMAC 签名
编码用密钥与消息算出 HMAC 签名,含空格与中文的密钥也能与 Node、Java、Python 算出一致结果。密钥只在本机参与运算,不会发出去。
Base64 编解码
编码把文本转成 Base64,或把 Base64 还原成文本,中文与 emoji 都按 UTF-8 正确处理。全部在浏览器本地完成,内容不上传。
URL 编解码
编码把中文、空格与符号转义成 %XX,或把 %XX 还原成文本;整条 URL 与单独的参数值要选对方式,选错不会报错,但链接会打不开。全部在浏览器本地完成。
HTML 实体编解码
编码把 < > & 与引号转成 HTML 实体,也能把实体还原成字符,而且只解一遍:&lt; 得到的是 < 而不是尖括号。全部在浏览器本地完成。