mr-grj/ciphermoth
GitHub: mr-grj/ciphermoth
一款无需账号和云端的隐私优先型自托管密码管理器,所有数据加密存储在用户自有硬件上。
Stars: 18 | Forks: 1
# CipherMoth
**让你的秘密隐匿于黑暗中。**
一个简单的、自托管的密码管理器,**没有账号、没有云端,也没有任何旁观者。**
[](https://github.com/mr-grj/ciphermoth/actions/workflows/ci.yml)
[](https://github.com/mr-grj/ciphermoth/releases/latest)
[](./LICENSE)
[](https://www.python.org/)
[](https://www.postgresql.org/)
[](#get-started)
## 这是什么?
我为自己构建了这个工具,因为我厌倦了每个密码管理器都想要我的邮箱地址、订阅费、一个能访问所有内容的浏览器扩展,最好还要我的命。大多数大型密码管理器默认依赖于托管账号、同步层或按月扣费。
我想要一个运行在我自己的机器上、没有遥测、不与任何第三方交互的工具,而且它不会在某天突然宣布被收购并迁移到某个新平台。没有 Google。没有 OAuth。没有向家里发送分析数据。什么都没有。
所以就有了 **CipherMoth**。它运行在你自己的硬件上,不与任何人通信,并且使用只有你知道的密钥来加密保存密码。一个主密码即可解锁一切。如果有人拿到了数据库,他们得到的只是加密的 blob,而不是你的密码。
## 截图
| | |
|---|---|
| **首次运行:设置你的主密码** | **密码库** |
|  |  |
| **添加密码并生成强密码** | **在你的设备上计算的密码库健康度** |
|  |  |
## 开始使用
CipherMoth 通过 [Docker](https://docs.docker.com/get-docker/) 运行在你自己的机器上。只需一条命令即可设置强数据库密码、拉取**已签名**的镜像并启动所有服务:
```
curl -fsSL https://raw.githubusercontent.com/mr-grj/ciphermoth/master/install.sh | sh
```
打开 **[http://localhost:3001](http://localhost:3001)**,创建你的主密码,就可以开始使用了。密码库存在于持久的 Docker volume 中,因此可以在重启和更新后保留数据。
想在通过管道传输给 shell 之前先阅读脚本,还是想手动设置,在真实服务器上运行,或者调整配置?这些内容全都在 **[CONTRIBUTING.md](./CONTRIBUTING.md)** 中。
## 功能特性
- 一个主密码即可解锁密码库,没有账号,没有邮箱,也不需要把恢复码发送到你三年前就换了的手机号上
- 所有静态密码均被加密;密钥由主密码派生,且绝不会接触服务器
- 在每个条目旁存储用户名、网站、标签、文件夹、双重验证(TOTP)密钥以及你自己的自定义字段,全部经过加密
- 内置双重验证:粘贴一个 2FA 密钥,CipherMoth 就会显示实时滚动的验证码,并在浏览器中计算
- 用于存放任意格式机密信息(恢复码、Wi-Fi、护照详细信息)的安全备忘录,其加密方式与密码相同
- 可为任何条目附加文件(恢复码 PDF、许可证密钥、密钥文件),每个文件最大 5 MB,并使用你的密码库密钥进行加密
- 搜索、收藏、文件夹、标签和密码历史记录,保持不断膨胀的密码库井然有序
- 提供回收站用于删除条目,你可以从中恢复,或者在确定后彻底清空
- 浅色和深色主题可在整个应用中切换,随着颜色褪去,一只飞蛾会振翅飞走(并且会记住你的选择)
- 密码库健康检查,标记出弱密码、重复使用的密码和陈旧密码,完全在你的设备上进行
- 加密安全的密码生成器(不是 `Math.random()` 那种),在每个条目上都有强度指示器
- 通过 CSV 从 Chrome、Bitwarden、KeePass、Proton Pass 等导入,或恢复加密的 CipherMoth 备份
- 加密的备份导出,用于终端的 CLI(`ciphermoth`),以及自动锁定和清除剪贴板功能(为了那些值得关注的小细节 ^^)
- 通知新版本发布并可自我更新,可选开启并经过签名验证(Sigstore / cosign)
## 适用人群(以及不适用的人群)
如果你符合以下情况,CipherMoth 可能很适合你:
- 想要一个没有账号、没有遥测、没有第三方的自托管密码管理器
- 能够在你控制的机器上熟练运行 Docker
- 喜欢小巧、可审计的软件,并乐于管理自己的备份
如果你需要浏览器自动填充、移动应用、家庭或团队共享、托管的云端同步,或者在忘记主密码时恢复密码库的方法,那么它(目前)可能不适合你。这完全可以理解,这些都是切实的需求,只不过不是这款工具想要实现的目标。
## 安全性
直截了当地说,因为这是一个密码管理器,而且你理应了解真相:**CipherMoth 尚未经过独立审计。**
这是我自用的个人项目,构建过程非常小心,特意将加密部分保持得小巧且易读,但它没有经过正式的第三方安全审查。它专为在你信任的硬件上进行自托管的个人使用而设计,而不是作为存储他人机密的公共多租户服务。请据此权衡使用。
工作原理:
- 你的主密码使用 **bcrypt** 进行哈希处理,从不以明文存储;新的密码库要求设置一个相当强(12 个字符以上,混合字符类型)的密码,并由服务器强制执行;
- 每个存储的字段都使用 **Fernet**(AES-128-CBC + HMAC-SHA256)加密,密钥是通过 **Argon2id**(OWASP 2024 交互式配置)从你的主密码派生的,得益于随机盐,每个密码库的密钥都是唯一的;
- 甚至连元数据(网站、2FA 密钥、标签、自定义字段、历史记录、附件)也是加密的;数据库永远不会知道你拥有哪些网站或你是如何组织它们的;
- 派生出来的密钥仅存在于你浏览器的 `sessionStorage` 中,从不接触服务器,并在你关闭标签页的那一刻消失
- 密码生成器使用带有拒绝采样的 `crypto.getRandomValues`,不使用 `Math.random()`,没有捷径;
**它可以防范**窃取数据库或磁盘的人(他们只能拿到密文和 bcrypt 哈希)、意外的服务器端泄露(服务器从不持久化主密码或派生密钥)以及对存储数据的随意检查。
**它无法防范**在你解锁设备上的恶意软件或键盘记录器、过于简单的主密码、在没有 `https` 的情况下将实例暴露在公共互联网上,或者忘记主密码(无法恢复)。请在你信任的机器和网络上运行它,使用强主密码,并做好备份。
如需报告漏洞,请参阅 [SECURITY.md](./SECURITY.md)。
## 技术栈
| 层级 | 技术 |
|---|---|
| 后端 | Python 3.13, FastAPI, SQLAlchemy 2.0, asyncpg |
| 数据库 | PostgreSQL 16 |
| 前端 | React 19, Vite, MUI v9, easy-peasy |
| 包管理器 | uv(后端),npm(前端) |
| 基础设施 | Docker, Docker Compose v2 |
## 文档
- **[CONTRIBUTING.md](./CONTRIBUTING.md)** - 修改开发 CipherMoth、在服务器上自托管、配置和更新
- **[docs/CLI.md](./docs/CLI.md)** - `ciphermoth` 命令行参考
- **[SECURITY.md](./SECURITY.md)** - 报告漏洞
- Logo、徽标和网站图标位于 [`docs/brand/`](./docs/brand)
## 许可证
MIT:详见 [LICENSE](./LICENSE)。标签:PostgreSQL, Python, 数据加密, 无后门, 版权保护, 网络安全, 自定义脚本, 自托管, 请求拦截, 隐私保护