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, 安全规则引擎, 密码强度检测, 密码生成, 无后门, 逆向工具