GM/T 0047-2024 安全电子签章密码检测规范:从算法到合规的全链路检测指南
概述
GM/T 0047-2024《安全电子签章密码检测规范》是国密电子签章领域最重要的检测标准之一,于 2024 年发布并替代了原有的 GM/T 0047-2016 版本。该标准规定了安全电子签章系统的密码检测要求、检测方法和判定准则,适用于密码检测机构对电子签章产品进行合规性检测。
核心问题:如何验证一个电子签章系统是否符合国密标准?答案就在 GM/T 0047-2024。
标准定位与适用范围
1. 标准体系中的位置
GM/T 0047 在国密标准体系中处于"检测层"的关键位置:
| 层级 | 标准 | 作用 |
|---|---|---|
| 基础层 | GM/T 0044-2016(SM9) | 定义算法原型 |
| 规范层 | GM/T 0031-2025 | 规定技术要求 |
| 检测层 | GM/T 0047-2024 | 提供检测方法 |
| 实施层 | GM/T 0131-2023 | 定义接口规范 |
2. 检测对象
本标准适用于以下电子签章产品的密码检测:
- 电子签章系统软件
- 云签章服务平台
- 电子印章硬件设备
- 签章中间件组件
3. 检测级别
根据被测系统的安全等级,检测分为两个级别:
| 级别 | 适用场景 | 检测深度 |
|---|---|---|
| 一级 | 普通商业合同签章 | 基本功能检测 |
| 二级 | 金融、政务等高安全场景 | 完整安全检测 |
检测内容详解
1. 算法合规性检测
#### 1.1 SM2 签名算法检测
GM/T 0047-2024 明确要求电子签章必须使用 SM2 算法进行签名,检测内容包括:
检测项目:SM2 签名算法
检测范围:密钥长度、签名生成、签名验证
判定标准:符合 GM/T 0003.2-2012 要求检测方法:
- 使用标准测试向量验证 SM2 签名算法实现
- 检查密钥长度是否为 256 位
- 验证签名格式是否符合 PKCS#7/CMS 结构
电子签章的数据完整性保护依赖于 SM3 哈希算法:
| 检测项 | 要求 | 检测方法 |
|---|---|---|
| 哈希长度 | 256 位 | 输出长度验证 |
| 碰撞抗性 | 符合密码学安全要求 | 理论分析 + 测试向量 |
| 标准符合性 | GB/T 32905-2016 | 对照标准文档 |
用于签章数据的加密保护:
检测项目:SM4 加密算法
密钥长度:128 位
工作模式:ECB/CBC/GCM
填充方式:PKCS#5/PKCS#72. 签章数据结构检测
#### 2.1 CAdES 格式检测
GM/T 0047-2024 规定电子签章应采用 CAdES(CMS Advanced Electronic Signatures)格式:
关键检测点:
- 签名属性完整性:检查 signaturePolicyId、signingTime 等必填属性
- 证书链验证:验证证书链是否完整且有效
- 时间戳验证:检查签名时间戳是否符合 RFC 3161 或 GM/T 0033-2023
对于 PDF 文档签章,需符合 PAdES(PDF Advanced Electronic Signatures)标准:
| 检测项 | 标准要求 |
|---|---|
| PDF 版本 | ≥ 1.7 |
| 签名字段 | 符合 ISO 32000-2 |
| 可见性 | 支持可见/不可见签章 |
3. 密钥管理检测
#### 3.1 密钥生成检测
| 检测项 | 要求 | 检测方法 |
|---|---|---|
| 随机性 | 符合 GM/T 0005-2012 | NIST SP 800-22 测试套件 |
| 密钥长度 | SM2: 256位, SM4: 128位 | 直接测量 |
| 熵源 | 硬件 RNG 或 CSPRNG | 源代码审查 |
检测密钥在存储时的保护机制:
- 软件密钥:是否加密存储,密钥派生是否安全
- 硬件密钥:是否存储在安全芯片/USBKey 中
- 传输密钥:是否使用数字信封保护
4. 签名流程检测
#### 4.1 签名过程完整性
检测电子签章系统的签名流程是否符合标准:
步骤 1: 计算文档哈希 (SM3)
步骤 2: 用签名私钥生成 SM2 签名
步骤 3: 构建 CMS/PKCS#7 签名包
步骤 4: 添加时间戳 (可选但推荐)
步骤 5: 输出最终签章数据#### 4.2 验签流程检测
验证签章的系统必须能够:
- 解析 CMS 签名结构
- 提取签名者和证书信息
- 验证签名有效性
- 验证时间戳有效性
- 报告验证结果
检测工具与方法
1. 自动化检测工具
GM/T 0047-2024 推荐使用以下检测工具:
| 工具类型 | 示例 | 用途 |
|---|---|---|
| 算法测试 | OpenSSL/gmssl CLI | SM2/SM3/SM4 算法验证 |
| 结构分析 | ASN.1 解析器 | CMS 数据结构检查 |
| 证书验证 | OpenSSL verify | 证书链验证 |
| 完整性检查 | Python hashlib | 哈希算法验证 |
2. 手动检测示例
#### 2.1 SM2 签名验证
from gmssl import sm2, func
# 准备测试数据
sm2_crypt = sm2.CryptSM2(
public_key='04xxx...', # 公钥
private_key='xxxx...' # 私钥
)
# 计算文档 SM3 哈希
from gmssl import sm3
msg_hash = sm3.sm3_hash(func.bytes_to_list(b'Test document content'))
# 签名
signature = sm2_crypt.sign(msg_hash)
print(f'Signature: {signature}')
# 验签
is_valid = sm2_crypt.verify(signature, msg_hash)
print(f'Valid: {is_valid}')#### 2.2 CMS 签名解析
from cryptography import x509
from cryptography.hazmat.primitives import hashes, serialization
from cryptography.hazmat.primitives.asymmetric import padding
# 加载签名证书
cert = x509.load_pem_x509_certificate(open('signer_cert.pem', 'rb').read())
# 验证签名
public_key = cert.public_key()
public_key.verify(
signature,
data,
padding.PKCS1v15(),
hashes.SM3()
)常见问题与解决方案
问题 1: SM2 签名验证失败
现象:验签返回 False,但密钥对正确。
原因:
- ZA 值计算错误(缺少 identity 或 ENTLEN)
- 哈希算法使用错误(用了 SHA-256 而非 SM3)
# 正确用法:gmssl 内部自动硬编码 user_id
from gmssl import sm2
# CryptSM2 无需 user_id 参数(library 内部固定为 '1234567812345678')
crypt = sm2.CryptSM2(
public_key=pub_key,
private_key=priv_key
)
# ZA 值由库内部自动计算,符合 GM/T 0009 规范问题 2: 时间戳验证失败
现象:签章有效,但时间戳验证报错。
原因:
- 时间戳令牌格式不符合 RFC 3161
- 时间戳证书的信任链不完整
- 使用符合 GM/T 0033-2023 的时间戳服务
- 确保证书签发机构在信任库中
问题 3: 证书链验证不通过
现象:verify 返回 CERTIFICATE_VERIFY_FAILED。
原因:
- 中间证书缺失
- 根证书不在信任库
- 证书已吊销未检查 CRL/OCSP
# 检查证书链
openssl verify -CAfile root_ca.pem -untrusted inter_ca.pem signer.pem
# 检查 CRL
openssl crl -in crl.pem -text -noout合规实施建议
1. 检测机构实施要点
- 检测环境准备
- 检测流程标准化
2. 厂商合规自查清单
| 检测项 | 自查方法 | 通过标准 |
|---|---|---|
| SM2 签名正确性 | 使用标准测试向量 | 全部通过 |
| 签名格式合规性 | ASN.1 解析检查 | 符合 CMS 结构 |
| 时间戳有效性 | 验证时间戳令牌 | 符合 RFC 3161 |
| 证书链完整性 | OpenSSL verify | 无错误 |
| 密钥安全性 | 检查密钥存储方式 | 硬件保护或加密存储 |
与相关标准的关系
1. 与 GM/T 0031-2025 的关系
GM/T 0047 是 GM/T 0031 的检测配套标准:
| 标准 | 性质 | 内容 |
|---|---|---|
| GM/T 0031-2025 | 技术规范 | 规定"应该怎么做" |
| GM/T 0047-2024 | 检测规范 | 规定"如何验证" |
2. 与 GB/T 38540-2020 的关系
两者互为补充:
- GB/T 38540-2020:国家标准,范围更广,含管理要求
- GM/T 0047-2024:行业标准,专注密码技术检测
3. 检测标准链条
GM/T 0031-2025 (技术要求)
↓
GM/T 0047-2024 (检测方法)
↓
密评报告 (合规证明)总结
GM/T 0047-2024 是电子签章产品合规检测的核心标准,覆盖了从算法验证到数据格式检查的完整检测链条。对于检测机构,它提供了标准化的检测方法;对于厂商,它是产品合规的自查指南。
关键要点:
- 所有密码算法必须使用国密标准(SM2/SM3/SM4)
- 签章数据格式必须符合 CAdES/PAdES 规范
- 密钥管理必须满足安全存储要求
- 时间戳和证书链验证是必检项
参考标准:
相关实践: