boazeb/papervault
GitHub: boazeb/papervault
PaperVault 是一款基于门限加密技术的离线机密纸质备份工具,通过 Shamir 秘密共享将加密密钥拆分为可打印的分片,实现安全的社交恢复和物理隔离存储。
Stars: 53 | Forks: 4
# PaperVault - 使用门限加密技术在纸张上存储机密
**PaperVault 📄🔐** 是一款免费的开源工具,用于为您的基础机密(如密码、2FA 恢复代码、数字资产密钥、硬盘加密密钥以及其他关键数据)创建离线的纸质数据保险库。

## 🔐 概述
PaperVault 会对您的机密进行加密,并将解密密钥拆分成多个分片,这些分片可以打印在纸上或保存到数字媒体中。密钥使用 [Shamir 秘密共享](https://en.wikipedia.org/wiki/Shamir%27s_Secret_Sharing) 进行拆分。您可以选择创建的密钥数量以及解锁所需的密钥数量——例如,创建 5 把密钥,并且任意需要 3 把(3-of-5)。
## 🚀 快速开始
选择最适合您的方式:
| 入口 | 最适合 |
|---|---|
| [Web 应用](#-web-app) | 无需安装,在任何浏览器中运行 |
| [自托管 Web 应用](#-self-hosted-web-app-recommended-for-maximum-security) | 最高安全性,物理隔离 |
| [命令行](#-command-line) | 脚本,导入 `.env`,从机密存储中提取 |
| [AI 代理 (MCP)](#-ai-agents-claude-code-cursor-other-mcp-clients) | 在执行高风险操作前备份机密 |
| [Docker](#-docker) | 容器化部署 |
| [库](#-library) | 将 PaperVault 嵌入您自己的工具 |
任何保险库都可以在 [papervault.xyz/unlock](https://papervault.xyz/unlock) 解锁,或者在您自托管实例的 `/unlock` 处解锁。所有入口的保险库格式都是相同的。
### 🌐 Web 应用
访问 [papervault.xyz](https://papervault.xyz)。该应用是一个完全在您的浏览器中运行的静态 React bundle。
### 🏠 自托管 Web 应用(推荐以获得最高安全性)
在您自己的机器上运行相同的 Web 应用,最好是物理隔离的环境。
```
git clone https://github.com/boazeb/papervault.git
cd papervault
npm install
npm start
```
打开 [http://localhost:3000](http://localhost:3000)。
### 💻 命令行
```
npm install -g @papervault/cli
papervault init
```
初始化向导将引导您完成配置。CLI 支持从 `.env` 文件、JSON、Azure Key Vault 接收机密,或通过交互式输入,并生成相同的可打印套件。
### 🤖 AI 代理(Claude Code、Cursor 及其他 MCP 客户端)
将 PaperVault MCP 服务器添加到您的 AI 客户端。然后,代理可以在执行密钥轮换或账户删除等高风险操作之前触发纸质备份,而无需查看机密的值。
对于 Claude Code,只需一条命令:
```
claude mcp add -s user papervault -- npx -y @papervault/mcp
```
对于其他客户端(Cursor、Claude Desktop 等),请将以下内容添加到客户端的 MCP 配置文件中:
```
{
"mcpServers": {
"papervault": {
"command": "npx",
"args": ["-y", "@papervault/mcp"]
}
}
}
```
然后重启客户端(或开启新的 Claude Code 对话)以加载服务器。有关完整的工具参考和特定客户端的配置路径,请参阅 [`@papervault/mcp`](papervault-mcp/)。
### 🐳 Docker
```
docker build -t papervault .
docker run -p 3000:3000 papervault
```
### 📦 库
如果要在其他工具中嵌入 PaperVault,请使用 [`@papervault/core`](papervault-core/)。它将加密、Shamir 拆分和 HTML 页面生成作为独立的函数公开。
## 🔑 核心特性
- **离线工作** - 安装后无需互联网;自己运行,专为物理隔离使用而设计。
- **纯客户端** - 任何数据都不会离开您的设备。
- **可打印** - 保险库和密钥都可以打印并下载到数字媒体,以便进行离线分布式存储。
- **灵活的门限** - 任意 M-of-N 组合(最多 20 把密钥)。
- **社交恢复与数字遗产** - 可以分发密钥以用于紧急情况下的恢复。
## 📄 保险库与密钥分片(社交恢复)
PaperVault 不会在密钥持有者之间拆分您的机密。相反,加密的保险库和密钥分片是分开的文档。这为您在使用 PaperVault 进行社交恢复时提供了额外的配置自由度:
- **密钥持有者** 持有密钥分片(例如家人、朋友、共同受托人)。他们可以组合足够多的分片来重构解密密钥——但是**仅靠密钥是不够的**。他们还需要**保险库页面**。
- **保险库持有者** 持有保险库页面。如果没有足够多的密钥分片,保险库页面将毫无用处。
因此,即使密钥持有者串通,除非他们同时拿到了保险库页面,否则也无法解锁保险库。您可以将保险库页面留给自己,将其交给另一个人,或者将副本存储在与密钥不同的位置。
## 🔍 使用 AI 审计
这是开源软件。我们鼓励安全研究人员审查实现并报告安全问题。要自己运行快速的 AI 辅助审计,请选择您首选的助手:
- **[ChatGPT](https://chat.openai.com/?q=Perform%20a%20security%20audit%20of%20PaperVault%20(https%3A%2F%2Fgithub.com%2Fboazeb%2Fpapervault).%20Start%20by%20following%20the%20instructions%20here%3A%20https%3A%2F%2Fraw.githubusercontent.com%2Fboazeb%2Fpapervault%2Fmain%2FAI_AUDIT_INSTRUCTIONS.md)**
- **[Claude](https://claude.ai/new?q=Perform%20a%20security%20audit%20of%20PaperVault%20(https%3A%2F%2Fgithub.com%2Fboazeb%2Fpapervault).%20Start%20by%20following%20the%20instructions%20here%3A%20https%3A%2F%2Fraw.githubusercontent.com%2Fboazeb%2Fpapervault%2Fmain%2FAI_AUDIT_INSTRUCTIONS.md)**
- **[Gemini](https://gemini.google.com/?q=Perform%20a%20security%20audit%20of%20PaperVault%20(https%3A%2F%2Fgithub.com%2Fboazeb%2Fpapervault).%20Start%20by%20following%20the%20instructions%20here%3A%20https%3A%2F%2Fraw.githubusercontent.com%2Fboazeb%2Fpapervault%2Fmain%2FAI_AUDIT_INSTRUCTIONS.md)**
- **[Grok](https://grok.com/?q=Perform%20a%20security%20audit%20of%20PaperVault%20(https%3A%2F%2Fgithub.com%2Fboazeb%2Fpapervault).%20Start%20by%20following%20the%20instructions%20here%3A%20https%3A%2F%2Fraw.githubusercontent.com%2Fboazeb%2Fpapervault%2Fmain%2FAI_AUDIT_INSTRUCTIONS.md)**
- **[Perplexity](https://www.perplexity.ai/search?q=Perform%20a%20security%20audit%20of%20PaperVault%20(https%3A%2F%2Fgithub.com%2Fboazeb%2Fpapervault).%20Start%20by%20following%20the%20instructions%20here%3A%20https%3A%2F%2Fraw.githubusercontent.com%2Fboazeb%2Fpapervault%2Fmain%2FAI_AUDIT_INSTRUCTIONS.md)**
## 🛡️ 安全模型
### 加密基础
- **算法**:基于 GF(2^8) 的 Shamir 秘密共享。保险库使用 [shamir-secret-sharing](https://github.com/privy-io/shamir-secret-sharing)。
- **加密**:v2 保险库通过 Web Crypto API 使用 AES-256-GCM(已认证);传统的 v1 保险库使用 AES-256-CTR,并且仍然支持解锁和向后兼容。
- **密钥生成**:通过 `crypto.getRandomValues()`(Web Crypto API)进行密码学安全的随机数生成。
- **二维码**:Version 6-8 二维码,带有 level-M 级纠错(可恢复约 15% 的损坏),以确保从纸张上可靠扫描。
有关详细的安全细节、保险库版本和漏洞报告,请参阅 [SECURITY.md](SECURITY.md)。
### 安全最佳实践
1. **物理隔离使用**:在离线计算机上运行 PaperVault.xyz 以获得最高安全性
2. **源代码审查**:在使用关键机密之前审查代码
3. **物理安全**:将纸质密钥存储在分开、安全的地点
4. **测试恢复**:始终测试您的恢复流程
5. **持久存储**:为了获得最大的耐久性,请考虑使用档案级纸张并装入防拆封的信封中,同时加上衬纸以保持纸张平整并受到保护
### 威胁模型
PaperVault 不能防范:
- ❌ 物理上盗取门限数量的密钥 + 保险库
- ❌ 输入机密时的肩窥行为
- ❌ 对源代码的恶意修改
- ❌ 社会工程学
## 📖 工作原理
1. **创建保险库**:输入您的机密数据(密码、助记词等)
2. **配置分片**:选择密钥数量和恢复门限
3. **生成密钥**:使用 Shamir 算法以密码学方式拆分您的解密密钥
4. **打印与分发**:生成保险库备份并安全地分发密钥
5. **恢复**:使用任意门限数量的密钥来解密您的保险库
## 🔧 技术细节
### 架构
- **前端**:使用 React 17 和 Bootstrap UI
- **密码学**:Shamir 秘密共享的 JavaScript 实现
- **PDF 生成**:使用 React-PDF 生成文档
- **二维码**:针对移动设备扫描和打印进行了优化
- **存储**:纯客户端,无外部依赖
### 限制
- **最大密钥数**:20(受密码学库限制)
- **存储限制**:每个保险库 300 个字符(二维码优化)
## 📄 许可证
本项目基于 MIT 许可证授权 - 有关详细信息,请参阅 [LICENSE](LICENSE) 文件。
## 📞 支持
- **问题**:通过 [GitHub Issues](https://github.com/boazeb/papervault/issues) 报告 Bug
## ⚠️ 免责声明
本软件按“原样”提供,不提供任何形式的保证。用户需负责:
- 验证其实施的安全性
- 在依赖恢复程序之前对其进行测试
- 维护打印密钥的物理安全
- 理解所涉及的密码学原理
**请务必先使用非关键数据进行测试!**
标签:MITM代理, Shamir秘密共享, 冷存储, 大语言模型安全, 数据可视化, 机密管理, 离线备份, 自定义脚本, 请求拦截, 门限加密