Thales 密钥块是 Thales payShield HSM 用于安全存储和传输密码密钥的专有格式。虽然 TR-31 是行业标准,但 Thales 密钥块仍被广泛使用。本指南介绍格式结构、头部布局以及与 TR-31 的区别。
什么是 Thales 密钥块?
Thales 密钥块是一个结构化容器,将密码密钥与元数据、完整性检查和加密包装在一起。它提供:
- 在 LMK 变体下加密密钥
- 密钥类型标识
- 完整性验证
- 格式版本控制
Thales 密钥块的应用场景
- Thales payShield 10K 及旧型号
- 支付处理网络
- ATM 密钥管理
- 银行间密钥交换
- 传统支付基础设施
Thales 密钥块结构
Thales 密钥块有特定的布局:
+------------------+
| 头部 | 2字节:版本 + 密钥类型
+------------------+
| 密钥长度 | 2字节:加密密钥的长度
+------------------+
| 加密密钥 | 可变长度:LMK 变体下的密钥
+------------------+
| KCV | 3字节:密钥校验值
+------------------+
| 填充 | 可选:用于对齐
+------------------+
头部格式
头部标识密钥块格式和密钥类型:
| 字段 | 长度 | 描述 |
|---|---|---|
| 版本 | 1字节 | 格式版本标识符 |
| 密钥类型 | 1字节 | 密钥用途 |
| 密钥长度 | 2字节 | 加密密钥数据的长度 |
密钥类型代码
| 代码 | 密钥类型 | 描述 |
|---|---|---|
| 00 | ZMK | 区域主密钥 |
| 01 | ZPK | 区域 PIN 密钥 |
| 02 | TPK | 终端 PIN 密钥 |
| 03 | TMK | 终端主密钥 |
| 04 | PVK | PIN 验证密钥 |
| 05 | CVK | 卡验证密钥 |
| 06 | DEK | 数据加密密钥 |
| 07 | BDK | 基础派生密钥(DUKPT) |
| 08 | IKK | 初始密钥(DUKPT) |
头部详解
版本字节
版本字节表示格式版本:
| 值 | 版本 | 备注 |
|---|---|---|
| 0x00 | 版本 0 | 原始格式 |
| 0x01 | 版本 1 | 包含额外标志 |
| 0x02 | 版本 2 | 扩展属性 |
密钥长度编码
密钥长度编码为 2 字节,大端序:
0x0010 = 16字节(双长度密钥)
0x0018 = 24字节(三长度密钥)
加密密钥部分
加密密钥是密钥块的核心。
LMK 变体加密
密钥在 LMK 变体下加密:
加密密钥 = E(LMK XOR 变体, 明文密钥)
不同密钥类型使用不同变体(参见 Thales LMK 指南)。
密钥填充
密钥可能被填充以满足对齐要求:
- DES 密钥:8 字节对齐
- AES 密钥:16 字节对齐
密钥校验值(KCV)
密钥块末尾的 KCV 用作完整性检查。
KCV 计算
标准方法:
KCV = E(Key, 0000000000000000) 的前 3 字节
KCV 用途
- 导入后验证密钥完整性
- 交换期间确认密钥匹配
- 检测传输过程中的损坏
TLV 结构
一些 Thales 密钥块使用标签-长度-值(TLV)结构来存储扩展属性。
TLV 格式
标签(1-2字节)| 长度(1-2字节)| 值(可变长度)
常见标签
| 标签 | 描述 |
|---|---|
| 0x01 | 密钥类型 |
| 0x02 | 密钥长度 |
| 0x03 | 密钥用途 |
| 0x04 | 可导出性 |
| 0x05 | 算法 |
Thales 密钥块与 TR-31 对比
了解差异对于迁移和互操作性很重要。
格式对比
| 特性 | Thales 密钥块 | TR-31 |
|---|---|---|
| 标准 | 专有 | ANSI X9.143 |
| 厂商 | 仅 Thales | 厂商中立 |
| 头部 | 固定 4 字节 | 可变长度 |
| 密钥绑定 | 基本 | 密码学绑定 |
| 属性 | 有限 | 全面 |
| 版本控制 | 简单 | 详细 |
属性对比
| 属性 | Thales | TR-31 |
|---|---|---|
| 密钥用途 | 类型代码 | A-Z 代码 |
| 算法 | 隐含 | 显式 |
| 可导出性 | 标志 | 多种模式 |
| 有效性 | 不包含 | 可选 |
迁移考虑
从 Thales 迁移到 TR-31 时:
- 将密钥类型代码映射到 TR-31 用途代码
- 添加算法属性
- 设置可导出性标志
- 以 TR-31 格式重新生成密钥块
- 转换后验证 KCV
实际应用场景
密钥导入
导入 Thales 密钥块:
- 解析头部获取密钥类型
- 提取加密密钥
- 在适当的 LMK 变体下解密
- 重新加密以存储
- 验证 KCV
密钥导出
将密钥导出为 Thales 密钥块:
- 从请求获取密钥类型
- 从存储中解密密钥
- 在目标 LMK 变体下加密
- 使用密钥类型构建头部
- 计算 KCV
- 组装密钥块
密钥交换
在 HSM 之间交换 Thales 密钥块:
- 从源 HSM 导出密钥块
- 传输密钥块(安全通道)
- 导入目标 HSM
- 目标验证 KCV
- 双方现在拥有相同的密钥
常见问题
版本不匹配
如果导入失败:
- 检查版本字节兼容性
- 确保 HSM 支持该版本
- 可能需要降级格式
密钥类型混淆
错误的密钥类型会导致:
- 解密失败(错误的变体)
- KCV 不匹配
- 操作错误
长度错误
常见长度问题:
- 字节序错误
- 包含/排除填充
- 头部长度计算错误
最佳实践
- 始终验证 KCV,密钥导入后
- 记录使用的密钥类型,在您的系统中
- 使用一致的格式,跨 HSM
- 计划迁移到 TR-31,以面向未来
- 测试密钥交换,在生产前
在线体验
使用我们的 Thales 密钥块工具:
- 解析 Thales 密钥块头部
- 提取密钥类型和长度
- 了解 TLV 结构
- 与 TR-31 格式对比
该工具完全在浏览器中运行——数据不会离开您的设备。