← 返回工具箱

JWT / HMAC LAB

JWT 签名 / 验证工具

用浏览器 Web Crypto 生成或验证 HMAC JWS。页面只支持 HS256、HS384、HS512,并要求你主动选择预期算法;验签不会直接照抄 Token Header 里的 alg。

只放测试密钥:本页不上传输入,但生产 Secret 仍不该进入普通网页、截图、工单或聊天记录。正式服务端还要验证 issuer、audience、权限、密钥轮换与撤销状态。

密钥长度

304 bit

建议至少 256 bit

生成结果

填写 Header、Payload 和测试 Secret,再点击生成。

VERIFY IN CONTEXT

签名正确之后,检查才刚开始

固定允许算法

验签方必须预先配置允许算法。页面因此用下拉框固定预期算法,Header 不一致就直接拒绝。

检查 iss 与 aud

一个由正确密钥签出的 Token,也可能来自错误发行方或发给另一个服务。Issuer 与 Audience 要精确匹配。

权限和撤销另算

角色、Scope、用户状态、jti 撤销名单和密钥轮换属于业务授权,HMAC 验签本身不会替你完成。

RELATED TOOLS

查看全部工具 →

USE & REVIEW

JWT 签名 / 验证工具常见问题

查看全部工具指南 →

为什么验签时还要手动选择预期算法?

安全实现应由应用配置决定允许算法,不能直接信任不可信 Token Header 里的 alg。页面会把下拉框选中的 HS256、HS384 或 HS512 作为预期算法,Header 不一致就拒绝,而不是自动切换。这能直观避免算法混淆类错误,但生产服务仍应使用经过审计的 JWT 库。

HS256、HS384 和 HS512 与 RS256 有什么区别?

HS 系列使用同一个共享 Secret 完成签名与验证,适合可信服务之间的 HMAC 场景;RS256、ES256 等使用私钥签名、公钥验证,更适合需要分离签发方与验证方的体系。当前页面只实现 HS256、HS384、HS512,不会把 RSA、EC 或 JWE 混进同一个简化界面。

UTF-8、Hex、Base64 和 Base64URL Secret 应怎样选?

选择必须和上游系统对密钥字节的解释完全一致。UTF-8 把输入当普通文本;Hex 每两个字符表示一个字节;Base64 和 Base64URL 先解码为字节再用于 HMAC。同样看起来像“c2VjcmV0”的文字,按 UTF-8 与按 Base64 得到的密钥完全不同,签名自然不会一致。

页面提示 Secret 太短,为什么仍允许生成?

这是调试工具,短 Secret 有助于复现实例,因此页面给出明确警告而不是强行禁止。正式 HMAC 密钥应由安全随机源生成,长度至少覆盖对应 Hash 输出,并在密钥管理系统中轮换;人类可记忆短语、仓库环境文件和前端源码都不是合适的生产存放位置。

签名有效是否代表 JWT 可以登录或拥有权限?

不代表。签名有效只说明 Header 和 Payload 与当前密钥、算法匹配,内容未在签名后被改动。服务端还必须精确检查 iss、aud、exp、nbf、jti、Scope 或角色,并确认用户和密钥没有被撤销。页面的时间提示也只是辅助,不是完整授权结论。

Secret、Payload 和生成的 JWT 会发送到服务器吗?

不会。JSON 编码、HMAC 签名和 SubtleCrypto.verify 都在当前浏览器执行,下载文件也由浏览器本地生成。即便如此,也不要输入仍在使用的生产 Secret;浏览器扩展、屏幕共享、剪贴板历史和下载目录都可能让敏感值离开当前页面。