GM/T 0017-2023 智能密码钥匙数据格式规范:国密USBKey的互操作基石

标准规范 · 2026-10-03

概述

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内部的存储格式:

关键约束:

  • SM2私钥禁止导出(Exportable位必须为0)
  • SM4密钥允许导出(需访问权限控制)
  • 密钥长度必须符合算法标准(如SM2私钥固定32字节)

2. 证书对象编码(Certificate Object)

GM/T 0017定义了国密X.509证书在USBKey内部的存储格式:

国密证书特殊要求:

  • 必须包含国密OID扩展(1.2.156.10197.x系列)
  • 签名算法字段必须标识SM2WithSM3(1.2.156.10197.1.501)
  • 密钥用法扩展(Key Usage)必须包含digitalSignature

3. 应用对象编码(Application Object)

GM/T 0017支持多应用架构,每个应用有独立的数据空间:

新旧版本关键差异

GM/T 0017-2012 vs 2023版对比

对比项2012版2023版影响
密钥类型支持SM2、SM1(隐含)SM2、SM3、SM4显式定义更清晰,覆盖更广
证书格式仅支持X.509 v3X.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          0x04

2. 国密证书扩展编码

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命令
密钥对象INSERTINSERT_OBJECT命令
密钥对象READREAD_OBJECT命令
密钥对象DELETEDELETE_OBJECT命令
证书对象INSERTINSERT_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版实现需评估风险
相关实践参考: