Kxrium/Cryptography-Auditor
GitHub: Kxrium/Cryptography-Auditor
检测代码库中以弱可逆编码冒充加密的密钥以及存在 git 泄露风险的敏感文件的安全审计工具。
Stars: 0 | Forks: 0
# 弱加密 / 混淆审计工具
这是一个安全审计工具,用于扫描代码库或配置目录以检测两类问题:仅通过弱、可逆混淆(Caesar cipher/ROT13、Base64、Base32、Hex、URL 编码、字符串反转、单字节 XOR)“保护”的凭据,而非使用真正的加密;以及存在通过 git 泄露风险的敏感文件。这两者都是有文档记录的反模式 —— 开发者将简单的编码误认为是安全措施,以及密钥意外流入版本控制系统中。
## 问题所在
一些代码库使用自制的方案(如 ROT13 或固定的字母移位)来混淆密钥,认为这样能提供一定的保护。但事实并非如此 —— 这些方案可以在几毫秒内被逆向还原,并且会提供虚假的安全感。这可以说比直接以明文存储密钥还要糟糕(因为它可能会在表面的代码审查中蒙混过关)。
## 工作原理
该工具执行两项独立的检查:
**1. 弱混淆检测**
1. **扫描** (`scanner.py`) —— 遍历目录,在配置文件和源代码文件中查找类似于密钥赋值的行(如 `PASSWORD=`、`API_KEY:` 等)。
2. **检测** (`detector.py` + `transforms.py`) —— 对于每个候选值,尝试所有支持的解码方式(Caesar/ROT13、Base64、Base32、Hex、URL 编码、反转字符串、单字节 XOR 暴力破解),并检查是否有任何结果能从常见的弱密钥词汇列表(如 `password`、`admin`、`secret` 等)中揭示出一个真实、有意义的单词。短的随机字符串不可能碰巧产生真实的单词 —— 但真正经过混淆的密钥却能。
**2. Git 暴露检查**
`git_hygiene.py` 会检查敏感文件(如 `.env`、`*.pem`、`*.key` 等)是否已经被提交到 git 历史记录中(严重 —— 必须视为已泄露并将其从历史记录中彻底清除),或者是未跟踪但未被 `.gitignore` 覆盖的文件(高 —— 在下一次执行 `git add .` 时就会泄露)。该检查独立于上述的解码检查,回答的是完全不同的问题:不是“这个密钥是否被弱隐藏了”,而是“这个文件是否会通过版本控制完全泄露”。如果被扫描的目录不是 git 仓库,则会自动跳过此检查。
**3. 报告** (`report.py`) —— 生成一份 Markdown 报告,结合了这两项检查的结果,包含脱敏后的值、严重性评级以及适合非技术人员阅读的修复指导。
### 为什么在解码检查中不使用频率分析?
该项目的一个早期版本使用卡方字母频率分析来破解 Caesar 密码,这种方法对完整的句子效果很好,但对于短字符串(6-20 个字符)则不可靠 —— 因为数据量不足以让频率统计具有实际意义。由于密钥通常较短,因此该工具改为检查已知单词的匹配情况,这在相应的长度下是一个强得多的信号。
## 用法
```
python main.py --output audit_report.md
```
针对内置测试固件的示例:
```
python main.py test_files --output audit_report.md
```
### 示例输出
```
Scanned 'test_files' - found 7 candidate secret(s) to analyze.
⚠ 4 weakly-obfuscated secret(s) found:
[High] test_files/.env:4 -> key 'DB_PASSWORD' decodes to something matching 'password' (method: ROT13)
[High] test_files/.env:5 -> key 'API_SECRET_KEY' decodes to something matching 'secret' (method: Caesar shift (3))
[High] test_files/.env:6 -> key 'ADMIN_TOKEN' decodes to something matching 'admin' (method: Caesar shift (7))
[High] test_files/config.py:3 -> key 'PASSWORD' decodes to something matching 'password' (method: ROT13)
✓ No git exposure risks detected (or not a git repository).
Full report written to: audit_report.md
```
生成的 `audit_report.md` 包含了脱敏的值、使用的确切解码方法以及针对每个发现的修复指导 —— 请参阅 [`test_files/`](test_files) 以查看生成此输出的固件,并亲自运行该工具以查看完整的 Markdown 报告。
## 项目结构
```
crack_utils.py # Caesar shift encrypt/decrypt primitives
transforms.py # All decoding attempts: Base64/32, Hex, URL, reversal, XOR brute force
scanner.py # Finds candidate secret assignments in files
detector.py # Runs transforms and checks results against the weak-word list
git_hygiene.py # Checks whether sensitive files are tracked/untracked/gitignored
report.py # Generates the Markdown audit report
main.py # CLI entry point, ties everything together
test_files/ # Sample vulnerable + clean config files for testing
```
## 限制 / 范围
这是一个用于演示检测逻辑的概念验证,而不是一个可用于生产环境的密钥扫描器。在真实场景中,应搭配或直接使用 `gitleaks` 或 GitHub 原生的 secret scanning(它们能检测更广泛的凭据格式,而不仅仅是移位替换)等工具来替代此工具。本项目专门针对“以弱混淆冒充加密”这一反模式,以及基本的 git 暴露防范。
在开发过程中针对真实项目进行测试时发现的已知缺口:
- **由多个片段组成的值**(字符串拼接、`"".join([...])`、`chr()` 序列)无法被还原 —— 该工具仅检查单个字符串字面量。要还原这些内容,需要解析源代码结构(例如 Python 的 `ast` 模块),而不是进行模式匹配,这属于一个截然不同且更庞大的功能。
- **单行上的多键 JSON/YAML**(例如压缩后的 JSON)未被完全解析 —— 扫描器是基于行的,并且只检查每行中第一个匹配的键。
- **键名匹配特意设计得比较严格**(如 `api_key`、`db_password` 等),不会捕获泛型使用的裸 `key` 或 `secret_value`,以避免在不相关的字段(如 `foreign_key`)上发生误报。
## 道德使用
此工具旨在用于扫描您拥有或已获得明确授权审计的代码库(例如您自己的项目,或作为授权的内部安全审查的一部分)。
## 许可证
MIT —— 请参阅 [LICENSE](LICENSE)。
标签:StruQ, 代码安全, 弱加密检测, 文档结构分析, 机密泄露, 漏洞枚举, 逆向工具