Skip to main content

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的主要功能:

  1. 保护GROUPKEY-PUSH消息: 加密和认证GROUPKEY-PUSH消息
  2. 密钥更新: 允许GCKS推送新的TEK或KEK
  3. 成员管理: 支持成员添加和删除时的重密钥操作
  4. LKH支持: 可选地支持逻辑密钥层次结构(LKH)

KEK属性

KEK属性定义了KEK的密码学参数和管理信息。属性使用ISAKMP属性格式。

主要的KEK属性包括:

在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:

  1. 初始化: GCKS为每个成员分配LKH树中的位置
  2. 密钥树: 维护一个密钥树,叶节点对应成员
  3. 重密钥: 成员加入或离开时,只需更新树中受影响的路径
  4. 效率: 在大型群组中显著减少重密钥开销

LKH的详细规范在RFC 2627中定义。

处理规则

GCKS规则

GCKS必须 (MUST):

  1. 分配SPI: 为每个KEK SA分配唯一的SPI
  2. 设置属性: 根据群组策略设置KEK属性
  3. 生成密钥: 生成高质量的随机KEK
  4. 管理生命周期: 在KEK到期前推送新的KEK

组成员规则

组成员必须 (MUST):

  1. 存储KEK: 安全存储接收到的KEK
  2. 关联SPI: 将SPI与相应的KEK关联
  3. 监控生命周期: 跟踪KEK的到期时间
  4. 使用KEK: 使用KEK解密GROUPKEY-PUSH消息
  5. 更新KEK: 在收到新KEK时及时更新

安全考虑

KEK是群组安全的关键组件:

  • 保密性: KEK必须 (MUST) 保密,只有授权的组成员可以访问
  • 完整性: KEK参数和密钥材料必须 (MUST) 受到完整性保护
  • 密钥强度: KEK必须 (MUST) 具有足够的加密强度
  • 生命周期: KEK应该 (SHOULD) 定期更新以限制妥协的影响
  • 前向访问控制: 被移除的成员不应 (SHOULD NOT) 能够解密新的GROUPKEY-PUSH消息
  • 后向访问控制: 新成员不应 (SHOULD NOT) 能够解密旧的数据

KEK的妥协将允许攻击者:

  • 解密GROUPKEY-PUSH消息
  • 获取TEK密钥材料
  • 解密群组通信

因此,KEK的保护和管理至关重要。