这份文档说明 MyXin Link 在密码学层面到底保护了什么、中继节点能看到什么、以及哪些信息仍然可见。 我们尽量把「没有做到的部分」也写清楚——隐私声明里最重要的不是承诺,而是可验证的边界。
消息在发送端加密,只有收发双方持有密钥。中继节点只做三件事: 认身份、转发密文、离线暂存密文。它没有解密能力,也没有解密所需的任何密钥。
手机/PC (加密) ──密文帧──▶ 中继(只转发) ──密文帧──▶ 对方设备 (解密)
mx + Crockford-Base32(SHA-256(Ed25519 公钥) 前 10 字节),
显示为 MX-XXXX-XXXX-XXXX-XXXX。它由公钥单向推导,不能反推私钥。| 环节 | 算法 |
|---|---|
| 每条消息的对称密钥 | 发送方每次生成临时 X25519 密钥对,与对方长期公钥做 ECDH |
| 密钥派生 | HKDF-SHA256(salt = 临时公钥 ‖ 接收方公钥,info = mxlink-1to1-v1) |
| 内容加密 | AES-256-GCM,12 字节随机 nonce |
| 附加认证数据 | mxlink-text|from|to|msgId|ts —— 把密文钉死在这条消息上,重放到别的会话会解密失败 |
| 发送者认证 | Ed25519 对整个信封签名(含 payload 摘要) |
| 项 | 做法 |
|---|---|
| 文件密钥 | 发送方随机生成 32 字节,用接收方 X25519 公钥 ECIES 包裹(mxlink-file|xid|name|size|from|to 作为 AAD) |
| 分块 | 每块 32 KB,AES-GCM 独立加密,AAD = mxlink-chunk|xid|seq(块不能互换或重放) |
| 文件名 / 大小 / 类型 | 整段 file-offer 正文用接收方公钥 ECIES 加密,中继看不到 |
| 结束标记 | file-end 同样加密(里面含精确 size) |
| 末块 | 不足 32 KB 时用随机字节补齐,所有分块长度一致,中继无法反推精确大小 |
| 群文件 | 逐成员用各自公钥加密 file-begin(AAD = mxlink-gbegin|from|to|frameId) |
mxlink-group-file|gid|epoch)。| 信息 | 中继可见 | 说明 |
|---|---|---|
| 消息内容 | 不可见 | AES-GCM 密文,密钥只在两端 |
| 文件名 | 不可见 | 随 file-offer / file-begin 正文一起加密 |
| 精确文件大小 | 不可见 | 末块填充到满 32 KB,只能算到 32 KB 精度 |
| 文件内容 | 不可见 | 逐块加密 |
| 群成员名单 | 不可见 | MLS 成员信息在加密的 commit 里 |
| 消息类型(`t`) | 可见 | 如 env / file-offer,路由必需 |
| 收发双方 FriendID | 可见 | 路由必需 |
| 群 ID | 可见 | 判断是否群消息用;随机串,无语义 |
| 消息大小 ≈ 32 KB 粒度 | 可见 | 由分块数量推算 |
| 时间与频率 | 可见 | 可做流量分析(这是任何中继都无法避免的) |
| 连接 IP | 可见 | 中继必须知道连上来的地址;日志已脱敏(1.2.3.*) |
对方离线时,中继会把密文帧暂存,等对方上线后按序补投(保证 MLS 消息顺序)。信箱里存的是:
{ raw: base64(整个密文帧), ts, expires, t } // 按收件人 ID 分桶
MAIL_TTL_DAYS 可配),过期自动删除。raw,也无法伪造(帧内有 Ed25519 签名)。我们没有要求你「相信」以上任何一条。仓库里有一个可复现的测试:
node scripts/selftest-meta-privacy.js
它会启动一个真实中继,收发一个文件名为
绝密_身份证扫描件_张三_2026.pdf 的文件,然后检查中继的落盘数据与日志:
✅ 文件正常送达(功能未受影响)
✅ 中继落盘数据里没有文件名
✅ 中继日志里没有文件名
✅ 中继日志里没有完整用户 ID
✅ 所有分块帧长度一致(末块已填充)
✅ 中继数据里没有 size / fid 明文字段
协议细节见 仓库 的 docs/PROTOCOL.md。
1. 单聊没有前向保密
单聊的接收方使用的是长期 X25519 私钥。一旦该私钥泄露,攻击者可以解密 之前录下的所有消息。群聊(MLS)有完整的 epoch 轮换,因此具备前向/后向保密。
2. 元数据无法完全隐藏
中继必须知道「谁发给谁」才能路由,因此时间、频率、通信对像这些流量元数据是可见的。 要彻底隐藏需要匿名网络(如 Tor),本应用暂未集成。
3. 中继仍能看到连接 IP
日志里已脱敏,但连接期间中继进程内存中有你的 IP。介意的话可以自建中继, 或让中继部署在你信任的网络里。
4. 设备被攻破则一切失效
密钥在设备上,若设备被植入木马或系统被 root,端到端加密保护不了你。
本应用不运营账号体系,也不存储明文。但「不存明文」和「完全去中心化」是两件事: 目前仍有一个中继节点负责转发与离线暂存。它不是信任中心——它看不到内容、 也无法伪造身份——但它是可用性上的单点。你可以随时在设置里换成自己的节点。