bastian-red/passtools
GitHub: bastian-red/passtools
一款密码强度验证与安全生成工具,结合熵估算、模式检测和泄露检查,同时提供 CLI 和 Flask Web 界面。
Stars: 1 | Forks: 0
# PassTools
密码强度验证器和安全生成器。它能评估密码的强度(熵、常见模式、泄露暴露情况),并生成强密码和 passphrase。同时提供了一个命令行工具和一个小型 Flask Web 界面,两者共享同一个核心库。
## 范围与法律声明
本项目**仅供教育目的**使用,包括防御和攻击演示。请仅在您自己的密码、机器或受控的实验环境中使用。不提供任何担保。
密码**仅在内存中**处理。它们永远不会被记录或持久化。泄露检查使用 Have I Been Pwned 的 k-anonymity 模型:网络上仅会发送密码 SHA-1 哈希值的前 5 个字符,绝不发送密码本身或其完整哈希值。
## 功能
- **强度分析**,结合了透明的字符集熵估算与 [`zxcvbn`](https://github.com/dropbox/zxcvbn)(基于研究的猜测估算和模式检测:字典词、序列、重复、日期、键盘路径、l33t 替换)。
- **泄露检查**,针对 Have I Been Pwned 的 Pwned Passwords range API(k-anonymity,无密钥),支持离线禁用选项,并在网络不可用时平滑降级。
- **安全生成**密码和 Diceware 风格的 passphrase,使用 `secrets` CSPRNG(无 modulo 偏差),具有可配置的字符类、保证类覆盖,以及避免视觉上容易混淆的字符的选项。
- **两种界面**:一个 `argparse` CLI 和一个 Flask 单页 Web 应用,提供实时强度计、生成器和复制到剪贴板功能。
## 架构
```
passtools/
analyzer.py # entropy + zxcvbn -> AnalysisResult (pure, offline)
generator.py # secrets-based password & passphrase generation
hibp.py # Have I Been Pwned k-anonymity client
wordlist.py # loads the bundled EFF passphrase wordlist
data/ # eff_wordlist.txt (7776-word EFF large list)
cli.py # `passtools` entry point: check / generate
web/ # Flask app factory, JSON API, single-page UI
tests/ # pytest suite (network mocked)
```
分析核心被特意设计为纯函数且完全离线,因此可以完全进行单元测试;CLI 和 Web 层会在其之上附加可选的 HIBP 泄露计数。
## 安装
要求 Python 3.10+。
```
python -m venv .venv
source .venv/bin/activate
pip install -r requirements-dev.txt -e .
```
## CLI 用法
```
# 生成(默认值:16个字符,包含所有字符类别,保证每种字符至少包含一个)
passtools generate
passtools generate --length 24 --count 3 --show-strength
passtools generate --avoid-ambiguous --no-symbols
# 生成一个 passphrase
passtools generate --passphrase --words 6 --capitalize --add-number
# 检查密码。省略参数将以安全方式提示输入(无回显);
# 内联传递可能会通过 shell 历史记录泄露。
passtools check
passtools check --stdin < secret.txt
passtools check 'correct horse battery staple' --no-hibp
passtools check 'hunter2' --json
```
当密码较弱(zxcvbn 得分 < 3)或发现泄露时,`check` 会以非零状态退出,这使其可用作脚本或 CI 中的检查守护。
## Web 用法
```
flask --app passtools.web:app run
# 打开 http://127.0.0.1:5000
```
该页面提供了一个实时强度计、可选的泄露检查开关,以及一个用于生成密码和 passphrase 的生成器。
### JSON API
| 方法 | 路径 | 请求体 | 响应 |
| ------ | -------------- | --------------------------------------------- | --------------------------------- |
| POST | `/api/analyze` | `{"password": str, "check_hibp": bool}` | 分析结果(+ `pwned_count`) |
| POST | `/api/generate`| `{"length", "count", "passphrase", ...}` | `{"results": [...]}` |
## 测试
```
pytest
```
测试套件(38 个测试)涵盖了熵/得分边界、模式检测、生成器类保证和错误情况,以及通过模拟网络测试的 HIBP 客户端(命中、未命中、填充行、网络/HTTP 错误、仅传输前缀),还有通过 Flask 测试客户端进行的 Web 端点测试。
## 项目展示
基础的密码学知识(SHA-1 哈希、熵估算、CSPRNG 生成)、保护隐私的 API 消费(k-anonymity),以及安全最佳实践(无密码持久化/记录、安全的 CLI 输入、平滑降级)。
## 致谢
- Passphrase 词表:[EFF 大型词表](https://www.eff.org/dice)。
- 强度估算:[`zxcvbn`](https://github.com/dropbox/zxcvbn)。
- 泄露数据:[Have I Been Pwned](https://haveibeenpwned.com/)。
标签:Flask, Python, 安全规则引擎, 密码强度检测, 密码生成, 无后门, 逆向工具