Go实现基于RSA加密算法的接口鉴权

基于 RSA 加密算法的接口鉴权方案

假设接口调用者是客户端,接口提供方是服务端,则此方案存在以下规则:

  • 客户端需要使用 RSA 算法(1024 位长度的私钥)生成公私钥,并将公钥下发给服务端;
  • 客户端使用私钥对请求内容加签,然后需要同时将请求内容和签名一并发给服务端;
  • 服务端收到请求后,使用客户端给的公钥对请求内容和签名进行验签,以确定请求是来自客户端的。

生成公私钥

# 生成 1024 位长度的私钥
openssl genrsa -out private-key.pem 1024

# 生成公钥
openssl rsa -in private-key.pem -pubout -out public-key.pem

代码实现

加签

使用 SHA1 + RSA 对请求内容加签:

package utils

import (
 "crypto"
 "crypto/rand"
 "crypto/rsa"
 "crypto/sha1"
 "crypto/x509"
 "encoding/hex"
 "encoding/pem"
 "errors"
 "io/ioutil"
)

var (
 Privkey string
)

func Sign(s string) (string, error) {
 key, err := ioutil.ReadFile(Privkey)
 if err != nil {
  return "", err
 }
 r, err := encryptSHA1WithRSA(key, []byte(s))
 if err != nil {
  return "", err
 }
 return hex.EncodeToString(r), nil
}

func encryptSHA1WithRSA(key, data []byte) ([]byte, error) {
 block, _ := pem.Decode(key)
 if block == nil {
  return nil, errors.New("no PEM data is found")
 }

 private, err := x509.ParsePKCS1PrivateKey(block.Bytes)
 if err != nil {
  return nil, err
 }
 hashed := SHA1(data)
 return rsa.SignPKCS1v15(rand.Reader, private, crypto.SHA1, hashed)
}

func SHA1(data []byte) []byte {
 h := sha1.New()
 h.Write(data)
 return h.Sum(nil)
}

验签

package utils

import (
 "crypto"
 "crypto/rsa"
 "crypto/sha1"
 "crypto/x509"
 "encoding/hex"
 "encoding/pem"
 "io/ioutil"
)

var (
 Pubkey  string
)

func VerifySig(origin, sig string) error {
 b, err := ioutil.ReadFile(Pubkey)
 if err != nil {
  return err
 }
 block, _ := pem.Decode(b)
 pub, err := x509.ParsePKIXPublicKey(block.Bytes)
 if err != nil {
  return err
 }
 hashed := SHA1([]byte(origin))
 sigBytes, err := hex.DecodeString(sig)
 if err != nil {
  return err
 }
 return rsa.VerifyPKCS1v15(pub.(*rsa.PublicKey), crypto.SHA1, hashed, []byte(sigBytes))
}

func SHA1(data []byte) []byte {
 h := sha1.New()
 h.Write(data)
 return h.Sum(nil)
}

到此这篇关于Go实现基于RSA加密算法的接口鉴权的文章就介绍到这了,更多相关Go RSA接口鉴权内容请搜索179885.Com以前的文章或继续浏览下面的相关文章希望大家以后多多支持179885.Com!

猜你在找的Go实现基于RSA加密算法的接口鉴权相关文章

资源处理是什么?打开文件需要关闭,打开数据库连接,连接需要释放。这些成对出现的就是资源管理。有时候我们虽然释放了,但是程序在中间出错了,那么可能导致资源释
广度优先搜索是从图中的某一顶点出发,遍历每一个顶点时,依次遍历其所有的邻接点,再从这些邻接点出发,依次访问它们的邻接点,直到图中所有被访问过的顶点的邻接点都被访
interface是Go语言的基础特性之一, 可以理解为对一种类型的规范或者约束。他跟java、c++不同, Go语言实现接口不需要显示说明实现了哪个接口, 也没有继承或者子类
本文主要聚焦在结构型模式(Structural Pattern)上,其主要思想是将多个对象组装成较大的结构,并同时保持结构的灵活和高效,从程序的结构上解决模块之间的耦合问题
本篇文章针对秀场直播,简单地描述一下消息模型,说明一下我们消息模型的架构,并结合我们一年以来,通过处理不同的业务线上问题,来进行演进式的消息模型架构的升级与调整
RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,所有主要的编程语言均有与代理接口通讯的客
我们都知道并发是提升资源利用率最基础的手段,尤其是当今大数据时代,流量对于一家互联网企业的重要性不言而喻。串流显然是不行的,尤其是对于web后端这种流量的直接
如果大家系统的学过C++、Java等语言以及面向对象的话,相信应该对多态不会陌生。多态是面向对象范畴当中经常使用并且非常好用的一个功能,它主要是用在强类型语言当
介绍了go web 预防跨站脚本的实现方式,文中给大家介绍XSS最佳的防护应该注意哪些问题,本文通过实例代码讲解的非常详细,需求的大佬可以参考下
本篇文章剖析下 Go 定时器的相关内容。定时器不管是业务开发,还是基础架构开发,都是绕不过去的存在,由此可见定时器的重要程度,感兴趣的可以了解一下
生成Excel是一个很常见的需求,本文将介绍如何使用Go的 Excelize库去生成Excel文档,以及一些具体场景下的代码实现,感兴趣的可以参考一下
给大家介绍了关于Golang中异常处理机制的相关资料,其实Go语言的异常捕获要比Python中简单的多,它没有Python中那么多复杂的异常类型及继承体系,需求的大佬可以参