onest4rk/password-toolkit
GitHub: onest4rk/password-toolkit
面向教育和审计的 Python 密码安全工具包,集成密码强度分析、哈希类型识别与离线字典破解功能。
Stars: 0 | Forks: 0
# 密码安全分析与破解工具
## 免责声明
**本工具仅用于教育、CTF 以及审计您自己的系统。** 它针对您提供的哈希值执行离线破解。它不会与任何实时登录表单、在线服务或您不拥有的系统进行交互。将其用于您不拥有的帐户是非法且不道德的。
## 为什么密码安全很重要
弱密码是数据泄露中的首要攻击媒介。当公司使用快速哈希(MD5、SHA-1)存储密码时,泄露数据库的攻击者可以在几分钟内破解数百万个密码。了解密码破解的工作原理对于构建安全系统至关重要——您需要知道自己要防御什么。
## 架构
```
password_toolkit/
├── password_toolkit/
│ ├── __init__.py
│ ├── hash_utils.py # Hash type identification
│ ├── strength_analyzer.py # Password strength analysis
│ ├── cracker.py # Dictionary + rule-based cracker
│ ├── wordlists/
│ │ ├── sample.txt # Small test wordlist
│ │ └── README.md # Instructions for downloading rockyou.txt
│ └── tests/
│ ├── test_hash_utils.py
│ ├── test_strength_analyzer.py
│ └── test_cracker.py
├── requirements.txt
└── README.md
```
### 模块职责
| 模块 | 用途 |
|--------|---------|
| `hash_utils.py` | 通过字符串格式(长度、字符集、前缀模式)识别哈希类型 |
| `strength_analyzer.py` | Shannon 熵、模式检测、破解时间估算、强度评分 |
| `cracker.py` | 基于字典的破解,支持变形规则和多进程 |
## 安装说明
```
# 克隆仓库
git clone
cd password_toolkit
# 创建虚拟环境
python -m venv venv
source venv/bin/activate # Linux/Mac
# venv\Scripts\activate # Windows
# 安装依赖
pip install -r requirements.txt
```
### 验证安装
```
# 运行测试
pytest password_toolkit/tests/ -v
# 测试 hash 识别
python -m password_toolkit.hash_utils "5d41402abc4b2a76b9719d911017c592"
# 测试 strength analyzer
python -m password_toolkit.strength_analyzer --password "MyP@ssw0rd!"
```
## 使用示例
### 1. 哈希识别
```
$ python -m password_toolkit.hash_utils "5d41402abc4b2a76b9719d911017c592"
Analyzing: 5d41402abc4b2a76b9719d911017c592
Length: 32 characters
Algorithm Confidence Reasoning
------------------------------------------------------------------------
MD5 high 32 hex characters. Input has 32 characters all hexadecimal matches MD5 length (32).
```
### 2. 密码强度分析
```
$ python -m password_toolkit.strength_analyzer --password "password123"
============================================================
PASSWORD STRENGTH ANALYSIS
============================================================
Password: *********** (11 chars)
Rating: WEAK
============================================================
Shannon Entropy: 2.85 bits
Combinatorial Entropy: 64.56 bits
Charset Size: 36 characters
ISSUES FOUND (2):
----------------------------------------------------
[!!!] This is one of the most commonly used passwords.
[ ! ] Contains sequential characters '123'.
CRACK TIME ESTIMATES:
----------------------------------------------------
Algorithm Rate Est. Time
----------------------------------------------------
MD5 10,000,000,000/s < 1 millisecond
bcrypt 30,000/s 340 days
RECOMMENDATION:
This password is in a common password list — it would be
cracked instantly. Use at least 12 characters for strong
protection. Against MD5: cracked in ~< 1 millisecond.
Against bcrypt: ~340 days.
```
### 3. 密码破解
```
# 生成测试 hash
$ python -c "import hashlib; print(hashlib.md5(b'password').hexdigest())"
5d41402abc4b2a76b9719d911017c592
# 破解它
$ python -m password_toolkit.cracker \
--hash 5d41402abc4b2a76b9719d911017c592 \
--type md5 \
--wordlist password_toolkit/wordlists/sample.txt
Target hash: 5d41402abc4b2a76b9719d911017c592
Algorithm: MD5
Wordlist: password_toolkit/wordlists/sample.txt (30 words)
Workers: 8
Rules: 9 rule sets applied per word
────────────────────────────────────────────────────
Cracking...
FOUND! Password: password
Stats:
Words tested: 30
Hashes checked: ~300 (with rules)
Time elapsed: 0.02s
Speed: 1,500 words/sec
```
## 概念说明
### 哈希 vs 加密
- **哈希** 是一种单向函数:输入 → 固定大小的输出。您无法将其逆转。`sha256("hello")` → `2cf24dba...` 是永久且不可逆的。
- **加密** 是双向的:您可以使用密钥进行加密和解密。`AES(plaintext, key)` → ciphertext → `AES_decrypt(ciphertext, key)` → plaintext。
密码应该被**哈希处理**,永远不要加密。如果攻击者窃取了数据库,他们不应该能够恢复原始密码。
### 什么是 Salt?
**Salt** 是在哈希之前添加到密码中的随机数据:
```
hash = SHA256(salt + password)
```
如果没有 salt,每个使用密码 "password" 的用户都会得到相同的哈希值。攻击者可以预先计算常见哈希的“彩虹表”。Salt 迫使攻击者单独破解每个用户。
现代系统(bcrypt、Argon2)会自动处理 salt。
### 为什么 bcrypt/Argon2 > MD5/SHA1
| 算法 | 速度 (GPU) | 类型 | 为什么重要 |
|-----------|------------|------|----------------|
| MD5 | ~100 亿/秒 | 快速哈希 | 攻击者每秒可以尝试 100 亿个密码 |
| SHA-256 | ~30 亿/秒 | 快速哈希 | 仍然太快 |
| bcrypt | ~3 万/秒 | 慢速哈希 | 比 MD5 慢 30 万倍 |
| Argon2id | ~1 千/秒 | 内存密集型 | 旨在抵御 GPU/ASIC 攻击 |
**关键洞察**:“快速”的哈希是一种*糟糕的*密码哈希。MD5 的速度是用于校验文件的一个特性,但对密码来说却是一个漏洞。bcrypt 和 Argon2 有意设计得缓慢且消耗大量内存,使得暴力破解攻击变得不切实际。
### 什么是熵?
熵以位为单位衡量密码的**不可预测性**。
- 每一位熵都会使攻击者必须搜索的密钥空间翻倍。
- **Shannon 熵**:根据字符频率衡量信息内容。
- **组合熵**:`log2(charset_size ^ length)` —— 假设从字符集中进行随机选择。
一个具有 80 位熵的密码需要约 2^80 次操作才能暴力破解——这在计算上是不可行的。
| 熵 | 强度 | 暴力破解时间 (100 亿哈希/秒) |
|---------|----------|-------------------------------|
| 28 位 | 弱 | 0.004 秒 |
| 40 位 | 一般 | 10 秒 |
| 60 位 | 强 | 3 年 |
| 80 位 | 非常强 | 190 亿年 |
| 128 位 | 极致 | 10^23 年 |
## 性能基准
在现代 CPU(Ryzen 7 / 同等 i7,8 核)上测试:
| 字典 | 词数 | 规则 | 哈希数 | MD5 耗时 | 速度 |
|----------|-------|-------|--------|----------|-------|
| sample.txt | 30 | 9 | ~300 | <0.01s | ~1,500 词/秒 |
| 10k-most-common | 10,000 | 9 | ~90K | 0.06s | ~1.5M 词/秒 |
| rockyou.txt (14M) | 14M | 9 | ~126M | 85s | ~1.7M 词/秒 |
*注意:使用 GPU(RTX 3080)的真实 hashcat:~100 亿 MD5 哈希/秒。此 Python 工具用于学习——hashcat 用于生产环境的破解。*
### MD5 与 bcrypt 破解速度对比
| 密码 | 字符集 | 密钥空间 | MD5 | bcrypt | 比率 |
|----------|---------|----------|-----|--------|-------|
| 6 字符小写 | 26 | 308M | 0.03s | 2.8 年 | 慢 3T 倍 |
| 8 字符混合 | 62 | 218T | 5.4 年 | 2.3M 年 | 慢 430K 倍 |
| 10 字符混合 | 62 | 839P | 2,100 年 | 890M 年 | 慢 420K 倍 |
## 未来改进
- **GPU 加速**:通过子进程集成 hashcat 以实现生产级破解速度
- **Argon2/bcrypt 破解**:增加对验证 bcrypt/argon2 哈希的支持(设计上很慢)
- **Web UI**:用于交互式分析的 Flask/Streamlit 界面
- **规则引擎**:实现兼容 Hashcat 的规则文件(.rule 格式)
- **彩虹表检测**:当哈希出现在已知的泄露数据库中时发出警告
- **在线检查器集成**:查询 Have I Been Pwned API 以检查哈希是否出现在已知的泄露中
- **GUI 应用程序**:带有拖放哈希输入功能的 Tkinter/PyQt 桌面应用
- **批处理模式**:通过共享字典缓存同时破解多个哈希
## 运行测试
```
pytest password_toolkit/tests/ -v
# 带 coverage
pytest password_toolkit/tests/ --cov=password_toolkit --cov-report=term-missing
```
## 许可证
MIT —— 请负责任地使用。仅针对您拥有或获得明确破解许可的密码和哈希进行测试。
标签:DOS头擦除, VEH, 哈希识别, 字典攻击, 安全规则引擎, 密码分析, 密码强度检测, 密码破解, 逆向工具