KhaledSaeed18/jwt-toolkit
GitHub: KhaledSaeed18/jwt-toolkit
一款集 JWT 解码、签名、验证、安全审计、弱密钥破解和攻击变体伪造于一体的命令行工具包,帮助开发者全面诊断和加固令牌配置。
Stars: 3 | Forks: 0
# JWT 工具包
一个用于检查、验证、破解和保护 JSON Web Token 的命令行工具包。旨在揭示 JWT 签名的工作原理及其安全漏洞。
可用于审计 token 的配置错误,验证签名和标准声明(包括 JWKS),利用字典暴力破解弱 HMAC 密钥,伪造用于自我审计的防御性攻击变体,以及生成具有高加密强度的密钥。
## 安装说明
`jwt-toolkit` 是一个命令行工具,因此推荐的安装方式是使用 [pipx](https://pipx.pypa.io),它会将 CLI 工具安装到独立的环境中:
```
pipx install jwt-toolkit
```
或者使用 pip / uv:
```
pip install jwt-toolkit
# 或
uv tool install jwt-toolkit
```
要求 Python 3.13+。
## 快速开始
```
# Decode 并美化打印 token
jwt-toolkit decode
# 静态安全审计(无需密钥)标记 alg=none、弱 HMAC、jwk-in-header 等
jwt-toolkit audit
jwt-toolkit audit --strict --json
# 验证 signature 和标准 claims(exp, nbf, iat, iss, aud)
jwt-toolkit verify --secret --issuer auth.example.com
jwt-toolkit verify --jwks-url https://auth.example.com/.well-known/jwks.json
# 生成 JWT(HMAC 或非对称)
jwt-toolkit sign --payload '{"sub":"1"}' --secret mysecret
# 生成 token 的防御性攻击形态变体(alg=none, alg 混淆等)
jwt-toolkit forge --public-key key.pub.pem
# 基于 wordlist 暴力破解弱 HMAC secret
jwt-toolkit crack wordlists/common-secrets.txt --threads 8
# 生成强随机 secret
jwt-toolkit generate-secret --bits 256 --encoding base64
# 获取内置的 common-secrets wordlist
jwt-toolkit download-wordlists --output-dir wordlists
```
运行 `jwt-toolkit COMMAND --help` 以查看特定命令的选项。
## 命令
| 命令 | 用途 |
| -------------------- | ------------------------------------------------------------------------------ |
| `decode` | 解码 JWT 并美观打印其 header 和 payload。 |
| `sign` | 生成使用 HMAC 密钥或非对称密钥签名的新 JWT。 |
| `audit` | 对 JWT 进行静态安全分析,无需密钥。提供引用 CVE 的分析结果。 |
| `verify` | 验证 JWT 的签名和标准声明(支持 JWKS)。 |
| `forge` | 生成 JWT 的防御性攻击变体以进行自我审计。 |
| `crack` | 使用字典暴力破解弱 HMAC 密钥。 |
| `generate-secret` | 生成具有高加密强度的随机密钥。 |
| `download-wordlists` | 获取最新的通用密钥字典。 |
## 示例
以下是一些输出结果的展示。此处的 token 均为一次性测试 token,切勿在生产环境中使用这些密钥。
### 签名 token
输入:
```
jwt-toolkit sign \
--payload '{"sub":"alice","role":"admin","iat":1700000000}' \
--secret mysecret123
```
输出:
```
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhbGljZSIsInJvbGUiOiJhZG1pbiIsImlhdCI6MTcwMDAwMDAwMH0.cPIGduvFlZtf6Xa3HFDkf8sV7v_8O5fn7_vW7-D1_0c
```
### 解码 token
输入:
```
jwt-toolkit decode eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhbGljZSIsInJvbGUiOiJhZG1pbiIsImlhdCI6MTcwMDAwMDAwMH0.cPIGduvFlZtf6Xa3HFDkf8sV7v_8O5fn7_vW7-D1_0c
```
输出:
```
╭─────────────────── Header ────────────────────╮
│ { │
│ "alg": "HS256", │
│ "typ": "JWT" │
│ } │
╰───────────────────────────────────────────────╯
╭─────────────────── Payload ───────────────────╮
│ { │
│ "sub": "alice", │
│ "role": "admin", │
│ "iat": 1700000000 │
│ } │
╰───────────────────────────────────────────────╯
╭────────────────── Signature ──────────────────╮
│ cPIGduvFlZtf6Xa3HFDkf8sV7v_8O5fn7_vW7-D1_0c │
╰───────────────────────────────────────────────╯
```
### 审计 token
输入:
```
jwt-toolkit audit
```
输出:
```
╭────────────── Security Verdict ──────────────╮
│ Verdict : WEAK │
│ Grade : B │
│ │
│ CRITICAL : 0 WARN : 2 INFO : 3 PASS : 2│
╰──────────────────────────────────────────────╯
Findings
┏━━━━━━━━━━┳───────┳────────────────────┳──────────────────────┓
┃ Severity ┃ Field ┃ Detail ┃ Recommendation ┃
┡━━━━━━━━━━╇───────╇────────────────────╇──────────────────────┩
│ WARN │ alg │ HS256 is symmetric │ Use a strong secret │
│ WARN │ exp │ No exp claim │ Always set exp │
│ INFO │ aud │ Missing aud claim │ │
│ INFO │ iss │ Missing iss claim │ │
│ INFO │ jti │ No jti claim │ Issue a unique jti │
│ PASS │ iat │ iat looks sane │ │
│ PASS │ typ │ typ=JWT │ │
└──────────┴───────┴────────────────────┴──────────────────────┘
```
添加 `--json` 以获取机器可读的输出,添加 `--strict` 以在出现警告时报错。
### 验证 token
输入:
```
jwt-toolkit verify --secret mysecret123
```
输出:
```
Verification Checks
┏━━━━━━━━┳───────────┳────────────────────┓
┃ Result ┃ Check ┃ Detail ┃
┡━━━━━━━━╇───────────╇────────────────────┩
│ PASS │ signature │ Signature is valid │
│ WARN │ exp │ No expiry claim │
└────────┴───────────┴────────────────────┘
╭──────────────────────────────────────────╮
│ VALID │
╰──────────────────────────────────────────╯
```
### 生成强密钥
输入:
```
jwt-toolkit generate-secret --bits 256 --encoding base64
```
输出:
```
╭──────────────── Generated Secret ────────────────╮
│ HTZhdhvS6GPEKeziu3Ey5d6NVf8da9mjjfQTFQD99o8= │
│ │
│ Encoding : base64 │
│ Length : 256 bits (32 bytes) │
│ Entropy : 256 bits, strong │
╰──────────────────────────────────────────────────╯
```
### 破解弱密钥
输入:
```
jwt-toolkit crack wordlists/common-secrets.txt --threads 8
```
输出:
```
╭──────────── Weak Secret Detected ────────────╮
│ Secret: mysecret123 │
│ │
│ Algorithm : HS256 │
│ Position : #1 of ~3 candidates │
│ Candidates tried : 1 │
│ Time elapsed : 0.001s │
│ │
│ This secret is in a common wordlist. │
│ Generate a strong one with: │
│ jwt-toolkit generate-secret │
╰──────────────────────────────────────────────╯
```
## 脚本化
屏蔽 banner 和颜色输出,以实现干净的机器可读运行:
```
jwt-toolkit --quiet audit --json
JWT_TOOLKIT_QUIET=1 NO_COLOR=1 jwt-toolkit audit --json
```
## 负责任地使用
`jwt-toolkit` 专为防御性工作而构建:审计您自己的 token、加固您自己的系统,以及学习 JWT 是如何被破解的。请仅对您获得授权测试的 token 和系统使用此工具。
## 贡献
欢迎您的贡献。请参阅 [CONTRIBUTING.md](https://github.com/KhaledSaeed18/jwt-toolkit/blob/main/CONTRIBUTING.md) 了解代码库结构、开发环境设置、分支和提交规范,以及 pull-request 工作流程。
## 许可证
[MIT](https://github.com/KhaledSaeed18/jwt-toolkit/blob/main/LICENSE) © Khaled Saeed
标签:Blue Team, JWT, Python, StruQ, Web安全, 密码学, 手动系统调用, 文档结构分析, 无后门, 蓝队分析, 逆向工具
