做过很多对接第三方平台的业务,几乎所有的接口对接都会用到Rsa进行签名,Rsa算法是使用私钥签名,公钥验签。
下面直接上代码:
package main
import (
"crypto"
"crypto/rand"
"crypto/rsa"
"crypto/x509"
"encoding/base64"
"encoding/pem"
"fmt"
"io/ioutil"
"testing"
)
//通过文件加载私钥对象
func LoadPrivateKey(privateKeyContent string,isPath bool) (privateKey *rsa.PrivateKey, err error) {
var privateKeyBytes []byte
//如果传入是私钥路径直接读取,如果传入是私钥内容则格式化成正确的私钥格式
if isPath {
privateKeyBytes, err = ioutil.ReadFile(privateKeyContent)
if err != nil {
return nil, fmt.Errorf("读取私钥证书失败 file err:%s", err.Error())
}
}else {
//var publicHeader = "-----BEGIN RSA PRIVATE KEY-----\n"
//var publicTail = "-----END RSA PRIVATE KEY-----\n"
var publicHeader = "-----BEGIN PRIVATE KEY-----\n"
var publicTail = "-----END PRIVATE KEY-----\n"
var temp string
split(privateKeyContent,&temp)
privateKeyBytes = []byte(publicHeader+temp+publicTail)
}
block, _ := pem.Decode(privateKeyBytes)
if block == nil {
return nil, fmt.Errorf("解码私钥失败")
}
key, err := x509.ParsePKCS8PrivateKey(block.Bytes)
if err != nil {
return nil, fmt.Errorf("解析私钥失败 err:%s", err.Error())
}
privateKey, ok := key.(*rsa.PrivateKey)
if !ok {
return nil, fmt.Errorf("非法私钥文件,检查私钥文件")
}
return privateKey, nil
}
//64个字符换行
func split(key string,temp *string){
if len(key)<=64 {
*temp = *temp+key+"\n"
}
for i:=0;i
1) PKCS1和PKCS8 这两种类型的报文头是不同的,要分别使用不同的处理方法
//PKCS1
x509.ParsePKCS1PrivateKey(der []byte) (*rsa.PrivateKey, error)
//PKCS8
x509.ParsePKCS8PrivateKey(der []byte) (key interface{}, err error)
2)摘要算法的不同,常用的摘要算法有md5,sha1,sha256,sha512等,摘要的长度越长,信息越安全