ZERO-KNOWLEDGE · END-TO-END ENCRYPTED · SELF-HOSTABLE

纸飞机风格的
零知识 E2EE 通信平台

服务端不解密、不记录密文、不存储可逆账号字段。私钥仅在客户端安全存储。 从应用层到内核网络栈,每一层都假设数据库已被对手拿走。

Go 1.25 Flutter 3.24 libsignal 0.8.2 eBPF/XDP libbpf Postgres 16 Redis 7 Caddy 2

协议栈

不自研密码学。所有 E2EE 都由 libsignal 完成;账号派生链经过单向哈希与 Argon2id 加固。

X3DH

IdentityKey + SignedPreKey + OneTimePreKey

首次会话通过预密钥包完成 ECDH 多边握手;公钥上传,私钥入 flutter_secure_storage。

DOUBLE RATCHET

前向保密 / 未来保密

每条消息轮换发送密钥与接收密钥;单条消息泄漏不影响历史与未来消息。

ARGON2ID

m=64 MiB · t=3 · p=1

客户端用 serverpod_argon2(Zig 原生)在 Isolate.run 里跑;服务端只比对 PHC 串。

SEALED SENDER

盲令牌信封

信封投递后清除路由元数据,ack 即删除;离线密文 24h TTL 兜底。

JWT

HS256 · 只含 account_id

登录用 HMAC-SHA256(credential, nonce) 挑战响应;WebSocket 用 30s 一次性 ticket,token 不入 URL。

TRANSPORT

Caddy 终止 TLS · Origin 精确白名单

服务端只绑 127.0.0.1:8080;WS CheckOrigin 拒绝所有不在白名单内的 Origin,绝不 return true。

架构

六层防御,从应用协议到内核网络栈。

Flutter Client libsignal · secure storage Argon2id (Isolate) Caddy TLS termination WS upgrade Go Relay HTTP + WebSocket zero-knowledge rate limits (Redis) Origin whitelist PostgreSQL account_id + PHC Redis nonce · ticket · events Kotlin Sidecar Redis Streams · rules CrowdSec LAPI XDP / eBPF

零知识承诺

服务端允许做的事,与服务端被禁止做的事,全部写进协议。

允许禁止
转发密文信封,按收件人投递解密、记录、索引密文内容
存储 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、验证健康检查。

Termux 教程 →

在 Android 手机上跑服务端,用 proot Ubuntu 编译 APK。

已知错误清单 →

A–J 协议层 + K-1–K-9 内核/策略层踩坑与防御。

架构说明 →

组件职责、请求流、数据流、配置流。

Releases →

打 tag 后 CI 自动构建 release APK。