用于 PGP 加密、解密和签名的开源浏览器扩展。
使用 Rust/WebAssembly 构建。除非必要,私钥绝不会接触 JS 堆。
开源且透明。 大多数 PGP 浏览器扩展都是闭源的。你不应该将你的秘密托付给一个黑盒子。
加密在 WASM 中运行,而不是 JavaScript。 所有 PGP 操作都在一个 Rust/Sequoia-PGP WebAssembly 沙箱中运行。JS 只持有你的密钥的一个不透明整数句柄——实际字节位于 WASM 线性内存中,并在释放时清零。私有密钥在生成和导入期间短暂经过 JS,然后被加密并存储。
通行密钥解锁。 使用 WebAuthn PRF 保护密钥——使用 Touch ID、Face ID、Windows Hello 或 YubiKey 解锁,无需密码。PRF 输出通过 HKDF-SHA256 与存储的秘钥结合,整个解锁流程在 WASM 中运行。
密码使用 Argon2id。 64 MB 内存,3 次迭代——抵抗 GPU 暴力破解。KDF、解密和密钥存储均在 WASM 中进行。密码字节在使用后立即在两侧都归零。
原子解密 + 验证。 明文和签名结果在一个紧凑的响应中一起返回。签名错误 = 不返回明文。无 TOCTOU 窗口。
随处清零化。 对所有存储的密钥和中间变量使用 zeroize crate(Rust)。对密码、PRF 输出和派生密钥使用 Uint8Array.fill(0)(JS)。WASM 内存不被 GC 管理,因此清零操作是确定性的。
每密钥 AAD。 每个私钥都使用 AUC-256-GCM 加密,并附加与其指纹绑定的附加认证数据(AAD)。在密钥槽之间交换 blob 会失败。
pnpm install
pnpm dev # 开发服务器,带热重载
pnpm test # 单元测试 (vitest);Rust 引擎测试:在 apps/pgp/gpg-wasm 中运行 cargo test
pnpm build # 生产构建(自动构建 WASM)
pnpm zip # 打包用于 Chrome Web Store / Firefox 附加组件
WASM 模块必须从源代码构建。如需手动重建:
cd apps/pgp && pnpm build:wasm
apps/pgp/ 扩展源码
components/ React 用户界面
entrypoints/ 后台 + 侧边面板
hooks/ 密钥环、会话、联系人
lib/pgp/ WASM 包装器 + 操作
lib/protection/ WebAuthn PRF、Argon2id、AES-256-GCM
lib/storage/ 带互斥锁的 chrome.storage
gpg-wasm/ Rust/WASM 引擎 (sequoia-openpgp)
packages/ui/ shadcn/ui 组件
tooling/ eslint、prettier、tailwind、tsconfig
使用大量 AI 辅助 (Claude) 构建。UI、React 管道、存储和扩展连线主要是 AI 生成的。
加密实现——Rust/WASM 引擎、密钥保护、WebAuthn PRF、Argon2id 配置——是人工设计和人工审查的。我们不信任基于感觉的加密。
MIT
| 层 | 机制 |
|---|
| 加密引擎 | Sequoia-PGP in WASM(密钥仅在生成/导入期间在 JS 中) |
| 密钥解锁 | WebAuthn PRF(通行密钥)或 Argon2id 64 MB(密码) |
| 密钥存储 | AES-256-GCM 带每密钥 AAD |
| 内存 | zeroize crate(Rust)+ 手动清零(JS) |
| 签名 | 原子解密+验证(无 TOCTOU) |
| 会话 | 基于不活动、面板关闭或每次操作自动锁定 |
| 暴力破解 | 解锁失败指数退避 |
| 作用域 | 无内容脚本——仅扩展沙箱 |