一句话版本
"加密"有两种完全不同的意思:传输加密只保护"你的手机到服务器"这一段,服务器能看到明文;端到端加密(E2EE)只有通信双方能解开,服务器只转发密文。 主流应用在这件事上差别很大:WhatsApp、Signal、iMessage 默认端到端加密;Telegram 的普通聊天和所有群聊不是端到端加密,只有手动开启的"私密聊天"才是。此外,端到端加密保护的是内容,不保护"谁在什么时候和谁说话"这类元数据。
全文分三层:
- 通俗理解:寄挂号信和寄保险箱
- 实际用处:各家应用逐一对比
- 原理与工程要点:Signal 协议、身份核对、群聊和多人通话的难点、元数据与备份
第一层:通俗理解
1.1 两种"加密"
| 比喻 | 服务器能看到内容吗 | |
|---|---|---|
| 传输加密 | 你把信交给邮局的密封邮车,邮车很安全,但邮局拆开分拣,再装上另一辆密封邮车送出去 | 能 |
| 端到端加密 | 你把信锁进一个只有收件人有钥匙的保险箱,邮局只负责搬箱子 | 不能 |
很多应用宣传"我们的消息是加密的",指的可能只是第一种。
1.2 为什么有的应用不做端到端
传输加密方便实现很多功能:
- 换新手机后,所有历史消息自动出现(服务器有明文);
- 在网页、电脑、手机上随时同步;
- 服务器端搜索、超大群组、机器人。
端到端加密下,这些都变得困难,因为服务器什么都看不到。
第二层:实际用处
| 一对一聊天 | 群聊 | 语音视频通话 | 默认开启 | 身份核对方式 | |
|---|---|---|---|---|---|
| Signal | E2EE | E2EE | E2EE | 是 | 安全码 / 二维码 |
| E2EE(2016 年起全面默认,采用 Signal 协议) | E2EE | E2EE | 是 | 安全码 / 二维码;密钥透明 | |
| iMessage | E2EE | E2EE | FaceTime E2EE | 是 | 联系人密钥验证 |
| Facebook Messenger | E2EE(2023 年底起默认) | 逐步推进中 | E2EE | 是 | — |
| Telegram | 普通聊天:仅传输加密;私密聊天:E2EE(需手动开启) | 仅传输加密 | 一对一通话 E2EE | 否 | 通话时双方核对几个表情符号 |
| Zoom | — | 可选 E2EE | 可选 E2EE | 否 | — |
几个值得注意的细节:
- Telegram 私密聊天使用经典的模 Diffie–Hellman(2048 位安全素数),客户端会检查参数以防小子群攻击,并定期重新协商密钥(见《Diffie–Hellman与离散对数》、前向保密)。私密聊天只支持一对一、不跨设备同步。
- 后量子升级:Signal 在 2023 年加入了 PQXDH,iMessage 在 2024 年推出 PQ3,都是在原有椭圆曲线密钥交换之外再叠加一层格密码 KEM,防"先存储、后解密"(见《后量子密码》)。
- 备份是常见的漏洞:聊天端到端加密,但云备份不加密,内容就会以另一种形式留在服务器上。WhatsApp 从 2021 年起提供端到端加密备份,Apple 从 2022 年起提供"高级数据保护",但都需要用户手动开启。
第三层:原理与工程要点
3.1 Signal 协议的两个部分
| 阶段 | 算法 | 解决的问题 |
|---|---|---|
| 建立会话 | X3DH(现在是 PQXDH) | 对方不在线也能安全地开始对话:服务器预先存放对方的一批一次性公钥,发起方组合做几次 DH |
| 收发消息 | 双棘轮 | 每条消息一个新密钥,提供前向保密和事后恢复(见《前向保密》) |
服务器的角色只是"公钥分发处"和"密文转发站"。
3.2 端到端加密的软肋:你怎么知道对方的公钥是真的
端到端加密依赖一个前提:你拿到的对方公钥,确实是对方的。如果服务器(或攻破服务器的人)给你一个假公钥,它就能在中间解密再加密,当一个隐形的中间人。
对策都是带外核对(见《带外核对》):
- Signal、WhatsApp:当面扫二维码,或者通过别的渠道比对安全码;
- Telegram 通话:双方在通话里念一遍屏幕上的几个表情符号;
- 密钥透明:WhatsApp、iMessage 把公钥写入可公开审计的日志,客户端自动检查服务器有没有给某人"偷偷换钥匙"(见《哈希链审计日志》、TOFU与公钥钉扎)。
3.3 群聊和多人通话为什么难
- 群聊:每发一条消息,要分别为每个成员加密一份,或者维护一把群密钥并在成员变动时更新。成员一多,开销和复杂度急剧上升。IETF 在 2023 年发布的 MLS(RFC 9420)协议用树形结构把群密钥更新的代价降到 。
- 多人视频通话:通常经过一台转发服务器(SFU)。标准的 WebRTC 里,每个参与者和 SFU 之间各自建立加密连接,SFU 能解密音视频,这就不再是端到端加密。要做到端到端,需要在媒体帧上再加一层加密(WebRTC 的 Encoded Transform / Insertable Streams,或 SFrame 标准),让 SFU 只转发它解不开的帧。
3.4 自建方案的检查清单
如果自己搭建通话或消息系统,可以对照这几个问题:
| 问题 | 说明 |
|---|---|
| 服务器能看到明文吗? | 一对一 WebRTC 是端到端的;经过 SFU 就不是 |
| 有前向保密吗? | 实时通话通常有;存储的内容通常没有(见《前向保密》) |
| 对方身份怎么确认? | 如果公钥或证书指纹经过自己的服务器传递,服务器被攻破就能做中间人;需要提供短码核对 |
| 存储的数据怎么加密? | 用接收方公钥做信封加密(见《信封加密》),服务器只存密文 |
| 元数据呢? | 谁、何时、和谁、多长时间,通常仍然暴露给服务器 |
3.5 元数据
端到端加密保护的是内容。但"谁在什么时间、和谁、联系了多久、多频繁"这些元数据,往往比内容更能说明问题。一位前美国情报官员曾直言:"我们根据元数据杀人。"Signal 用"密封发件人"等技术尽量减少服务器能看到的元数据;大多数应用则仍然能看到完整的社交关系图。
总结
| 层次 | 要点 |
|---|---|
| 区分 | 传输加密:服务器能看;端到端加密:服务器只转发密文 |
| 现状 | Signal、WhatsApp、iMessage 默认 E2EE;Telegram 默认不是 |
| 软肋 | 公钥真假要靠带外核对或密钥透明;云备份;元数据 |
| 难点 | 群聊(MLS)、多人通话(SFU 需要额外一层帧加密) |