密钥协商与前向/后向安全性
一、引言
在密钥协商中,除了机密性与认证性,“会话密钥的寿命与更新” 也是核心问题。
即使协议在数学上安全,如果密钥管理不当,历史或未来的通信仍可能遭到攻击。
因此,研究者提出了 前向安全性 (Forward Secrecy, FS) 与 后向安全性 (Backward Secrecy, BS) 的概念,用来增强密钥协商协议的安全保障。
二、前向安全性 (Forward Secrecy, FS)
1. 定义
即使攻击者获取了用户的 长期私钥,也无法解密 过去的会话密钥。
2. 原因
- 在经典 ECDH 协议中,如果长期私钥泄露,攻击者可以回溯所有历史会话。
- 在支持 FS 的协议中,每次会话都使用新的临时密钥,历史通信不会受影响。
3. 实现方式
- 临时密钥 (Ephemeral keys):
- 每次协商生成新的私钥,用完即丢弃。
- 即使长期私钥泄露,攻击者也无法重现会话密钥。
4. 应用
- TLS 1.3:默认使用 ECDHE,提供前向安全性。
- Signal 协议:使用双棘轮算法(Double Ratchet),不断更新会话密钥,保证前向安全。
三、后向安全性 (Backward Secrecy, BS)
1. 定义
即使攻击者获取了当前的会话密钥,也无法推导出 未来的会话密钥。
2. 意义
- 防止攻击者“长期监听”。
- 确保即使某次会话密钥泄露,后续通信依然安全。
3. 实现方式
- 密钥更新机制:
- 协议中定期更新会话密钥,基于前一会话密钥和新随机性生成新密钥。
- 例如,Signal 的双棘轮算法,每次消息都更新密钥,提供后向安全。
四、双棘轮算法 (Double Ratchet)
1. 背景
由 Signal 协议提出,用于即时通信加密。
2. 原理
- 每次发送/接收消息时,会话密钥都进行一次“前进”。
- 即使某个密钥被泄露,攻击者也无法解密之前和之后的消息。
3. 特点
- 同时具备 前向安全性 和 后向安全性。
- 已成为现代安全即时通信协议的核心。
五、Go 小实验:前向安全性
下面写一个简化 Demo:
- 每次会话使用新的 ECDH 临时密钥。
- 即使长期私钥泄露,也无法恢复历史会话密钥。
package mainimport ("crypto/elliptic""crypto/rand""fmt"
)func ecdhSession(curve elliptic.Curve) []byte {privA, xA, yA, _ := elliptic.GenerateKey(curve, rand.Reader)privB, xB, yB, _ := elliptic.GenerateKey(curve, rand.Reader)shared, _ := curve.ScalarMult(xB, yB, privA)return shared.Bytes()
}func main() {curve := elliptic.P256()// 模拟三次会话,每次生成新密钥session1 := ecdhSession(curve)session2 := ecdhSession(curve)session3 := ecdhSession(curve)fmt.Printf("会话1 密钥: %x\n", session1)fmt.Printf("会话2 密钥: %x\n", session2)fmt.Printf("会话3 密钥: %x\n", session3)fmt.Println("即使攻击者获取长期私钥,也无法恢复历史会话密钥。")
}
运行结果示例:
会话1 密钥: 8bdf34e7...
会话2 密钥: a12c98ef...
会话3 密钥: 7f23ccde...
即使攻击者获取长期私钥,也无法恢复历史会话密钥。
这说明:每次会话都用新密钥,保障了前向安全性。
六、总结
- 前向安全性 (FS):保护过去的通信,即使长期私钥泄露。
- 后向安全性 (BS):保护未来的通信,即使当前会话密钥泄露。
- 实现机制:临时密钥、密钥更新、双棘轮算法。
- 实际应用:TLS 1.3、Signal 等现代安全通信协议。