5.3 SA KEK负载 (SA KEK Payload)
SA KEK负载定义了密钥加密密钥(Key Encryption Key, KEK)安全关联。KEK用于保护GROUPKEY-PUSH消息,使GCKS能够安全地向群组成员推送更新的密钥材料。
SA KEK负载格式
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
! Next Payload ! RESERVED ! Payload Length !
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
! Protocol-ID ! SPI Size ! # of Transforms !
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
! !
~ SPI (variable) ~
! !
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
! !
~ KEK Attributes ~
! !
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
字段说明:
- Next Payload: 下一个负载的类型(通常是SA TEK或其他负载)
- Payload Length: 负载的总长度
- Protocol-ID: 必须 (MUST) 设置为GDOI_PROTO_GDOI_KEK
- SPI Size: SPI的长度(字节)
- # of Transforms: 转换的数量(通常为1)
- SPI: 安全参数索引,用于标识此KEK SA
- KEK Attributes: KEK的属性(见5.3.1节)
KEK的作用
KEK SA的主要功能:
- 保护GROUPKEY-PUSH消息: 加密和认证GROUPKEY-PUSH消息
- 密钥更新: 允许GCKS推送新的TEK或KEK
- 成员管理: 支持成员添加和删除时的重密钥操作
- LKH支持: 可选地支持逻辑密钥层次结构(LKH)
KEK属性
KEK属性定义了KEK的密码学参数和管理信息。属性使用ISAKMP属性格式。
主要的KEK属性包括:
- 5.3.1 KEK属性概述
- 5.3.2 KEK_MANAGEMENT_ALGORITHM
- 5.3.3 KEK_ALGORITHM
- 5.3.4 KEK_KEY_LENGTH
- 5.3.5 KEK_KEY_LIFETIME
- 5.3.6 SIG_HASH_ALGORITHM
- 5.3.7 SIG_ALGORITHM
- 5.3.8 SIG_KEY_LENGTH
- 5.3.9 KE_OAKLEY_GROUP
在GROUPKEY-PULL中的使用
请求阶段
组成员可以 (MAY) 在请求中包含SA KEK负载来建议KEK参数:
SA_KEK {
Protocol-ID = GDOI_PROTO_GDOI_KEK
SPI Size = 0 // 请求时SPI由GCKS分配
Attributes {
KEK_ALGORITHM = AES
KEK_KEY_LENGTH = 128
// 其他建议的属性
}
}
响应阶段
GCKS在响应中发送实际的KEK参数:
SA_KEK {
Protocol-ID = GDOI_PROTO_GDOI_KEK
SPI Size = 4
SPI = 0x12345678 // GCKS分配的SPI
Attributes {
KEK_ALGORITHM = AES
KEK_KEY_LENGTH = 128
KEK_KEY_LIFETIME = 86400 // 24小时
KEK_MANAGEMENT_ALGORITHM = LKH // 如果使用LKH
// 其他实际的属性
}
}
实际的KEK密钥材料通过密钥下载(KD)负载传输。
在GROUPKEY-PUSH中的使用
在GROUPKEY-PUSH消息中,如果需要更新KEK,可以包含SA KEK负载:
SA_KEK {
Protocol-ID = GDOI_PROTO_GDOI_KEK
SPI Size = 4
SPI = 0x12345679 // 新的SPI
Attributes {
KEK_ALGORITHM = AES
KEK_KEY_LENGTH = 256 // 可能升级密钥长度
KEK_KEY_LIFETIME = 86400
// 新的KEK属性
}
}
新的KEK密钥材料通过KD负载传输,并使用旧的KEK保护。
SPI的使用
SPI(安全参数索引)用于标识特定的KEK SA:
- 唯一性: SPI在GCKS管理的所有群组中必须 (MUST) 是唯一的
- 分配: 由GCKS分配
- 生命周期: 在KEK的整个生命周期内保持不变
- 识别: 组成员使用SPI查找用于解密GROUPKEY-PUSH消息的KEK
LKH支持
如果KEK_MANAGEMENT_ALGORITHM属性设置为LKH:
- 初始化: GCKS为每个成员分配LKH树中的位置
- 密钥树: 维护一个密钥树,叶节点对应成员
- 重密钥: 成员加入或离开时,只需更新树中受影响的路径
- 效率: 在大型群组中显著减少重密钥开销
LKH的详细规范在RFC 2627中定义。
处理规则
GCKS规则
GCKS必须 (MUST):
- 分配SPI: 为每个KEK SA分配唯一的SPI
- 设置属性: 根据群组策略设置KEK属性
- 生成密钥: 生成高质量的随机KEK
- 管理生命周期: 在KEK到期前推送新的KEK
组成员规则
组成员必须 (MUST):
- 存储KEK: 安全存储接收到的KEK
- 关联SPI: 将SPI与相应的KEK关联
- 监控生命周期: 跟踪KEK的到期时间
- 使用KEK: 使用KEK解密GROUPKEY-PUSH消息
- 更新KEK: 在收到新KEK时及时更新
安全考虑
KEK是群组安全的关键组件:
- 保密性: KEK必须 (MUST) 保密,只有授权的组成员可以访问
- 完整性: KEK参数和密钥材料必须 (MUST) 受到完整性保护
- 密钥强度: KEK必须 (MUST) 具有足够的加密强度
- 生命周期: KEK应该 (SHOULD) 定期更新以限制妥协的影响
- 前向访问控制: 被移除的成员不应 (SHOULD NOT) 能够解密新的GROUPKEY-PUSH消息
- 后向访问控制: 新成员不应 (SHOULD NOT) 能够解密旧的数据
KEK的妥协将允许攻击者:
- 解密GROUPKEY-PUSH消息
- 获取TEK密钥材料
- 解密群组通信
因此,KEK的保护和管理至关重要。