近期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签名验签相关推荐

  1. 国密SM4加解密SM2签名验签COM组件DLL

    提供给第三方软件,调用COM组件DLL方式进行实现,如delphi.PB等. 基于C#编写的COM组件DLL,可实现SM2签名验签,SM4加解密,100%适用于黑龙江省国家医保接口中进行应用. 功能包 ...

  2. 国家医保移动支付国密算法SM2签名验签、SM4加解密DLL

    国家医保移动支付国密算法SM2签名验签.SM4加解密DLL 支持医保移动支付(国家统一版), 已知省份有广西.贵州.安徽.河北.黑龙江.湖南.吉林.江苏.四川.新疆等各地方. DLL,非.net开发, ...

  3. iOS 使用 SM2 SM4 加解密,SM2 签名验签及 SM3 签名

    前言 对于开发人员,开发中加解密是经常用到的,常见的密码算法 MD5.SHA.AES.DES,RSA 等等,这些无一例外都是国外的加密算法.基于安全和宏观战略考虑,我国从 2010 年先后推出了 SM ...

  4. 基于gmssl SM2 签名验签测试程序

    基于gmssl SM2 签名验签测试程序 前言 一.sm2 签名流程 二.sm2 验签流程 三.测试结果 总结 前言 在之前的文章中讲解了基于gmssl 的SM2的加解密接口的测试程序,这里主要讲解签 ...

  5. 【转】C#sm2签名验签实现

    //调用 private string Sm2String(string str){//sm加密SM2Param sM2Param = new SM2Param();byte[] priKey = B ...

  6. 叙述无保密机制的rsa签名过程_安全系列之——RSA的公钥私钥有多少人能分的清楚?RSA的签名验签与加密解密如何使用公私钥?...

    在对接很多的互联网公司的开发平台时,这些互联网公司未来自身平台的安全,都会需要调用方签名确认调用方的身份是合法的,同时未来信息网络传输的安全可能还需要加密解密.比如对接支付宝.微信开放平台时,需要配置 ...

  7. 基于OpenSSL 1.1.1版实现的SM2签名与验签C程序

    OpenSSL 1.1.1 版提供了对国密 SM4.SM3.SM2 算法的支持.对于 SM2 算法,在源码的 crypto/sm2 目录下,sm2_sign.c 文件中实现了 SM2 签名与验签, s ...

  8. 格尔签名验签接口使用记录

    直接开始,主要包括三个部分:签名接口测试.验签接口测试.代码实现. 这里写目录标题 1. 签名接口测试 2. 验签接口测试 3. java代码调用接口 1. 签名接口测试 这里签名和验签接口均使用Po ...

  9. 密码机分类--签名验签服务器

    商密产品认证-签名验签服务器 产品概述 签名验签服务器应用要点 产品概述 签名验签服务器是为应用实体提供基于PKI体系和数字证书的数字签名.验证签名等运算功能的服务器,可以保证关键业务信息的真实性.完 ...

最新文章

  1. spring-boot学习资料
  2. CMOS图像传感器——图像传感器噪声
  3. 顺序表输入栈元素c语言,C语言数据结构之栈简单操作
  4. 利用openpyxl模块来操作Excel
  5. 利用高级筛选功能巧妙删除Excel的重复记录
  6. linux从入门到精通张帆,Linux基础之文件系统简介及其系统管理工具
  7. Multisim 14.1 安装步骤
  8. APISpace 空号检测API接口 免费好用
  9. ACM:竞赛技巧(c++)
  10. 给电视盒子换上第三方桌面
  11. level2行情接口怎么用?
  12. DBeaver 离线安装
  13. 5种高大上的yml文件读取方式,你知道吗?
  14. FontStruct——制作你自己的个性化字体
  15. CSS的补充(3 空间转换 动画)
  16. 机械设计师图纸管理系统,实现数字化管理图纸
  17. shell脚本实现查找文件夹下重复的文件,并提供删除功能
  18. 【mysql】日期与时间类型
  19. html制作服装推广软文,服装设计网站用哪些软文推广工具才能实现全网营销
  20. 移动搜索之战:360搜索推出独立品牌“好搜”

热门文章

  1. Android根据电话号码取得联系人姓名及头像
  2. 程序员这个职业赚钱吗?能赚多少钱?
  3. Antd Pro 路由转发redirect
  4. 电路分析 极简复习指导、公式推导、常用结论归纳 第三章 电阻电路的一般分析
  5. OpenJudge_P8207 和为给定数
  6. windows10 Ubuntu子系统忘记密码,亲测有效
  7. 数据分析-深度学习Pytorch Day2
  8. 欧瑞变频器故障码表_欧瑞f2000-g变频器故障代码是什么?请生意经的朋友帮忙解答...
  9. 如何调整EasyDSS平台点播文件显示的播放次数不正确问题?
  10. Verilog 语法总结