java 国密p7验签_go/Java 国密sm2签名验签
近期go项目对接第三方Java服务,第三方要求使用国密sm3/sm2算法进行数据签名验签,特记录go端开发注意事项
1 关于密钥对
密钥生成可以使用openssl库,openssl版本至少是1.1.1,终端运行openssl version检查版本,之前版本不支持sm2/sm3, openssl官网https://www.openssl.org/source/
检查椭圆曲线是否包含sm2,如下所示是支持sm2的。
$ openssl ecparam -list_curves | grep SM2
SM2 : SM2 curve over a 256 bit prime field
密钥生成流程,存在第四步的原因是go使用的库需要读取pkcs#8格式私钥pem文件:
1 生成sm2私钥: openssl ecparam -genkey -name SM2 -out sm2PriKey.pem
2 sm2私钥导出公钥: openssl ec -in sm2PriKey.pem -pubout -out sm2PubKey.pem
3 查看私钥: openssl ec -in sm2PriKey.pem -text
4 私钥pkcs#1转pkcs#8: openssl pkcs8 -topk8 -inform PEM -in sm2PriKey.pem -outform pem -nocrypt -out sm2PriKeyPkcs8.pem
2 go签名验签代码
1 读取公钥pem文件, 将公钥X/Y的bytes拼接base64编码,函数示例:
func DealPubKey() {
// 公钥X/Y的bytes拼接后base64编码
PubKeyPath := "/home/xx/sm2PubKey.pem"
pubKey, e := sm2.ReadPublicKeyFromPem(PubKeyPath, nil)
if e != nil {
log.Println("pubKeyPem read failed, error: ", e)
}
var buf bytes.Buffer
buf.Write(pubKey.X.Bytes())
buf.Write(pubKey.Y.Bytes())
XY := base64.StdEncoding.EncodeToString(buf.Bytes())
log.Println("pubKey XY base64--->", XY)
}
2 sm2签名验签使用的包"github.com/tjfoc/gmsm/sm2", go mod自动安装不会安装最新版本, go.mod不要添加此包,
github最新版本是是V1.2, 切换到项目目录, 终端运行 go get github.com/tjfoc/gmsm@master安装最新版本后会自动添加到go.mod
3 "github.com/tjfoc/gmsm/sm2"使用签名函数为 sm2.Sm2Sign, 此函数会将输入的[]bytes类型数据sm3摘要运算后进行sm2签名, 对应验签函数sm2.Sm2Verify
4 函数sm2.Sign默认是使用sha-512进行摘要运算,与服务端Java签名验签失败.
代码示例:
package main
import (
"bytes"
"encoding/base64"
"fmt"
"github.com/tjfoc/gmsm/sm2"
"log"
"math/big"
"os"
)
var (
default_uid = []byte{0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38}
)
func Sign(body string) (string, error) {
cwd, _ := os.Getwd()
PriKeyPath := cwd + string(os.PathSeparator) + "sm2PriKeyPkcs8.pem"
priKey, e := sm2.ReadPrivateKeyFromPem(PriKeyPath, nil)
if e != nil {
log.Println("priKeyPem read failed, error: ", e)
return "", e
}
r, s, err := sm2.Sm2Sign(priKey, []byte(body), default_uid)
if err != nil {
log.Println("priKey sign error: ", err)
return "", err
}
//Buffer是一个实现了读写方法的可变大小的字节缓冲
var buffer bytes.Buffer
buffer.Write(r.Bytes())
buffer.Write(s.Bytes())
signature := base64.StdEncoding.EncodeToString(buffer.Bytes())
log.Println("priKey signature base64: ", signature)
return signature, nil
}
func Verify(body, signature string) {
cwd, _ := os.Getwd()
PubKeyPath := cwd + string(os.PathSeparator) + "sm2PubKey.pem"
pubKey, e := sm2.ReadPublicKeyFromPem(PubKeyPath, nil)
if e != nil {
log.Println("pubKeyPem read failed, error: ", e)
}
d64, err := base64.StdEncoding.DecodeString(signature)
if err != nil {
log.Println("base64 decode error: ", err)
}
l := len(d64)
br := d64[:l/2]
bs := d64[l/2:]
var ri, si big.Int
r := ri.SetBytes(br)
s := si.SetBytes(bs)
v := sm2.Sm2Verify(pubKey, []byte(body), default_uid, r, s)
log.Printf("pubKey verified: %v\n", v)
}
func main() {
body := `{"name":"mike","gender":"male"}`
signature, _ := Sign(body)
Verify(body, signature)
}
有疑问加站长微信联系(非本文作者)
java 国密p7验签_go/Java 国密sm2签名验签相关推荐
- 国密SM4加解密SM2签名验签COM组件DLL
提供给第三方软件,调用COM组件DLL方式进行实现,如delphi.PB等. 基于C#编写的COM组件DLL,可实现SM2签名验签,SM4加解密,100%适用于黑龙江省国家医保接口中进行应用. 功能包 ...
- 国家医保移动支付国密算法SM2签名验签、SM4加解密DLL
国家医保移动支付国密算法SM2签名验签.SM4加解密DLL 支持医保移动支付(国家统一版), 已知省份有广西.贵州.安徽.河北.黑龙江.湖南.吉林.江苏.四川.新疆等各地方. DLL,非.net开发, ...
- iOS 使用 SM2 SM4 加解密,SM2 签名验签及 SM3 签名
前言 对于开发人员,开发中加解密是经常用到的,常见的密码算法 MD5.SHA.AES.DES,RSA 等等,这些无一例外都是国外的加密算法.基于安全和宏观战略考虑,我国从 2010 年先后推出了 SM ...
- 基于gmssl SM2 签名验签测试程序
基于gmssl SM2 签名验签测试程序 前言 一.sm2 签名流程 二.sm2 验签流程 三.测试结果 总结 前言 在之前的文章中讲解了基于gmssl 的SM2的加解密接口的测试程序,这里主要讲解签 ...
- 【转】C#sm2签名验签实现
//调用 private string Sm2String(string str){//sm加密SM2Param sM2Param = new SM2Param();byte[] priKey = B ...
- 叙述无保密机制的rsa签名过程_安全系列之——RSA的公钥私钥有多少人能分的清楚?RSA的签名验签与加密解密如何使用公私钥?...
在对接很多的互联网公司的开发平台时,这些互联网公司未来自身平台的安全,都会需要调用方签名确认调用方的身份是合法的,同时未来信息网络传输的安全可能还需要加密解密.比如对接支付宝.微信开放平台时,需要配置 ...
- 基于OpenSSL 1.1.1版实现的SM2签名与验签C程序
OpenSSL 1.1.1 版提供了对国密 SM4.SM3.SM2 算法的支持.对于 SM2 算法,在源码的 crypto/sm2 目录下,sm2_sign.c 文件中实现了 SM2 签名与验签, s ...
- 格尔签名验签接口使用记录
直接开始,主要包括三个部分:签名接口测试.验签接口测试.代码实现. 这里写目录标题 1. 签名接口测试 2. 验签接口测试 3. java代码调用接口 1. 签名接口测试 这里签名和验签接口均使用Po ...
- 密码机分类--签名验签服务器
商密产品认证-签名验签服务器 产品概述 签名验签服务器应用要点 产品概述 签名验签服务器是为应用实体提供基于PKI体系和数字证书的数字签名.验证签名等运算功能的服务器,可以保证关键业务信息的真实性.完 ...
最新文章
- spring-boot学习资料
- CMOS图像传感器——图像传感器噪声
- 顺序表输入栈元素c语言,C语言数据结构之栈简单操作
- 利用openpyxl模块来操作Excel
- 利用高级筛选功能巧妙删除Excel的重复记录
- linux从入门到精通张帆,Linux基础之文件系统简介及其系统管理工具
- Multisim 14.1 安装步骤
- APISpace 空号检测API接口 免费好用
- ACM:竞赛技巧(c++)
- 给电视盒子换上第三方桌面
- level2行情接口怎么用?
- DBeaver 离线安装
- 5种高大上的yml文件读取方式,你知道吗?
- FontStruct——制作你自己的个性化字体
- CSS的补充(3 空间转换 动画)
- 机械设计师图纸管理系统,实现数字化管理图纸
- shell脚本实现查找文件夹下重复的文件,并提供删除功能
- 【mysql】日期与时间类型
- html制作服装推广软文,服装设计网站用哪些软文推广工具才能实现全网营销
- 移动搜索之战:360搜索推出独立品牌“好搜”