golang的SHA1withRSA的实现
java 采用的SHA1withRSA
Google好久也没找到go的解决方案,查到某位大神说SHA1withRSA 是JAVA特有的封装,是先进行一个SHA1的散列,再进行一次RSA的加密,
- 使用SHA散列包。这会产生一个小的32字节哈希字符串,便于快速计算
- 使用您的私钥对该字符串进行签名
golang解决
##参考资料
##大神解决
代码
func main() {
block, _ := pem.Decode([]byte(`-----BEGIN RSA PRIVATE KEY-----
-----END RSA PRIVATE KEY-----
`))
context := "helloworld"; //需要签名的文本
if block == nil {
panic("私钥错误")
return
}
private,err := x509.ParsePKCS8PrivateKey(block.Bytes) //之前看java demo中使用的是pkcs8
if err != nil {
panic("PrivateKey error")
return
}
h := crypto.Hash.New(crypto.SHA1) //进行SHA1的散列
h.Write([]byte(context))
hashed := h.Sum(nil)
// 进行rsa加密签名
signedData, err := rsa.SignPKCS1v15(rand.Reader, private.(*rsa.PrivateKey), crypto.SHA1, hashed)
data := base64.StdEncoding.EncodeToString(signedData)
fmt.Println(data)
}
##转载大神的封装
package common
import (
"crypto"
"crypto/rand"
"crypto/rsa"
"crypto/x509"
"encoding/pem"
"fmt"
)
type SHAwithRSA struct {
privateKey *rsa.PrivateKey
}
func (this *SHAwithRSA) SetPriKey(pkey []byte) {
block, _ := pem.Decode(pkey)
if block == nil {
fmt.Println("pem.Decode err")
return
}
//private, err := x509.ParsePKCS1PrivateKey(block.Bytes)
private, err := x509.ParsePKCS8PrivateKey(block.Bytes)
if err != nil {
fmt.Println("ParsePKCS8PrivateKey err", err)
return
}
this.privateKey = private.(*rsa.PrivateKey)
return
}
func (this *SHAwithRSA) Sign(data string) (string, error) {
h := crypto.Hash.New(crypto.SHA1)
h.Write([]byte(data))
hashed := h.Sum(nil)
signature, err := rsa.SignPKCS1v15(rand.Reader, this.privateKey,
crypto.SHA1, hashed)
if err != nil {
fmt.Println("Error from signing: %s\n", err)
return "", err
}
sign := base64.StdEncoding.EncodeToString(signature) //转换成base64返回
return sign, nil
}
还没有评论,来说两句吧...