willpiam/even-better-privacy
GitHub: willpiam/even-better-privacy
EBP 是一个从零构建的后量子安全加密通信与身份管理系统,旨在替代传统 PGP,提供抗量子计算威胁的邮件加密、数字签名和去中心化身份管理能力。
Stars: 2 | Forks: 0
# EBP: Even Better Privacy

EBP 是 PGP 自封的继任者,从零开始构建,旨在实现量子安全。
本仓库包含 EBP 的参考实现。其目的是展示系统的架构、协议和预期使用模型,而不是作为经生产强化的安全解决方案。
项目主页:[williamdoyle.ca/ebp](https://williamdoyle.ca/ebp)
## 安装
所有发布的程序文件都将带有来自 [ebpdk1m6l96sg6xpwcspl5yn9zph8j82x7ujsuuwl5gwqhctgmndjtvvjq5vwp99](https://ebp-cqyo.onrender.com/api/v1/identity/ebpdk1m6l96sg6xpwcspl5yn9zph8j82x7ujsuuwl5gwqhctgmndjtvvjq5vwp99) 的 EBP 签名。
### 对于 Linux
- 前往 [发布页面](https://github.com/willpiam/even-better-privacy/releases)
- 找到最新的发布版本并点击“Assets”下拉菜单
- 选择 `.AppImage` 文件并下载
- 下载完成后,确保其具有作为程序运行的权限
- 双击下载的文件以启动 EBP 程序
### 对于 Mac
- 前往 [发布页面](https://github.com/willpiam/even-better-privacy/releases)
- 找到最新的发布版本并点击“Assets”下拉菜单
- 选择 `.dmg` 文件并下载
- 运行该文件,将狐狸图标拖拽到应用程序图标中
- EBP 现已安装在您的 Mac 上,可以像任何其他应用程序一样运行
### 对于 Windows
- 前往 [发布页面](https://github.com/willpiam/even-better-privacy/releases)
- 找到最新的发布版本并点击“Assets”下拉菜单
- 选择并下载 `.msi` 文件
- 运行 `.msi` 文件并按照向导在您的系统上安装 EBP
- 像启动任何其他 Windows 程序一样启动 EBP。可以通过搜索“EBP”找到它
### 从源码构建 (Linux, Windows, & Mac)
如果您熟悉 CLI,或者希望为此代码库做出贡献,您可能会希望从源码运行 EBP。即使没有使用 CLI 的经验,这应该也非常简单。这可能是在您的系统上启动并运行 EBP 最可靠的方法。
1. 安装 [Deno](https://deno.land/)
2. 克隆此仓库
3. 运行测试以验证一切正常:`deno task test:core`
#### 快速开始 (GUI + 公共服务器)
1. 运行 `deno task gui`
2. 在浏览器中导航至 [http://localhost:8787](http://localhost:8787)(或终端指向的任何位置)
3. 点击设置
4. 将 *server url* 设置为 https://ebp-cqyo.onrender.com
### 本地构建
如果您希望创建自己的构建文件,这应该相当容易做到。
- 安装 Node + NPM、Rust + Cargo 和 Deno
- 运行适用于您操作系统的 shell 脚本(`build_desktop_mac.sh`、`build_desktop_windows.sh` 或 `build_desktop_linux.sh`)
如果一切顺利,这将生成一个可执行文件……在 Linux 上是 EBP.AppImage,在 Mac 上是 __,或在 Windows 上是 __。
## 原生电子邮件
EBP GUI 包含一个用于发送和接收电子邮件的内置界面。
它通过标准的 SMTP 和 IMAP 协议直接连接,使其与大多数电子邮件提供商兼容。EBP 还支持 Gmail 和 Outlook 的 OAuth,以提供更简便的体验。
### 通过 OAuth 的原生电子邮件
要使用 OAuth 运行,您需要在 `.env` 文件中提供以下值。
```
MAIL_OAUTH_GMAIL_CLIENT_ID=""
MAIL_OAUTH_GMAIL_CLIENT_SECRET="" # only provided to key server (playing double duty by also handeling oauth)
# MAIL_OAUTH_OUTLOOK_CLIENT_ID="" # 不再关注 Outlook,因为这个麻烦不值得花时间
# MAIL_OAUTH_OUTLOOK_CLIENT_SECRET="" # 仅提供给 key server,而不是用户机器
```
如果您正在使用测试用的 Gmail 客户端 OAuth 凭证,您可能会发现以下链接对于添加测试用户很有帮助。[console.cloud.google.com/auth/audience](https://console.cloud.google.com/auth/audience)。确保您处于正确的项目中。向下滚动到“Test users”并点击“add users”。
### Proton 原生电子邮件
Proton 用户必须安装并运行 Proton Mail Bridge 才能使用 EBP 原生电子邮件。
### 测试原生电子邮件
将两个测试电子邮件账户添加到 dotenv 文件中,以便在 e2e 测试套件中测试电子邮件功能。
```
TEST_EMAIL_ONE=""
TEST_EMAIL_ONE_PWORD=""
TEST_EMAIL_ONE_SMTP_PORT="465"
TEST_EMAIL_ONE_SMTP_HOST=""
TEST_EMAIL_ONE_IMAP_PORT="993"
TEST_EMAIL_ONE_IMAP_HOST=""
TEST_EMAIL_TWO=""
TEST_EMAIL_TWO_PWORD=""
TEST_EMAIL_TWO_SMTP_PORT="465"
TEST_EMAIL_TWO_SMTP_HOST=""
TEST_EMAIL_TWO_IMAP_PORT="993"
TEST_EMAIL_TWO_IMAP_HOST=""
```
## 电子邮件 Chrome 扩展程序
EBP 包含一个 Chrome 扩展程序,使用本地 GUI 后端 API 在网页邮件中添加签名/加密和解密/验证控件。
受支持的电子邮件客户端 (网页):
- Gmail
- Outlook (Outlook 网页版)
- Proton Mail
### 安装扩展程序
此扩展程序可在任何基于 Chromium 的浏览器上运行。
#### 从源码安装扩展程序
1. 打开 `chrome://extensions` 或
2. 启用开发者模式。
3. 点击 **加载已解压的扩展程序** 并选择此文件夹:
`/even-better-privacy/email/chrome-extension`
~~请参阅 [`email/chrome-extension/README.md`](email/chrome-extension/README.md) 中的扩展程序指南~~
#### 从 Chrome 网上应用店安装扩展程序
我尚未将该扩展程序发布到网上应用店。我打算尽快完成此操作。
## 环境配置
如果您打算运行自己的密钥服务器,则需要在项目根目录(与此 `ReadMe.md` 相同的文件夹)中创建一个 `.env` 文件。示例:
```
DB_TYPE=psql # options include sqlite | psql
# postgres 数据库连接详情
PG_HOST=localhost
PG_PORT=5432
PG_USER=postgres
PG_PASSWORD=postgres
PG_DATABASE=ebp
PG_POOL_SIZE=5
SMTP_HOST=smtp.example.com
SMTP_PORT=465
SMTP_USER=
SMTP_PASS="sender email password here"
SMTP_FROM=
SMTP_SECURE=true
PUBLIC_BASE_URL=
```
## 支持的密码系统
EBP 使用 NIST 批准的量子安全方案。有关 NIST 后量子密码标准的更多信息可在[此处](https://csrc.nist.gov/projects/post-quantum-cryptography)找到。
### 签名
#### 基于哈希
- SLH-DSA (SPHINCS+)
#### 基于格
- ML-DSA (Dilithium)
- FN-DSA (Falcon) (计划中)
### 加密
- ML-KEM (Kyber)
| 名称 | 所用变体 | 公钥大小 | 用途 |
| --------------------------|-------------------|-------------------|----------|
| ML-KEM (Kyber) | ML-KEM-1024 | 1,568 bytes | KEM |
| SLH-DSA (SPHINCS+) | SLH-DSA SHA2-256s | 64 bytes | Auth |
| ML-DSA (Dilithium) | ml_dsa87 | 2,592 bytes | Auth |
| FN-DSA (Falcon) (计划中) | NA | NA | Auth |
## 方案
与 RSA 或 ECC 不同,新的后量子方案仅支持加密或消息签名,而不能在同一方案中同时支持两者。因此,我们要求签名和加密(或者说是 KEM)密钥永远不要单独出现,而应成对出现;即一个签名密钥和一个加密密钥。生成的对象称为身份 (Identity)。身份的指纹是这两个密钥的哈希值。
### 关于 KEM 的说明
目前,我们将 KEM 视为常规的非对称加密。当我们向某个身份发送加密消息时,我们总是会生成一个新的 AES 密钥并使用它来加密消息,然后使用接收者的 KEM 密钥封装该 AES 密钥,接着我们将封装的密钥连同密文一起发送给接收者。回复则使用新的 AES 密钥进行加密,而不是最初由第一个发送者提供的密钥。
我愿意在未来改变这一点。这种方法对我来说是最简单的,并且我不认为更改它是一个优先事项。它直接且通用,但我承认它的效率不如预期。
## 工作原理
1. 生成一个身份(创建一个签名密钥 + 加密密钥对)
2. 与他人分享您的公开身份(指纹 + 公钥)
3. 导入联系人的公开身份
4. 签名消息 — 接收者使用您的公开签名密钥进行验证
5. 加密消息 — 接收者使用他们的私有加密密钥进行解密
## 撤销系统
EBP 支持撤销特定详情和整个身份。所有撤销都需要来自被撤销身份的有效签名,以确保只有密钥持有者才能撤销自己的数据。
### 撤销类型
#### 详情撤销
从身份中移除特定的详情(如电子邮件或姓名)。在以下情况下使用此功能:
- 信息已更改(新的电子邮件地址)
- 信息输入有误
- 您不再希望将该信息与您的身份关联
```
# 本地撤销详情
ebp revoke-detail email --reason "Changed email address"
# 撤销并推送到服务器
ebp revoke-detail email --reason "Changed email address" --push
```
#### 身份撤销
将整个身份标记为已泄露或无效。**这是不可逆的。** 在以下情况下使用此功能:
- 您的私钥已泄露
- 您正在迁移到新身份
- 该身份不再受信任
```
# 撤销 identity(需要 --force 确认)
ebp revoke --reason "Key compromised" --force
# 撤销并推送到服务器
ebp revoke --reason "Key compromised" --force --push
```
### 紧急撤销证书
您可以在创建身份时预先生成紧急撤销证书。此证书可以安全存储(例如,打印出来并保存在保险箱中),并在您的私钥泄露时使用——即使您丢失了密钥本身。
```
# 使用 emergency certificate 生成 identity
ebp generate --revocation-cert --revocation-output emergency-revoke.json
# 为现有 identity 生成 emergency certificate
ebp generate-revocation-cert --output emergency-revoke.json
```
**重要提示**:请安全地存储紧急证书。任何拥有此证书的人都可以撤销您的身份。
### 撤销如何工作
1. **已签名的证书**:每次撤销都会生成一个包含以下内容的签名证书:
- 类型(详情或身份)
- 身份指纹
- 单调递增的 nonce(防止重放攻击)
- 时间戳
- 可选的原因
- 目标路径(用于详情撤销)
- 密码学签名
2. **验证**:任何人都可以使用该身份的公开签名密钥验证撤销证书。服务器在接受撤销之前会验证签名。
3. **Nonce 保护**:撤销 nonce 必须严格递增,防止攻击者重放旧的撤销证书。紧急证书使用 nonce 0 且只能使用一次。
4. **服务器集成**:推送到服务器时,撤销将与身份查询一起存储并返回。客户端在导入联系人时应检查撤销状态。
### 检查撤销状态
从服务器获取身份时,响应包含:
- `revoked`:指示身份是否被撤销的布尔值
- `revocationCertificate`:如果被撤销,则为十六进制编码的证书
- `revokedDetails`:已被撤销的详情路径数组
应用程序在处理已撤销的身份或详情时应警告用户。
## 测试
运行以下每一项以确保一切正常
核心测试
```
deno task test:core
```
CLI 测试
```
deno task test:cli-utils
```
*更多的 CLI 测试可能会有用*
服务器测试
```
deno task test:server
```
GUI 后端测试
```
deno task test:gui-backend
```
E2E GUI 测试 (Playwright)
```
npm install
npx playwright install --with-deps
```
在您的 `.env` 文件中设置
```
DB_TYPE=sqlite
```
然后运行测试(这将自动启动 GUI 本地后端):
```
deno task test:e2e
```
要运行使用 Postgres 作为数据库的端到端测试
```
DB_TYPE=psql
```
然后运行
```
deno task test:e2e:psql
```
## 指纹 (Merkle Root + Bech32)
EBP 指纹使用:
- 两个公钥的 merkle root(签名叶节点 + 加密叶节点)
- 带有特定于签名方案的 HRP 的 Bech32 编码
我们使用这两个密钥的 merkle 树作为指纹,因为它允许在没有这两个密钥的情况下验证指纹。这在数据成本高且不需要这两个密钥的情况下非常有用。
当前前缀:
- `ebpdk1...` 用于 Dilithium + Kyber 身份
- `ebpsk1...` 用于 SPHINCS+ + Kyber 身份
## CLI
**注意:** 当本节讨论名为 `ebp` 的程序时,您将改为使用 `deno task cli`
`ebp` CLI 管理后量子身份和安全消息传递。您可以生成多个身份(存储在 `~/.ebp/.identity.json` 中)、在它们之间切换、检查指纹和详细信息、与联系人交换签名/加密消息,以及加密/解密完整的文件负载。
- 创建和切换身份(`ebp generate [name]`、`ebp identities`、`ebp use `)
- 查看身份信息和附加的详细信息(`ebp info`、`ebp details`)
- 导出公开身份以供分享(`ebp export-public`)
- 导入联系人并列出他们(`ebp import`、`ebp contacts`)
- 签名消息(`ebp sign`)和验证(`ebp verify`)
- 为对等方加密和解密(`ebp encrypt`、`ebp decrypt`)
- 加密和解密文件(`ebp encrypt-file`、`ebp decrypt-file`)
- 将身份发布到服务器并获取联系人(`ebp server `、`ebp publish`、`ebp fetch `)
- 添加详细信息时将其推送到服务器(`ebp detail --push`)
## GUI
- CLI 的所有功能,但以图形格式呈现
- 与相同的文件系统进行交互 — GUI 和 CLI 是访问相同数据的两个接口
### 如何运行 GUI
1. 运行本地后端:`deno task gui:local-backend`
2. 导航至 [localhost:8787](http://localhost:8787/)
## 支持开发
如果您觉得 EBP 有用,请考虑支持该项目:
| 网络 | 地址/Handle | 链接 |
| --- | --- | --- |
| Ethereum (& more) | `williamdoyle.eth` | https://app.ens.domains/williamdoyle.eth |
| Bitcoin | `bc1q6crw4wy7jecs05f4ytz68n6evuzlu7k3cnu7zy` https://blockchair.com/bitcoin/address/bc1q6crw4wy7jecs05f4ytz68n6evuzlu7k3cnu7zy |
| Cardano | `$wildoy` | https://handle.me/wildoy |
| QRL | `Q02070028dc6ca5f722f9646171cee25eff5d178907d0e05a7c343eeba77ef138fcc0da9a0074db` | https://explorer.theqrl.org/a/Q02070028dc6ca5f722f9646171cee25eff5d178907d0e05a7c343eeba77ef138fcc0da9a0074db |
## 隐私
有关项目的隐私政策,请参阅 [PRIVACY.md](PRIVACY.md)。
## 许可证
MIT — 详见 [LICENSE](LICENSE)。
## 即将推出的功能
- ENS 支持
- 增加对 ENS 中 EBP 指纹的支持。这意味着向 ENS 项目贡献少量代码。我已经尝试与 QRL 合作,但我的 Pull Request 从未被合并。https://github.com/ensdomains/address-encoder/pull/386 。此步骤并非使系统良好运行于 ENS 所必需,但这会让用户的体验更好一些。事实上,这可以作为最后一步。
- 增加对搜索 EBP 指纹的 ENS 名称的支持。然后在 EBP 服务器上查找该指纹
- 增加一项规定,允许用户将 ENS 名称作为详情添加到其 EBP 身份中,但服务器必须验证该用户的指纹是否已添加到该 ENS 名称中
- 更好的 db 接口层
- 在 EBP 操作上进行抽象而不是在 db 连接上
- 这将允许我们在 sqlite 和 psql 实现中使用不同的 SQL。这也将使我们能够轻松实现非 SQL 连接。
- 电子邮件插件的端到端测试
- 电子邮件:当用户直接回复电子邮件时启用 EBP 界面
- 电子邮件:选择多个收件人。使用相同的 AES 密钥加密。发送带有一条加密消息的 JSON 对象,以及将收件人指纹映射到仅为该收件人封装的 AES 密钥副本的对象。
```
{
"encapsulated_key_map": {
"": ""
},
"ciphertext":""
}
```
- 支持身份的有效期
- 将其他 EBP 身份认可为您自己的身份(双向绑定)
- 插件:增加意外发送未加密电子邮件的难度
- 插件:隐藏密码输入框
- 哈希详情
- 哈希电子邮件认可
- 获取您的电子邮件地址的哈希值
- 签名哈希
- 将哈希值、电子邮件地址和签名发送到公钥服务器
- 服务器代您发送电子邮件以确认您的电子邮件
- 服务器从不公开未哈希的电子邮件。甚至可能在用户确认后删除原始电子邮件地址。
- 收到您签名电子邮件的用户仍然可以确认该电子邮件地址与提供的 EBP 身份相关联。
- 减少您受到的垃圾邮件骚扰
- 支持身份层级
- 父级可以撤销关系
- 一种模式可能如下所示:
```
graph TD
M[Master Identity] -->|endorses| C[Cold Identity]
C -->|endorses| H[Hot Key]
```
- 当向身份添加详细信息时,我希望将详细信息路径的输入设为一个下拉菜单,其第一个选项为“custom”,以便用户可以提供他们自己的详细信息路径
- 完善 `core`
- 完善 `gui/local-backend`
- 创建完整的清单和强化计划
- 移动应用程序
- 与 GUI 完全的功能对等
- 高级电子邮件功能
- 搜索收件箱
- 编写和保存草稿(使用相同的 PIN/密码加密)
- 渲染电子邮件:图像、布局、字体、一切
- 通常使用什么?HTML?Markdown?
- 定时发送
- 更传统的“电子邮件收件箱”电子邮件页面布局
-
标签:AppImage, CVE, dmg, DNS解析, meg, MITM代理, msi, PGP替代, Web应用防火墙, 信息安全, 公钥基础设施, 去中心化身份, 可视化界面, 后量子密码, 安全通信, 密码学, 开源安全工具, 开源项目, 手动系统调用, 抗量子密码学, 数字签名, 数据加密, 测试用例, 特征检测, 电子邮件安全, 端到端加密, 网络安全, 网络安全, 自动化攻击, 身份管理, 逆向工程平台, 隐私, 隐私保护, 隐私保护