edyatl/passchek
GitHub: edyatl/passchek
一个专注于安全检查密码是否泄露的轻量级 CLI 工具,利用 k-匿名性协议在本地完成比对。
Stars: 7 | Forks: 0
# Passchek
[](https://github.com/edyatl/passchek)
[](https://www.python.org/)
[](LICENSE)
Passchek 安全地检查密码是否已被泄露,而无需在网络上传输完整密码或完整的 SHA-1 哈希值。
该项目被刻意设计为用户可以快速自行审核完整源代码。由于涉及真实密码和用户信任,实现遵循严格的工程原则:
## 设计原则
1. **简洁**
代码在保持可读性的同时尽可能简短。无不必要的层级、抽象或冗余代码。
2. **清晰**
新手 Python 开发者应能在一分钟内理解整个程序。结构故意简单,符合 PEP 8,且易于理解。
3. **精简**
每个函数、导入和常量都必须有其存在的理由。任何非必要的内容都会被移除。
4. **可嵌入性**
核心泄露检查逻辑可以作为小型可导入函数轻松复用,适用于 CI/CD、脚本、Web 后端或其他自动化。
5. **专业适用性**
代码库遵循生产级工程期望:清晰的流程控制、最小副作用、强类型、可预测行为、健壮的错误处理和惯用的 Python 用法。
6. **安全性**
通过隐藏提示输入、减少明文副本、无日志记录、无不必要 I/O、本地后缀匹配和谨慎的哈希流程,最小化密码暴露风险。
7. **独立性**
Passchek 仅使用 Python 标准库,并支持 Python 3.9+。
8. **速度**
响应解析使用提前退出、最小分配、高效迭代和减少内存拷贝,以实现标准库中最快的可能性能。
这些原则使用户能够轻松验证应用程序是否安全行为。
## 功能
* 使用 k-匿名性协议进行安全的密码泄露检查
* 检查单个或多个密码
* 从标准输入和 Shell 管道读取密码
* 脚本专用的纯数字输出
* 无需网络访问的 SHA-1 前缀/后缀输出
* 快速提前退出的响应解析
* 支持 Python 3.9 至 3.14
* 现代 PyPI 包安装方式
* 零第三方运行时依赖
## 工作原理
1. 使用 SHA-1 对密码进行哈希
2. 将哈希拆分为:
* 前 5 个字符作为前缀
* 剩余 35 个字符作为后缀
3. 仅将前缀发送到 API
4. 在本地比较后缀
5. 返回泄露计数
完整密码永远不会离开本地机器。
## 安装
### 从 PyPI 安装
```
python3 -m pip install --upgrade passchek
```
或者仅对当前用户安装:
```
python3 -m pip install --user passchek
```
### 验证安装
```
passchek --version
```
预期输出:
```
Passchek v0.2.3
```
### 从源代码安装
```
git clone https://github.com/edyatl/passchek.git
cd passchek
python3 -m pip install .
```
注意:PyPI 不再支持 `pip search`。请改用 `pip show passchek` 或 `passchek --version`。
## 用法
```
Usage:
passchek [options] [PASSWORD ...]
Arguments:
PASSWORD One or more passwords to check.
If omitted, Passchek reads from prompt or stdin.
Options:
-h, --help Show help and exit
-n, --num-only Output only breach count numbers
-p, --pipe Read passwords from stdin / shell pipe
-s, --sha1 Print SHA-1 hash as prefix/suffix and exit
-v, --version Show Passchek version
```
## 示例
### 交互式提示
```
$ passchek
Enter password:
This password has appeared 3912816 times in data breaches.
```
### 仅数字输出
```
$ passchek -n
Enter password:
3912816
```
### SHA-1 元组模式
```
$ passchek -s
Enter password:
('B1B37', '73A05C0ED0176787A4F1574FF0075F7521E')
```
### 多个密码
```
$ passchek -n qwerty ytrewq qazwsx random_password
3912816
33338
505344
0
```
### 管道模式
```
$ cat passwords.txt | passchek -np
21
8
0
0
457
```
## 安全注意事项
使用 Passchek 最安全的方式是交互式提示模式:
```
passchek
```
这可以避免外壳历史记录泄露并保持输入隐藏。
避免将真实密码作为命令行参数传递:
```
passchek my-secret-password
```
外壳历史记录可能存储明文值。
推荐使用:
* 交互式提示
* 标准输入管道
* 来自安全自动化环境的密钥注入
## Windows
从以下地址安装 Python 3.9+:
[https://www.python.org/downloads/windows/](https://www.python.org/downloads/windows/)
然后安装:
```
py -m pip install passchek
```
运行:
```
passchek
```
## 更新日志
## v0.2.3 (2026-04-10)
一个专注于可维护性、打包、类型和 Python 3.14 准备就绪的重大重构和现代化版本。
### 新增
* Python 3.9+ 内置泛型支持
* 通过 `passchek._version.__version__` 的包样式版本管理
* 改进的 MANIFEST 和 PyPI 打包流程
* 更佳的 CLI 版本和帮助格式
* 源代码和测试中的全面类型提示
* Linter、格式化器和预提交配置
### 变更
* 将 `main()` 重构为更小的专注单元
* 使用 `_API` 常量和 f 字符串替换旧的 URL 辅助工具
* 使用 `splitlines()` 和 `partition()` 优化响应解析
* 首次匹配后提前退出
* 从 `setup.py` 现代化为 `pyproject.toml` 的打包方式
* 使用 `usedforsecurity=True` 改进 SHA-1 处理
### 修复
* 修正密码空白符修剪
* 改进管道模式下的换行处理
* 更好的空密码测试行为
* 更健壮的 urllib 错误处理
* 一致的非零 CLI 退出码
## 作者
**Yevgeny Dyatlov**
GitHub: [https://github.com/edyatl](https://github.com/edyatl)
## 许可证
MIT 许可证
版权所有 (c) 2020-2026 Yevgeny Dyatlov
详见 [LICENSE](LICENSE)。
标签:Have I Been Pwned, LNA, Pwned Passwords API, Python, Python 3.14, Python 3.9, SHA-1, Web后端, 安全, 安全工程, 密码, 密码审计, 密码泄露检测, 开源, 快速审计, 无后门, 最小化代码, 本地哈希, 清晰代码, 源代码审计, 生产级代码, 类型提示, 网络安全, 网络调试, 脚本, 自动化, 范围查询, 超时处理, 逆向工具, 错误处理, 隐私保护