MLS 端到端加密
真遇的讨论区采用 MLS(Messaging Layer Security,RFC 9420) 做群组端到端加密。它的核心承诺是:服务器只中转密文,永远不持有群密钥、看不到任何明文。
为什么需要它
Section titled “为什么需要它”多人加密比一对一复杂得多:成员会加入、退出、更换密钥,每一次变化都应让旧密钥失效。MLS 把这件事标准化:它为一组成员维护一个共享的加密上下文,并保证成员变更后向前与向后保密。
| 概念 | 含义 |
|---|---|
| 群(Group) | 一组成员共享的加密上下文;每个活动的讨论区对应一个群 |
| 世代(epoch) | 群的密钥版本;每次成员变更都会产生新世代与新密钥 |
| 成员(Member) | 群内节点;其身份凭证即用户的身份公钥 |
| 密钥包(KeyPackage) | 待入群者发布的公钥材料包,已签名、可校验 |
| Welcome | 邀请者为新成员生成的入群消息,含其加入所需的密钥材料 |
| Commit | 群变更消息(加人 / 移人 / 更新),成员合并后进入新世代 |
| 棘轮(ratchet) | 每条消息推进密钥派生;同一密文只可解密一次,旧世代密文在推进后失效 |
一次入群发生了什么
Section titled “一次入群发生了什么”- 新成员生成密钥包并发布。
- 组织者据此产出 Welcome + Commit,把新成员纳入群。
- 新成员用 Welcome 入群;现有成员合并 Commit,一起进入新世代。
- 此后的消息以新世代的密钥加密,服务器全程只见到不透明的密文。
移除成员同理:一次 Commit 后,被移除者再也无法解密后续消息。
服务器能看到什么
Section titled “服务器能看到什么”- 密文本身、成员公钥与路由元数据(如消息属于哪个活动)。
- 看不到:明文内容、群密钥。
- 因此「服务器持有者」也无法读取讨论内容 —— 这正是隐私承诺的技术底座。
- 「我发的消息自己看不到?」 不是丢消息。发送方不解密自己发出的密文,明文在发送时已本地记录,界面会正常显示。
- 「入群前的消息解不开?」 这是预期的:新成员只能解密加入之后的消息,历史消息不会对其开放。
- 「同一密文解密两次失败?」 棘轮机制决定加密是单向推进的;客户端会缓存解密结果,无需重复尝试。