TR-31(也称为 ANSI X9.143)是安全封装和传输加密密钥的行业标准格式。本指南提供该格式的全面概述。
什么是 TR-31?
TR-31 是一种密钥块规范,提供:
- 密钥加密:在传输过程中保护密钥
- 密钥绑定:将密钥属性与密钥材料密码学绑定
- 完整性保护:检测篡改
- 密钥用途控制:定义密钥的使用方式
TR-31 旨在替代不安全的做法——将密钥作为纯密文传输(在 KEK 下加密,但不绑定任何属性)。它现在是 PCI PIN 的要求,并被 Thales、Futurex 和 Atalla 等 HSM 厂商 广泛采用。
密钥块结构
TR-31 密钥块由以下几部分组成:
[版本][块长度][密钥用途][算法][模式][密钥版本][可导出性][可选块][密钥数据][MAC]
头部字段
| 字段 | 长度 | 描述 |
|---|---|---|
| 版本 ID | 1 | 'A'(TDES)、'B'(TDES-KD)、'C'(TDES-V)、'D'(AES) |
| 块长度 | 4 | 总块长度(十六进制字节数) |
| 密钥用途 | 2 | 密钥用途(P0、K0、B0 等) |
| 算法 | 1 | 密钥算法(T=TDES,A=AES) |
| 使用模式 | 1 | 密钥使用方式(E=仅加密等) |
| 密钥版本 | 2 | 版本号 |
| 可导出性 | 1 | 导出限制(E、N、S) |
| 可选块数 | 2 | 可选块数量 |
密钥用途代码
常见密钥用途代码:
| 代码 | 描述 |
|---|---|
| P0 | PIN 加密密钥——用于加密 PIN 块 |
| B0 | BDK 基础派生密钥——用于 DUKPT |
| K0 | 密钥加密/封装密钥 |
| M0 | ISO 9797-1 MAC(算法 1) |
| M3 | ISO 9797-1 MAC(算法 3)——参见 MAC 指南 |
| D0 | 数据加密对称密钥 |
| V0 | PIN 验证密钥(VISA PVV) |
使用模式
| 代码 | 描述 |
|---|---|
| B | 加密和解密均可 |
| C | 计算(仅 MAC 生成) |
| D | 仅解密 |
| E | 仅加密 |
| G | 生成密钥 |
| N | 无特殊限制 |
| S | 仅签名 |
| V | 验证(仅 MAC 验证) |
| X | 密钥派生 |
可导出性
| 代码 | 描述 |
|---|---|
| E | 可导出(在受信任密钥块中) |
| N | 不可导出 |
| S | 敏感(仅可导出到不可导出目标) |
版本差异
版本 A(原始 TDES)
- 使用 TDES 密钥封装
- 16 字节 MAC
- 基本安全性
版本 B(TDES 密钥派生)
- 封装前使用密钥派生
- 改进的密码学绑定
- 16 字节 MAC
版本 C(TDES 变体)
- 使用 CMAC 替代 X9.19 MAC——参见 CMAC 工具
- 更好的完整性保护
版本 D(AES)
- 使用 AES 进行密钥封装(AES-256 KBPK)
- CMAC 用于认证
- 最强安全性
- 新实现推荐使用
关于 AES 与 TDES 安全性的背景,参见 AES 指南 和 DES/3DES 指南。
TR-31 与 Thales 密钥块
Thales HSM 也有专有的"Thales 密钥块"格式。TR-31 是开放标准,而 Thales 密钥块专用于 Thales payShield HSM。使用 Thales 密钥块工具 处理 Thales 专有格式,使用 TR-31 工具 处理标准格式。
安全最佳实践
- 使用版本 D:基于 AES 的保护最强
- 强 KBPK:使用 256 位 AES KBPK
- 使用前验证:解密前始终验证 MAC
- 遵守限制:尊重可导出性和模式标志
- 密钥轮换:定期轮换 KBPK
关于将 KBPK 加载到 HSM 的密钥分片,参见 密钥分片与 KCV 指南。
常见问题
"MAC 验证失败"
- KBPK 不匹配
- 密钥块损坏
- 版本解码错误
"无效密钥长度"
- 算法不匹配
- 填充问题
"未知密钥用途"
- 不支持或厂商特定代码
亲自尝试
使用 TR-31 密钥块工具:
- 将密钥编码为 TR-31 格式
- 解码和验证现有密钥块
- 查看所有头部字段和属性
- 支持所有版本(A、B、C、D)
所有处理在您的浏览器本地完成,确保最大安全性。