服务端不解密、不记录密文、不存储可逆账号字段。私钥仅在客户端安全存储。 从应用层到内核网络栈,每一层都假设数据库已被对手拿走。
不自研密码学。所有 E2EE 都由 libsignal 完成;账号派生链经过单向哈希与 Argon2id 加固。
首次会话通过预密钥包完成 ECDH 多边握手;公钥上传,私钥入 flutter_secure_storage。
每条消息轮换发送密钥与接收密钥;单条消息泄漏不影响历史与未来消息。
客户端用 serverpod_argon2(Zig 原生)在 Isolate.run 里跑;服务端只比对 PHC 串。
信封投递后清除路由元数据,ack 即删除;离线密文 24h TTL 兜底。
登录用 HMAC-SHA256(credential, nonce) 挑战响应;WebSocket 用 30s 一次性 ticket,token 不入 URL。
服务端只绑 127.0.0.1:8080;WS CheckOrigin 拒绝所有不在白名单内的 Origin,绝不 return true。
六层防御,从应用协议到内核网络栈。
服务端允许做的事,与服务端被禁止做的事,全部写进协议。
| 允许 | 禁止 |
|---|---|
| 转发密文信封,按收件人投递 | 解密、记录、索引密文内容 |
| 存储 account_id 与 Argon2id PHC | 存储可逆用户名或明文密码 |
| 在线推送 envelope 帧,ack 后删除 | 用内存 Map 当生产 store |
| 按 IP 做连接数与速率限制 | 记录 JWT、Origin、口令明文 |
| 发布结构化事件流给 sidecar | 在防御层解密密文或还原会话 |
单一配置源:所有服务器配置收敛到 config/config.yaml,渲染派生出容器、反向代理、策略与内核过滤。
# 1. 拉代码 git clone https://github.com/Maxx-EX/paperplane-e2ee.git cd paperplane-e2ee # 2. 改唯一配置(密钥、域名、网卡) ${EDITOR:-vi} config/config.yaml # 3. 渲染派生配置 + 起服务 ./scripts/render-config.sh cd deploy && docker compose up -d # 4. 健康检查 curl https://chat.example.com/healthz
完整密码学模型、自托管步骤、已知错误清单与 Termux 教程。
账号派生链、X3DH 信封、Sealed Sender、零知识承诺表。
改 config、render、docker compose up、验证健康检查。
在 Android 手机上跑服务端,用 proot Ubuntu 编译 APK。
A–J 协议层 + K-1–K-9 内核/策略层踩坑与防御。
组件职责、请求流、数据流、配置流。
打 tag 后 CI 自动构建 release APK。