KhaledSaeed18/jwt-toolkit

GitHub: KhaledSaeed18/jwt-toolkit

一款集 JWT 解码、签名、验证、安全审计、弱密钥破解和攻击变体伪造于一体的命令行工具包,帮助开发者全面诊断和加固令牌配置。

Stars: 3 | Forks: 0

# JWT 工具包

jwt-toolkit demo

PyPI Python versions CI Publish License: MIT Status

一个用于检查、验证、破解和保护 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安全, 密码学, 手动系统调用, 文档结构分析, 无后门, 蓝队分析, 逆向工具