SM2 签名的用途
SM2 签名配合 SM3 摘要用于验证数据与身份的真实性:签名方用私钥对摘要签名,验签方用公钥验证。它解决的是完整性与来源可信问题,不提供机密性——需要保密时仍要另行加密。联调阶段可以用 OpenSSL 完成一次签名与验签闭环,用来验证密钥、摘要算法与数据格式是否匹配。
基本信息
| 依据 | GB/T 32918.2(数字签名算法) |
|---|---|
| 摘要算法 | SM3 |
| 常用工具 | OpenSSL(不同版本对 SM2 签名的支持方式不同) |
| 提供能力 | 完整性与来源真实性,不提供机密性 |
| 联调要点 | 摘要一致、数据未被转换、公钥与私钥配对 |
典型使用场景
- 接口签名:对请求参数签名,服务端验签防篡改
- 固件与软件包校验:发布前签名,安装前验签
- 电子凭证签发:证书或凭据的签发与验签
- 联调测试:用命令行验证密钥与流程正确
- 代码评审:检查签名与验签是否使用一致的摘要
签名验签示例
签名验签示例
# 生成 SM2 密钥对
openssl ecparam -genkey -name SM2 -out sm2.key
openssl ec -in sm2.key -pubout -out sm2.pub
# 用 SM3 摘要签名
openssl dgst -sm3 -sign sm2.key -out data.sig data.txt
# 用公钥验签,输出 Verified OK 表示通过
openssl dgst -sm3 -verify sm2.pub -signature data.sig data.txt
# SM2 签名涉及用户标识(默认 ID),不同版本选项不同
# 必要时通过选项指定,具体以所用 openssl 版本文档为准验签失败的常见原因
| 现象 | 可能原因 |
|---|---|
| 摘要不一致 | 签名与验签使用的摘要算法不同 |
| 内容被改写 | 文本模式处理导致换行或编码变化 |
| 公钥不匹配 | 验签公钥与签名私钥并非同一对 |
| 标识不一致 | SM2 用户标识设置不同 |
工程落地注意点
- 二进制处理:签名与验签必须针对同一份字节内容,避免文本模式转换
- 编码统一:接口传输时明确字符编码,防止两端计算出的摘要不同
- 密钥存储:私钥交由密钥管理服务或密码机保管,不落应用磁盘
- 标识约定:把 SM2 用户标识写进对接文档,两端保持一致
- 验签失败可观测:记录摘要值与公钥标识,便于快速定位问题来源
验签失败先排查四件事:摘要算法是否一致(SM3)、数据是否被换行转换、公钥与私钥是否配对、SM2 用户标识是否一致。