近期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.ReadPu