MyXin Link

隐私技术说明

版本 1.0 · 2026-10-26 · 与客户端 0.7.4 / 鸿蒙 1.0.2 对应

这份文档说明 MyXin Link 在密码学层面到底保护了什么、中继节点能看到什么、以及哪些信息仍然可见。 我们尽量把「没有做到的部分」也写清楚——隐私声明里最重要的不是承诺,而是可验证的边界。

一、一句话架构

消息在发送端加密,只有收发双方持有密钥。中继节点只做三件事: 认身份、转发密文、离线暂存密文。它没有解密能力,也没有解密所需的任何密钥。

手机/PC (加密)  ──密文帧──▶  中继(只转发)  ──密文帧──▶  对方设备 (解密)

二、身份

三、单聊加密

环节算法
每条消息的对称密钥发送方每次生成临时 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)

五、群聊(MLS / RFC 9420)

六、中继节点能看到什么

信息中继可见说明
消息内容不可见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 分桶

八、怎么验证

我们没有要求你「相信」以上任何一条。仓库里有一个可复现的测试:

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,端到端加密保护不了你。

十、和「去中心化」的关系

本应用不运营账号体系,也不存储明文。但「不存明文」和「完全去中心化」是两件事: 目前仍有一个中继节点负责转发与离线暂存。它不是信任中心——它看不到内容、 也无法伪造身份——但它是可用性上的单点。你可以随时在设置里换成自己的节点。