GM/T 0017-2023 智能密码钥匙数据格式规范:国密USBKey的互操作基石
概述
GM/T 0017-2023《智能密码钥匙密码应用接口数据格式规范》是国密USBKey体系中的数据存储层标准,与GM/T 0016-2023(接口规范)形成"接口+数据"的完整技术体系。
核心问题:USBKey内部如何存储密钥、证书、应用数据?不同厂商的设备如何实现数据结构的统一?
答案:GM/T 0017定义了标准化的数据对象格式,确保各厂商USBKey在存储层实现互操作。
标准定位与体系关系
1. 标准体系中的位置
CODE
┌─────────────────────────────────────────────┐
│ 应用层(业务系统) │
├─────────────────────────────────────────────┤
│ GM/T 0016-2023 密码设备应用接口规范 │ ← 接口层(API)
│ (定义命令格式、响应结构) │
├─────────────────────────────────────────────┤
│ GM/T 0017-2023 数据格式规范 │ ← 数据层(存储)
│ (定义密钥对象、证书、数据的编码格式) │
├─────────────────────────────────────────────┤
│ 硬件层(USBKey芯片、OS) │
└─────────────────────────────────────────────┘2. 与相关标准的协同
| 标准编号 | 层级 | 作用 |
|---|---|---|
| GM/T 0016-2023 | 接口层 | 定义APDU命令格式、会话管理、认证流程 |
| GM/T 0017-2023 | 数据层 | 定义密钥对象、证书、应用的存储格式 |
| GM/T 0027-2014 | 硬件层 | 定义USBKey硬件安全边界、物理特性 |
核心数据结构
1. 密钥对象编码(Key Object Encoding)
GM/T 0017规定了SM2、SM3、SM4等密钥在USBKey内部的存储格式:
CODE
密钥对象结构:
┌─────────────────────────────────────────────┐
│ 对象ID(Object ID) 4字节 │
├─────────────────────────────────────────────┤
│ 密钥类型(Key Type) 1字节 │
│ 0x01 = SM2私钥 │
│ 0x02 = SM2公钥 │
│ 0x03 = SM3/HMAC-SM3密钥 │
│ 0x04 = SM4密钥 │
├─────────────────────────────────────────────┤
│ 密钥长度(Key Length) 2字节 │
│ SM2: 32字节 (256位) │
│ SM4: 16字节 (128位) │
├─────────────────────────────────────────────┤
│ 密钥值(Key Value) 可变长 │
├─────────────────────────────────────────────┤
│ 权限标记(Access Rights) 1字节 │
│ bit0: 可导出(Exportable) │
│ bit1: 可签名(Sign) │
│ bit2: 可验证(Verify) │
│ bit3: 可加密(Encrypt) │
│ bit4: 可解密(Decrypt) │
└─────────────────────────────────────────────┘关键约束:
- SM2私钥禁止导出(Exportable位必须为0)
- SM4密钥允许导出(需访问权限控制)
- 密钥长度必须符合算法标准(如SM2私钥固定32字节)
2. 证书对象编码(Certificate Object)
GM/T 0017定义了国密X.509证书在USBKey内部的存储格式:
CODE
证书对象结构:
┌─────────────────────────────────────────────┐
│ 对象ID(Object ID) 4字节 │
├─────────────────────────────────────────────┤
│ 证书格式(Format) 1字节 │
│ 0x01 = X.509 v3(国密扩展) │
│ 0x02 = X.509 v3(PKI标准) │
├─────────────────────────────────────────────┤
│ 证书长度(Certificate Length) 4字节 │
├─────────────────────────────────────────────┤
│ 证书数据(Certificate Data) 可变长 │
│ (DER编码的X.509证书) │
├─────────────────────────────────────────────┤
│ 关联密钥ID(Linked Key ID) 4字节 │
│ (指向对应的私钥对象) │
└─────────────────────────────────────────────┘国密证书特殊要求:
- 必须包含国密OID扩展(1.2.156.10197.x系列)
- 签名算法字段必须标识SM2WithSM3(1.2.156.10197.1.501)
- 密钥用法扩展(Key Usage)必须包含digitalSignature
3. 应用对象编码(Application Object)
GM/T 0017支持多应用架构,每个应用有独立的数据空间:
CODE
应用对象结构:
┌─────────────────────────────────────────────┐
│ 对象ID(Object ID) 4字节 │
├─────────────────────────────────────────────┤
│ 应用标识(App ID) 8字节 │
│ (类似ICCID,全局唯一) │
├─────────────────────────────────────────────┤
│ 应用名称(App Name) 可变长 │
│ (UTF-8编码) │
├─────────────────────────────────────────────┤
│ 应用权限(App Permissions) 1字节 │
│ bit0: 可初始化(Initialize) │
│ bit1: 可管理密钥(Manage Keys) │
│ bit2: 可执行密码操作(Crypto Ops) │
├─────────────────────────────────────────────┤
│ 数据存储区(Data Store) 可变长 │
│ (应用私有数据) │
└─────────────────────────────────────────────┘新旧版本关键差异
GM/T 0017-2012 vs 2023版对比
| 对比项 | 2012版 | 2023版 | 影响 |
|---|---|---|---|
| 密钥类型支持 | SM2、SM1(隐含) | SM2、SM3、SM4显式定义 | 更清晰,覆盖更广 |
| 证书格式 | 仅支持X.509 v3 | X.509 v3 + 国密扩展 | 统一国密证书存储 |
| 对象ID分配 | 未统一 | 标准化分配规则 | 避免厂商冲突 |
| 权限模型 | 简单标记 | 细粒度权限 | 更安全 |
| 多应用架构 | 不支持 | 正式支持 | 支持复合应用场景 |
主要变化详解
1. 密钥类型枚举规范化
2012版未明确定义密钥类型枚举值,导致各厂商实现不一致。2023版明确:
C
// GM/T 0017-2023 定义
#define KEY_TYPE_SM2_PRIVATE 0x01
#define KEY_TYPE_SM2_PUBLIC 0x02
#define KEY_TYPE_SM3 0x03
#define KEY_TYPE_SM4 0x042. 国密证书扩展编码
2023版新增国密OID扩展的编码规则,确保证书内部存储的完整性:
CODE
国密证书扩展OID映射:
- 签名算法OID: 1.2.156.10197.1.501 (SM2WithSM3)
- 密钥用法OID: 2.5.29.15 (keyUsage)
- 增强密钥用法OID: 2.5.29.37 (subjectAltName)
- 国密扩展OID: 1.2.156.10197.x (系列)3. 细粒度权限模型
2023版将权限从简单的"可导出/不可导出"扩展为多bit权限标志,支持更精细的访问控制。
工程实现要点
1. 对象ID管理策略
推荐实践:
CODE
对象ID分配规则:
- 0x00000001 ~ 0x0000FFFF: 系统预留(密钥对、证书)
- 0x00010000 ~ 0x00FFFFFF: 应用私有数据
- 0x01000000 ~ 0xFFFFFFFF: 厂商自定义注意:对象ID必须在USBKey内部全局唯一,不能重复。
2. 密钥存储安全
GM/T 0017-2023强制要求:
- SM2私钥必须存储在安全区域,禁止明文导出
- 私钥对象必须标记
Exportable=0 - 支持密钥备份(需通过安全通道加密导出)
PYTHON
# 示例:创建SM2密钥对象(伪代码)
key_obj = {
"object_id": 0x00000001,
"key_type": 0x01, # SM2私钥
"key_length": 32, # 256位
"key_value": "<从安全随机源生成>",
"access_rights": 0x0E, # 可签名、可验证、可加密、可解密,不可导出
}
# 调用 GM/T 0016-2023 的 INSERT_OBJECT 命令写入3. 证书与密钥关联
GM/T 0017要求证书对象必须关联对应的私钥对象:
CODE
关联规则:
- 证书对象必须包含 Linked Key ID 字段
- Linked Key ID 指向存储私钥的对象ID
- 验签时,通过证书中的SubjectPublicKeyInfo找到公钥
- 签名时,通过Linked Key ID找到私钥合规检测要点
根据GM/T 0027-2014和GM/T 0029-2014,USBKey数据格式合规检测包括:
| 检测项 | 检测方法 | 判定标准 |
|---|---|---|
| 密钥对象格式 | 读取密钥对象并解析 | 符合GM/T 0017-2023编码规则 |
| 证书对象格式 | 读取证书对象并解析 | DER编码有效,国密OID正确 |
| 权限标记 | 检查access_rights字段 | SM2私钥Exportable位为0 |
| 对象ID唯一性 | 遍历所有对象ID | 无重复ID |
| 密钥关联一致性 | 检查证书Linked Key ID | 指向有效的私钥对象 |
与其他标准的衔接
1. 与GM/T 0016-2023的接口对应
| GM/T 0017数据对象 | GM/T 0016命令 |
|---|---|
| 密钥对象INSERT | INSERT_OBJECT命令 |
| 密钥对象READ | READ_OBJECT命令 |
| 密钥对象DELETE | DELETE_OBJECT命令 |
| 证书对象INSERT | INSERT_CERTIFICATE命令 |
| 应用对象管理 | SELECT_APPLICATION命令 |
2. 与GB/T 32918的算法映射
| GB/T标准 | GM/T 0017密钥类型 |
|---|---|
| GB/T 32918.2(SM2签名) | KEY_TYPE_SM2_PRIVATE + KEY_TYPE_SM2_PUBLIC |
| GB/T 32907(SM4) | KEY_TYPE_SM4 |
| GB/T 32905(SM3) | KEY_TYPE_SM3 |
总结
GM/T 0017-2023是国密USBKey数据层的基石标准,与GM/T 0016-2023共同构成完整的接口-数据体系。
核心价值:
- 统一了各厂商的密钥、证书、应用数据存储格式
- 明确了SM2/SM3/SM4密钥的编码规则和安全约束
- 支持国密证书扩展和细粒度权限控制
- 为多应用架构提供标准化支持
- 实现USBKey固件时,必须严格遵循对象编码规则
- SM2私钥禁止导出是硬性要求,不得绕过
- 新开发应优先使用2023版标准,兼容2012版实现需评估风险
- GM/T 0016-2023接口规范:gm-t-0016-2023-usbkey-crypto-interface
- GM/T 0027-2014硬件规范:gm-t-0027-2014-usbkey-technical-specification
- 动态口令标准:dynamic-password-otp-gm-t-0021