一句话版本
攻击者可以先把你所有的加密流量录下来,等哪天偷到你的长期私钥,再回头全部解开。前向保密(forward secrecy)就是为了防这一招:每次通信都用用完即扔的临时密钥协商会话密钥,长期私钥只用来证明身份、不参与加密。这样,即使日后长期私钥泄露,过去的通信也无法解密。 实时通信(HTTPS、视频通话、即时消息)都能做到前向保密;但"必须能事后解开"的存储数据,在结构上很难做到,只能靠定期换钥匙、销毁旧钥匙来缩小损失。
全文分三层:
- 通俗理解:一次性的密码本
- 实际用处:TLS 1.3、Signal、视频通话,以及存储加密为什么做不到
- 原理与工程要点:静态 DH 与临时 DH 的对比、双棘轮、密钥轮换
第一层:通俗理解
1.1 先录下来,以后再解
情报机构、高级攻击者的一个常见策略是:现在把加密流量全部存下来,哪怕暂时解不开。等到:
- 某天服务器被入侵,长期私钥被偷;
- 或者某天有了量子计算机(见《后量子密码》);
再回头把存下来的数据全部解密。
1.2 一次性的密码本
如果每次通话都用一本新的、用完就烧掉的密码本,那么:
- 今天的密码本被偷,只能解开今天的通话;
- 昨天、前天的密码本早就烧掉了,录下来的旧通话永远解不开。
这就是前向保密。"长期身份钥匙"仍然存在,但它只用来证明"我是我",不用来加密任何数据。
第二层:实际用处
| 系统 | 前向保密 |
|---|---|
| TLS 1.3(HTTPS) | 强制:只允许临时(EC)DHE 密钥交换。TLS 1.2 及以前允许"用服务器 RSA 公钥直接加密会话密钥",没有前向保密 |
| WebRTC 视频通话 | 每次通话做一次 DTLS 握手,双方都用临时密钥,通话结束即丢弃 |
| Signal / WhatsApp | 双棘轮算法:几乎每轮消息都做一次新的 DH,不仅有前向保密,还有"事后恢复"能力 |
| Telegram 私密聊天 | 定期(按消息数或时间)重新做一次 DH |
| SSH | 密钥交换使用临时 DH |
Heartbleed(2014) 是推动前向保密普及的关键事件:OpenSSL 的这个漏洞可能让攻击者读到服务器内存里的私钥。没有启用前向保密的网站,意味着所有被录下的历史流量都可能被解开。此后各大网站纷纷优先启用 ECDHE,最终 TLS 1.3 直接把它变成了强制要求。
2.1 存储数据为什么做不到
一份加密存储的录音或文件,必须能在将来被解开,否则存它就没有意义。所以接收方必须一直保留能解开它的私钥(见《信封加密》)。只要这把私钥还在,它一旦泄露,所有历史文件都能被解开。
这不是实现上的缺陷,而是需求本身决定的。能做的是缩小爆炸半径:
- 定期轮换接收密钥,每个时间段用一把新的;
- 旧时间段的数据解密并处理完后,销毁旧私钥(或者把数据转用新密钥重新加密后销毁旧钥匙);
- 这样泄露一把钥匙,只影响一个时间段的数据。
第三层:原理与工程要点
3.1 静态 DH 与临时 DH 的对比
玩具 DH:模 13,生成元 2
静态接收方(没有前向保密):接收方长期私钥 ,公钥 。
发送方每次生成临时私钥 ,比如 ,临时公钥 ,共享秘密 ;接收方算 ,两边一致。
存储在服务器上的是 和密文。如果 某天泄露,攻击者对每一份存储的 算 ,就能还原所有历史的共享秘密。
双方都临时(有前向保密):每次通话 和 都是新生成的,用完即删。攻击者事后拿不到任何一个 或 ,录下的 、 毫无用处。(已用 Python 验算。)
3.2 临时密钥 + 长期身份
前向保密不等于不要长期密钥。完整的协议是:
- 双方各生成临时 DH 密钥,交换公钥;
- 用长期身份密钥对握手内容签名(或者用证书证明),防止中间人替换临时公钥;
- 用临时 DH 的结果派生会话密钥。
长期密钥被偷的后果是:攻击者以后可以冒充你(主动攻击),但解不开以前录下的会话(被动攻击)。
3.3 双棘轮:前向保密 + 事后恢复
Signal 的双棘轮算法有两个"棘轮":
- 对称棘轮:每发一条消息,都用 KDF 把当前链密钥推进一步,旧的链密钥立即删除。即使当前密钥泄露,也算不回之前的消息密钥(KDF 是单向的)。这提供前向保密;
- DH 棘轮:每当对方回复,双方就做一次新的 DH,把新鲜的随机性混入。即使某一时刻全部密钥泄露,攻击者也会在几轮消息后"跟丢",因为他不知道新的 DH 私钥。这提供事后恢复(post-compromise security)。
3.4 工程上的坑
| 坑 | 说明 |
|---|---|
| 会话恢复(session resumption) | TLS 的会话票据如果用一把长期不换的密钥加密,就会悄悄破坏前向保密。票据密钥要频繁轮换 |
| 临时密钥没真删 | 留在日志、交换分区、崩溃转储里,等于没扔 |
| 只保护了传输,存储没保护 | 通话本身有前向保密,但如果录音用长期密钥存储,存储这一侧仍然没有 |
| 多人通话经过服务器 | 如果服务器参与解密转发,服务器就能看到明文,和前向保密是两个问题(见《端到端加密对比》) |
总结
| 层次 | 要点 |
|---|---|
| 威胁 | 先录下来,等偷到长期私钥(或有了量子计算机)再解 |
| 方法 | 每次会话用临时密钥协商,用完即删;长期密钥只证明身份 |
| 应用 | TLS 1.3 强制;WebRTC、Signal、SSH 都有 |
| 存储 | 结构上做不到;靠定期轮换、销毁旧钥匙缩小损失 |