Caloogy 文章
English

前向保密:今天的钥匙丢了,昨天的秘密还安全吗

日期
2025 年 11 月 29 日
系列
密码学
阅读
4 分钟
主题
Forward secrecyEphemeral keyTLSSignal

一句话版本

攻击者可以先把你所有的加密流量录下来,等哪天偷到你的长期私钥,再回头全部解开。前向保密(forward secrecy)就是为了防这一招:每次通信都用用完即扔的临时密钥协商会话密钥,长期私钥只用来证明身份、不参与加密。这样,即使日后长期私钥泄露,过去的通信也无法解密。 实时通信(HTTPS、视频通话、即时消息)都能做到前向保密;但"必须能事后解开"的存储数据,在结构上很难做到,只能靠定期换钥匙、销毁旧钥匙来缩小损失。

全文分三层:

  1. 通俗理解:一次性的密码本
  2. 实际用处:TLS 1.3、Signal、视频通话,以及存储加密为什么做不到
  3. 原理与工程要点:静态 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

静态接收方(没有前向保密):接收方长期私钥 x=5x = 5,公钥 X=25≡6X = 2^5 \equiv 6。

发送方每次生成临时私钥 yy,比如 y=7y = 7,临时公钥 Y=27=128≡11Y = 2^7 = 128 \equiv 11,共享秘密 Xy=67≡7X^y = 6^7 \equiv 7;接收方算 Yx=115≡7Y^x = 11^5 \equiv 7,两边一致。

存储在服务器上的是 Y=11Y = 11 和密文。如果 x=5x = 5 某天泄露,攻击者对每一份存储的 YY 算 Y5Y^5,就能还原所有历史的共享秘密。

双方都临时(有前向保密):每次通话 xx 和 yy 都是新生成的,用完即删。攻击者事后拿不到任何一个 xx 或 yy,录下的 XX、YY 毫无用处。(已用 Python 验算。)

3.2 临时密钥 + 长期身份

前向保密不等于不要长期密钥。完整的协议是:

  1. 双方各生成临时 DH 密钥,交换公钥;
  2. 用长期身份密钥对握手内容签名(或者用证书证明),防止中间人替换临时公钥;
  3. 用临时 DH 的结果派生会话密钥。

长期密钥被偷的后果是:攻击者以后可以冒充你(主动攻击),但解不开以前录下的会话(被动攻击)。

3.3 双棘轮:前向保密 + 事后恢复

Signal 的双棘轮算法有两个"棘轮":

3.4 工程上的坑

坑 说明
会话恢复(session resumption) TLS 的会话票据如果用一把长期不换的密钥加密,就会悄悄破坏前向保密。票据密钥要频繁轮换
临时密钥没真删 留在日志、交换分区、崩溃转储里,等于没扔
只保护了传输,存储没保护 通话本身有前向保密,但如果录音用长期密钥存储,存储这一侧仍然没有
多人通话经过服务器 如果服务器参与解密转发,服务器就能看到明文,和前向保密是两个问题(见《端到端加密对比》)

总结

层次 要点
威胁 先录下来,等偷到长期私钥(或有了量子计算机)再解
方法 每次会话用临时密钥协商,用完即删;长期密钥只证明身份
应用 TLS 1.3 强制;WebRTC、Signal、SSH 都有
存储 结构上做不到;靠定期轮换、销毁旧钥匙缩小损失