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?
相关文章推荐
- Go 语言 Channel 实现原理精要
- Go语言将支持Android
- Golang实现的聊天程序服务端和客户端代码分享
- Golang学习笔记(三):控制流
- Golang学习笔记(二):类型、变量、常量
- Golang中的sync.WaitGroup用法实例
- Go语言struct类型介绍
- golang使用正则表达式解析网页
- Golang极简入门教程(三):并发支持
- Golang极简入门教程(四):编写第一个项目
- Golang记录、计算函数执行耗时、运行时间的一个简单方法
- 深入解析Go语言中for循环的写法
- Golang学习笔记(四):array、slice、map
- 理解Golang中的数组(array)、切片(slice)和map
- golang语言中for循环语句用法实例
- Golang学习笔记(一):简介
- golang操作mongodb的方法
- GO语言(golang)基础知识
- ubuntu下搭建Go语言(golang)环境
- Golang 内存模型详解(一)