文档章节

golang的SHA1withRSA的实现

suit
 suit
发布于 2016/05/24 20:42
字数 634
阅读 6.5K
收藏 2

「深度学习福利」大神带你进阶工程师,立即查看>>>

背景

有一个与第三方系统对接的需求,协议是比较简单,但发现协议有个字段是签名,而怎么签名并没有细说,从提供的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
}

参考资料

suit
粉丝 5
博文 24
码字总数 13381
作品 0
广州
程序员
私信 提问
加载中
此博客有 2 条评论,请先登录后再查看。
用vertx实现高吞吐量的站点计数器

工具:vertx,redis,mongodb,log4j 源代码地址:https://github.com/jianglibo/visitrank 先看架构图: 如果你不熟悉vertx,请先google一下。我这里将vertx当作一个容器,上面所有的圆圈要...

jianglibo
2014/04/03
4.2K
3
SQLServer实现split分割字符串到列

网上已有人实现sqlserver的split函数可将字符串分割成行,但是我们习惯了split返回数组或者列表,因此这里对其做一些改动,最终实现也许不尽如意,但是也能解决一些问题。 先贴上某大牛写的s...

cwalet
2014/05/21
9.7K
0
极速博客引擎--Gor

gor 是使用 golang 实现的类Ruhoh静态博客引擎(Ruhoh like),基本兼容ruhoh 1.x规范. 相当于与ruhoh的官方实现(ruby实现), 有以下优点: 速度完胜 -- 编译wendal.net近200篇博客,仅需要1秒 安装...

wendal
2013/01/20
3.8K
0
Promises/A 和 when() 实现--When.js

When.js 是 cujojs 的轻量级的 Promises/A 和 when() 实现,从 wire.js 的异步核心和 cujojs 的 IOC 容器派生而来。包含很多其他有用的 Promiss 相关概念,例如联合多个 promiss、mapping 和...

匿名
2013/02/15
7.4K
0
Redis 分片实现--Redis Shard

redis-shard 是 Redis 分区的 Python API ,基于对 key 和 key tag 进行 CRC32 checksum 计算,可参考文章 http://antirez.com/post/redis-presharding.html . 该项目由知乎网开发。 使用限制...

匿名
2012/10/24
5.6K
0

没有更多内容

加载失败,请刷新页面

加载更多

抖音批量发布软件,批量运营200+自媒体账号

抖音批量发布软件,批量运营200+自媒体账号,现在短视频平台大家也可以看的到,流量很大,很多人开通了商品橱窗,在上面进行带货,赚钱也很简单,尤其是抖音这个平台,男女老少都在玩,里面也...

osc_emgrwx5d
41分钟前
9
0
基于MES系统的企业信息化系统的集成

引言 随着网络和科技的发展,互联网技术和电子信息技术已经逐渐融入了我们生活工作的各个环节。在企业中,企业信息化程度的高低也直接影响到企业的运营。企业要想得到快速长远的发展,就要利...

osc_7owgvpdx
42分钟前
28
0
dockerfile源码编译安装nginx、php和harbor

安装docker 环境:基于CentOS Linux release 7.6.1810 注意:以下所有操作基于root用户 #centos7# step 1: 安装必要的一些系统工具yum install -y yum-utils device-mapper-persistent-da...

osc_otuqqtuq
43分钟前
13
0
条形码识别器Dynamsoft Barcode Reader v7.5全新上线!

Dynamsoft Barcode Readerv7.5带来了一些新的参数配置,例如中心定位条形码、二值化模式等。让我们来看看新功能中的一些亮点。 更新 添加了对QR Code Model 1(QR Code规范的旧版本)的支持。...

roffey
44分钟前
6
0
TCP端口的十一种连接状态

TCP端口的十一种连接状态∶ CLOSED∶端口默认是关闭状态。 
LISTEN∶服务器程序开始监听一个端口,就是LISTEN状态。 
 

SYN_RCVD∶三次握手的第二次握手后的端口状态,是收到了客户端发...

程序员面试吧
44分钟前
12
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部