Safew里用的双棘轮算法,简单说就是让你的每条消息都有独立、短暂有效的密钥。它把长期密钥和不断演进的临时密钥结合起来,既能防止历史消息被解密,也能在设备被攻破后尽快恢复安全,适合异步消息和文件传输的场景。

先讲结论,再把门打开:双棘轮到底为谁做了什么
如果你平时发消息、传文件,最怕的两件事是:一是过去的聊天被人翻出来(被动泄密),二是设备一旦被攻破,攻破后的时间段里所有消息都不安全(妥协蔓延)。Safew采用的双棘轮(Double Ratchet)算法就是为了解决这两项问题。它通过定期更新密钥、使用短命密钥和不对称密钥交换,让每一条消息都有单独的保护,攻击者拿到某个密钥也不能轻易回溯或无限期解读后续通信。
从费曼角度看:把复杂拆成能解释给小白的几步
费曼写作法告诉我们:能用简单语言解释的东西,你就真的懂了。下面我会一步步拆开双棘轮的“黑箱”,像给朋友解释一样,不用太多学术堆砌,但要把关键点讲清楚。
核心比喻:给每封信配一个一次性保险箱
- 长期钥匙像你和好友约定的一个银行保险箱位置(初始信任),但它本身不会天天用。
- 一次性密钥像每封信装入不同的临时小保险箱,开了之后就扔掉,别人就算后来得到主钥匙,也打不开之前的箱子。
- 不对称更新是一种“定期换锁”的机制:双方偶尔交换新锁(公钥/私钥操作),以产生新的保险箱系列。
双棘轮的两个“棘轮”:什么在转,怎么转
“双”是指两个相互独立但协作的机制:一个是基于不对称加密的DH棘轮(Diffie-Hellman ratchet),另一个是基于对称加密的对称棘轮(symmetric-key ratchet)。两者结合,既能引入新熵(随机性),又能高效地产生大量一次性密钥。
1. DH棘轮(引入新熵、重置信任)
- 双方周期性生成新的临时公私钥对,并通过DH运算产生新的共享秘密(shared secret)。
- 每次进行DH操作,相当于“换锁”,加入全新随机量,防止长期被利用。
- DH棘轮提供的是较强的“后妥协安全”(post-compromise security):即使一段时间内某方被攻破,之后双方再做一次DH交互,历史妥协的影响会被切断。
2. 对称棘轮(高效派生消息密钥)
- 基于一个链式的密钥派生(chain key),通过哈希函数/HKDF连续派生出每条消息的密钥(message key)。
- 这就像一个连锁齿轮,每转一圈就产出一个新密钥;过去的密钥不会被再次使用。
- 对称棘轮高效、速度快,适合大量消息和文件块的加密。
消息流程:从握手到你发我收的每一条消息发生了什么
下面我们用一个简化流程把实际通信的步骤写清楚,按顺序想象你和对方在“说话”。
初始阶段(建立信任)
- 两端通过一次初始握手(比如X3DH类协议)确认彼此身份、交换必要的公钥和初始共享秘密。
- 初始握手会生成一个根密钥(root key),作为后续所有派生的起点。
发送消息(标准路径)
- 发送方用当前的对称链密钥派生出一组消息密钥。
- 消息被对称加密(例如AES-GCM或ChaCha20-Poly1305)并发送,同时附带头部信息(例如当前临时公钥或消息编号)。
- 接收方根据头部信息选择相应的密钥,解密消息。如果消息顺序乱,算法也能用消息编号查找到对应的派生密钥。
不定期的DH更新(重置棘轮)
- 当一方决定做DH更新时,会生成新公私钥对并发送自己的公钥到对方。
- 双方用新的DH值和根密钥混合(通过HKDF)得到新的根密钥和新的链密钥,从而刷新对称棘轮。
结构细节:你手机里存了哪些钥匙(概念化)
| 类型 | 作用 |
| 根密钥(Root Key) | 所有密钥派生的母本,和DH输出合并生成新的根密钥与链密钥 |
| 链密钥(Chain Key) | 对称棘轮的状态,用来生成每条消息的消息密钥 |
| 消息密钥(Message Key) | 逐条消息使用的即时密钥,使用后丢弃 |
| DH私钥/公钥 | 用于执行DH操作,引入新随机性并触发根密钥更新 |
双棘轮带来的四个关键安全属性
- 前向保密(Forward Secrecy):某个时刻的密钥泄露不影响之前已发出的消息,因为消息密钥是一次性的且不可逆回溯。
- 后妥协安全(Post-Compromise Security):即便设备被攻破,双方重新进行DH交换后,未来通信能恢复安全,不再受旧密钥影响。
- 抗重放与抗断档(resilience to out-of-order delivery):算法设计允许消息乱序到达,接收方仍能找到正确密钥解密。
- 异步通信支持:双方不需要同时在线即可安全通讯,适合移动场景。
Safew里双棘轮的实际价值(面向用户的说明)
你可以把这些抽象的密钥更新想象成一系列自动化的“锁更换”。Safew在后台完成这些动作,用户一般无需干预,但能直接受益:
- 聊天记录即使被黑客或执法机构拿到,短期密钥会限制解密范围,泄密成本被大幅抬高。
- 你的某台设备如果被攻陷,只要你和对方任一端继续交换,就能逐步把风险局限,后续对话恢复安全。
- 文件传输也能借助相同的棘轮结构,为每个文件分片或每次发送生成独立密钥,降低单点泄露风险。
常见问题与误区(像跟朋友聊天那样澄清)
问:双棘轮是不是万能保险?
不是。它提升了很多现实风险下的安全性,但并不能防范所有威胁。比如:设备被持续监控(键盘记录器、屏幕录像)、用户泄露密码、备份未加密或被解密等,依然会造成隐私损失。双棘轮主要解决通信层面的密钥管理和消息加密问题。
问:丢失设备或换设备会导致历史消息消失吗?
这取决于Safew的设计策略。如果Safew把消息密钥或会话备份到云端(是否加密、由谁持有解密权),恢复会有不同结果。理想状态下,历史消息即便备份也应采用端到端加密,并由用户掌握解密密钥。
问:会不会因为频繁换密钥导致性能问题?
短答案:不会明显影响用户体验。对称棘轮是轻量级的,DH更新虽然涉及公钥操作,但发生频率适中且在现代移动设备上是可接受的。设计上通常把密钥派生与消息加密分工,保证高吞吐。
工程实现和兼容性要点(给开发者和有技术好奇的用户)
- 常见的曲线与算法组合有:X25519做DH、HKDF做密钥派生、ChaCha20-Poly1305或AES-GCM做消息加密。具体实现会权衡性能与兼容。
- 消息头通常包含发送方临时公钥(若有DH更新),以及消息序号或跳过计数。接收方据此定位合适的链密钥。
- 需要防止密钥重复使用(nonce重复)以及保证密钥状态持久化的安全存储,尤其在多设备场景。
表格:典型的消息交换简要对照
| 步骤 | 发送方动作 | 接收方动作 |
| 握手 | 交换公钥,生成根密钥 | 同上 |
| 消息A | 用链密钥派生messageKey,加密发送 | 用对应messageKey解密 |
| DH更新 | 生成新DH密钥并发送公钥 | 用新公钥计算共享,并重置链密钥 |
| 消息B | 使用新的链密钥派生并发送 | 解密并丢弃messageKey |
对Safew用户的实用建议(不啰嗦,直接可执行)
- 保持客户端更新:加密协议的实现细节会改进,及时更新能获得最新修复与增强。
- 启用强认证方式:登录和设备配对时,使用安全的初始认证(例如短语验证或二维码验证),降低中间人风险。
- 谨慎备份:如果使用云备份,优先选择端到端加密备份,避免把明文或可轻易解密的密钥放到第三方。
- 多设备时关注设备列表:移除不再使用或可疑设备,减少密钥泄露面。
一些你可能想知道但不常讲的细节
嗯,我在想——双棘轮设计上还有一些小技巧,解释起来有点像工匠活:比如对称链密钥一般会保留有限的“跳过”密钥以应对离线的长时间断线;消息头要小心避免泄露太多元数据;实现时要防止时间或计数器回绕导致同一密钥被重用。总之,协议看起来优雅,但工程细节很多,稍不注意就出问题。
参考与背景(便于进一步阅读)
- Trevor Perrin & Moxie Marlinspike — “The Double Ratchet Algorithm”
- Signal Protocol 文档(Signal 团队关于端到端加密的实现细节)
- 相关学术与工程评估:关于双棘轮的安全分析与改进论文
好啦,写到这里我也把脑袋里的顺序梳理清楚了一些。双棘轮其实是把“不把所有鸡蛋放一个篮子”和“经常换锁”的思路程序化、自动化地实现,在像Safew这样的端到端加密产品里,它是把隐私保护做到日常可用的一个关键机制。用起来你不会看到它在转,但每次消息的安全都离不开它。