4.2 Signal 双棘轮与前向保密


4.2 Signal 双棘轮与前向保密

本节摘要:Signal 协议把密钥安全从"会话级"细化到"消息级":双棘轮让每条消息用的密钥都不同且用后即毁,敌手夺得当前密钥也读不到过去、解不了未来。本节把 DH 棘轮与对称棘轮两条线拆开手推,讲清前向保密与自愈性分别在哪个动作上兑现,并指出初始信任建立为什么是整个体系真正的软肋。读完你能画出棘轮链,并解释"每条消息一把钥匙"不是噱头而是结构。

与 TLS 的处境差异:为什么需要另一种结构

先看清 Signal 要解的题与 TLS 有何不同。TLS 的世界是同步的:两端在线、往返握手、立刻开传。即时通信的世界是异步的:对方可能三天不上线,消息离线排队,设备可能中途换。若沿用"一次握手管一个会话"的结构,会遭遇两个难题:其一,长期不换的会话密钥让"泄露一次、全史泄露"成为现实威胁;其二,离线排队意味着不能指望随时协商。双棘轮的答案是:把密钥演化内置到消息流本身——每发一条消息就翻一页密钥,不需要额外往返。

命题(2.3 节模板):在敌手日后夺得某一时刻的会话状态(当前密钥链页、可选地连同长期身份私钥)的前提下,敌手无法读出此前已收发的消息(前向保密);若敌手只夺得当前对称密钥页而未夺得长期身份密钥,则在正常收发推进后,敌手自动失去对后续消息的解密能力(自愈性)。注意这两个承诺都比 TLS 1.3 的会话级前向保密强一档:粒度从"这次连接"细到"这条消息"。

手推两条棘轮线

第一条线:DH 棘轮(翻"大页")。 双方各持长期身份密钥对;会话初始化时,发起方生成一个临时 DH 密钥对,连同身份签名发出去。此后每当通信方向即将切换(比如我发完一串、该你回了),发起方就生成新的临时 DH 密钥对放进消息头,双方用"新临时私钥 × 对方最新临时公钥"算出新的 DH 共享值,混入密钥链。这个动作像棘轮只能单向扳动:密钥链只前进、不后退。敌手若夺得当前的临时私钥,能算出当前页与未来页的输入——除非他同时拿到未来的新临时私钥(他拿不到,那还没生成);而过去页的临时私钥早已在翻页时删除,数学上无法从当前材料反推历史共享值(离散对数难题兜底)。前向保密就兑现在这个"用后即焚"上。

第二条线:对称棘轮(每条消息翻"小页")。 在同一个 DH 大页内部,每发一条消息都用密钥派生函数把链密钥推进一格:链密钥 K 派生出消息密钥 m 与下一格链密钥,m 用于加密本条消息后即毁,只留下一格链密钥。消息密钥是单行的——重放与乱序靠消息头里的序号与前一页密钥的"跳格补算"处理:接收方发现序号跳跃时,把中间缺失的格依次推进出来存入缓存,供乱序到达的消息解密。对称棘轮的意义是把翻页粒度再细一层:哪怕同一个 DH 大页内,每条消息的密钥也互不相同

【双棘轮手推笔记】 方向切换时(DH棘轮, 翻大页): A 发送链末尾附带新临时公钥 DHa_new B 收到后回复自己的临时公钥 DHb_new 双方: 新链根 = KDF( DH(新临时私钥, 对方新临时公钥) ) 旧临时私钥: 立即删除 ← 前向保密的兑现点 同一方向连发时(对称棘轮, 翻小页): 链密钥 K → m = KDF(K, 消息密钥) ; K' = KDF(K, 下一格) 用 m 加密本条消息后 m 即毁 K' 留给下一条消息 ← 每条消息密钥不同 自愈性推演: 敌手在某一刻夺得对称链密钥 K → 能解"此刻之后"的消息(在下一页翻页前) → 下一次方向切换引入新临时 DH, 敌手无私钥材料 → 新页的根与新链他推不出来, 攻击窗口自动关闭 ← 这就是自愈性

图 4-2 双棘轮演化示意:密钥链只进不退

图 4-2 双棘轮演化示意:密钥链只进不退

三个推演问题:用敌手的嘴检验结构

手推完成后,用敌手的三种口吻把结构再盘问一遍——每一问都对应一类真实威胁,答案全部藏在前面两个机制里。

**第一问:"我把你的全部流量都录下来了,等你哪天换手机把旧设备清退,我再拿到你的长期身份私钥,能解什么?"**能解的只有:用该长期私钥签过名的初始握手(若该会话仍存活)。会话内部的消息由临时 DH 保护,临时私钥翻页即焚,与长期私钥没有可逆的数学联系——历史消息依然封存。这就是"录制今天、解密明天"这条攻击线在双棘轮面前能走到的尽头,也是 6.1 节"先存后解"威胁在消息协议里的对策现状。

第二问:"我不等以后了,我现在就夺取这台设备的完整会话状态——当前 DH 页、对称链密钥,全都要。"你得到的是当前窗口:能解此刻之后、下一次方向切换之前的消息。旧页早已焚毁,读不到过去;下次通信方向切换引入你不在场生成的新临时公钥,新页根你推不出来——攻击窗口自动关闭。注意这道题的答案里藏着一个前提:若你连长期身份私钥一起拿走,就可以冒充本人发起会话——自愈性护的是本会话的后续,不护身份。这就是为什么密钥变更告示在产品层如此关键。

**第三问:"我伪造不出密文,那我重放一条你以前发过的密文呢?"**对称棘轮的序号与跳格补算会暴露异常:重放消息的序号指向已推进过的格子,接收端识别为重复或过旧而拒绝。密钥的单行性让"旧话再说"无法伪装成"新话"——这与第 1 章 NS 协议里临时值的新鲜性一脉相承,只是粒度细到了每条消息。

回头看一眼这个结构为什么叫"棘轮"而不是"钟摆":钟摆可逆,棘轮只进。整个结构的全部安全承诺——前向保密、自愈性——都压在"只进不退"四个字上:密钥链能前进是因为派生函数可正向计算,不能后退是因为反向推导被离散对数难题与单向派生函数挡死。评审任何"类棘轮"设计时,第一问就该是"你的链靠什么保证不可逆"——拿哈希链冒充密钥链、用可逆运算充当单向性的方案,都会倒在这一问上。

真正的软肋:初始信任与设备管理

棘轮结构再精巧,也护不住起点。双方第一次交换身份公钥时,谁来保证那是"真人的公钥"而非中间人的?TLS 用证书体系回答了这个问题,而即时通信没有可用的全球 PKI——Signal 的选择是信任首用(第一次连接时的公钥指纹被记住,之后任何变更都报警)与安全编号比对(双方各自算出一个由双方指纹派生的编号,线下当面或视频核对一致,即确认无中间人)。这套机制把信任责任从基础设施移到了用户行为——它有效,但依赖用户真的去比对。评审一个端到端加密产品时,问"初始信任怎么建立、密钥变更时用户会看到什么",比问"用什么加密算法"更能测出产品的安全成色。

第二个软肋是多设备。每台设备有自己的身份密钥与独立的棘轮链,"同一个账号"其实是多条并行会话。设备增删时旧设备的密钥材料如何处置、历史消息是否同步到新设备(同步则历史以密文形态多存一份,攻击面随之扩大)、丢设备后如何把该设备的链踢出会话——这些问题协议只提供原语,答案取决于产品设计。真实事故里端到端加密的突破口极少在棘轮,多数在设备交接与备份功能上——这与 3.3 节"实现层失守"的教训一脉相承:协议承诺到端点为止,端点之间的搬运与存储是另一门功课。

本节要点回顾

  • 双棘轮 = DH 棘轮 + 对称棘轮:方向切换翻大页、每条消息翻小页,密钥链只进不退。
  • 前向保密兑现于"用后即焚":临时私钥在翻页时删除,当前材料无法反推历史共享值。
  • 自愈性兑现于"新页换血":被夺密钥的攻击窗口在下次方向切换时自动关闭,前提是长期身份密钥未失守。
  • 初始信任是体系软肋:信任首用加安全编号比对,把信任责任移到用户行为;密钥变更告示是产品成色的试金石。
  • 多设备是真实事故高发区:协议给原语,设备交接、备份同步的设计决定了实际安全下限。

下一节把四条主线(TLS、Signal、Noise、IPSec)摆上同一张桌子:信任模型、前向保密、元数据、部署成本四个维度逐项对比,把"选哪个协议"变成一道可以论证的题。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U