用go实现国密SM2签名

GOLANG / 作者:HMiJn / 584人浏览

最近因为要使用到国密SM2签名,一些银行,金融机构,政府单位对接都需要使用到,所以记录一下。

一般都是用openssl或者gmssl,但是我本地装这两个都没有装成功,故此使用了
https://github.com/deatil/go-cryptobin
这个。

package main

import (
"encoding/base64"
"fmt"
cryptobin_sm2 "github.com/deatil/go-cryptobin/cryptobin/sm2"
"github.com/deatil/lakego-filesystem/filesystem"
"github.com/gin-gonic/gin"
"net/http"
)

func main() {

r := gin.Default()
r.GET("/sign", func(c *gin.Context) {

sm2data := c.PostForm("sign_data")
sm2userid := c.PostForm("user_id")

// 文件管理器
fs := filesystem.New()
// 检测私钥公钥是否匹配
pri, priErr := fs.Get("./runtime/key/pri_key_pkcs8.pem")
if priErr != nil {
fmt.Println("打开文件错误,原因为:", priErr.Error())
}
//pub, pubErr := fs.Get("./runtime/key/pub_key.pem")
//if pubErr != nil {
// fmt.Println("打开文件错误,原因为:", pubErr.Error())
//}
//fmt.Println("pri" + pri)
//fmt.Println("pub" + pub)
sm2keyBytes, _ := base64.StdEncoding.DecodeString(pri)
//sm2data := `签名内容`
//sm2userid := "签名id"
sm2Sign := cryptobin_sm2.NewSM2().
FromString(sm2data).
FromPrivateKeyBytes(sm2keyBytes).
SignHex([]byte(sm2userid)).
// SignAsn1([]byte(sm2userid)).
ToBase64String()
//sm2keyPubBytes, _ := base64.StdEncoding.DecodeString(pub)
//sm2Verify := cryptobin_sm2.NewSM2().
// FromBase64String(sm2Sign).
// FromPrivateKeyBytes(sm2keyPubBytes).
// MakePublicKey().
// VerifyHex([]byte(sm2data), []byte(sm2userid)).
// // VerifyAsn1([]byte(sm2data), []byte(sm2userid)).
// ToVerify()

c.JSONP(http.StatusOK, gin.H{
"code" : 0,
"sign" : sm2Sign,
})
})
_ = r.Run(":10082")
}

证书目录


使用的话,打包一下,直接调用
http://127.0.0.1:10082/sign
把要签名的内容丢进去,这里用的get方法,可以自己改造就好,当前已经简单实现SM2签名。