跳到主要内容

6. 密钥更新

QUIC 使用自己的 key update 机制, 不使用 TLS KeyUpdate 消息. 端点为发送和接收分别维护 packet protection secret. 发起 key update 时, 端点从当前写 secret 派生新的写 secret, 并用它保护新的 packet. 新密钥通过 TLS 提供的 KDF 和 "quic ku" 标签生成; header protection key 不随 key update 改变.

Key Phase bit 用于让接收方识别对端是否切换到了下一组 packet protection key. 端点在成功使用下一组 key 解保护 packet 后, 认为对端发起了 key update, 并必须相应更新自己的发送 key.

实现必须避免在处理疑似 key update packet 时泄露 timing side channel. 端点通常应准备当前和下一组接收 key; 在刚完成 key update 后, 可以短时间推迟生成再下一组 key, 以减少同时保留的密钥数量.

端点切换到新 key 后不会再用旧 key 发送 packet. 更高 packet number 的 packet 必须使用与较低 packet number 相同或更新的 packet protection key. 如果端点发现较低 packet number 使用新 key 而较高 packet number 又能用旧 key 成功解保护, 必须视为 KEY_UPDATE_ERROR.

为保护 AEAD 安全边界, 端点必须限制每组 key 下发送的加密 packet 数和接收的认证失败 packet 数. 达到 AEAD 使用限制前, 推荐立即以 AEAD_LIMIT_REACHED 连接错误关闭连接.