您的位置:首页 > 编程语言 > Go语言

golang的SHA1withRSA的实现

2016-05-24 20:42 295 查看

背景

有一个与第三方系统对接的需求,协议是比较简单,但发现协议有个字段是签名,而怎么签名并没有细说,从提供的demo里看是采用java的SHA1withRSA,然而百度了一翻没有看到介绍,出动Google也没有看到相关的信息,从而猜测应该是JAVA特有的封装,应该是先进行一个SHA1的散列,再进行一次RSA的加密,后来从这里 我的猜测应该是对的。

解决思路

X509看了里面的代码,有看到SHA1withRSA的定义,但似乎没看到例子及使用。后来不停地找资料,发现这里 讲得比较细,也比较符合我的情况,于是试用了一下竟然可以了,解决了我这几天的烦恼啊。主要是以下这段:

block, _ := pem.Decode([]byte(key))
if block == nil {       // 失败情况
}

private, err := x509.ParsePKCS8PrivateKey(block.Bytes)
if err != nil {
...
}

h := crypto.Hash.New(crypto.SHA1)
h.Write(data)
hashed := h.Sum(nil)

// 进行rsa加密签名
signedData, err := rsa.SignPKCS1v15(rand.Reader, private.(*rsa.PrivateKey), crypto.SHA1, hashed)
...

关于证书

对方给的证书是windows下的p12,一般linux会采用pem的格式,不过这个openssl可以搞定,用以下命令就能转

openssl pkcs12 -out out.pem -in in.p12 -nodes -nocerts

如果是自己生成秘钥,可以直接采用

openssl genrsa -out rsa_private_key.pem 1024

我的封装

如果哪位大神有更好的解决方案可以告诉我一下!

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
}

fmt.Printf("Signature: %x\n", signature)
signRet := fmt.Sprintf("%x", signature)
fmt.Printf("sigRet: %s\n", signRet)

return signRet, nil
}

参考资料

golang中几种加密方式的处理

分享一个Golang使用公钥对数据进行RSA加密的程序

数字签名--java实现

What's the difference between MD5withRSA & SHA1withRSA?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  SHA1withRSA golang p12 pem