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接口鉴权内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Golang加密解密之RSA(附带php)

    RSA加密算法简史 RSA是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.当时他们三人都在麻省理工学院工作.RSA就是他们三人姓氏开头字母拼在一起组成的. RSA加密算法原理 学过算法的朋友都知道,计算机中的算法其实就是数学运算.所以,再讲解RSA加密算法之前,有必要了解一下一些必备的数学知识.我们就从数学知识开始讲解. 必备数学知识 RSA加密算法中,只用到素数.互质数.指数运算.模运算等

  • Go语言 如何实现RSA加密解密

    RSA是一种非对称加密算法,它的名字是由它的三位开发者,即RonRivest.AdiShamir和LeonardAdleman 的姓氏的首字母组成的(Rivest-Shamir-Adleman ),可用于数据加密和数字签名. 用于数据加密时,消息发送方利用对方的公钥进行加密,消息接受方收到密文时使用自己的私钥进行解密. 实现代码如下: import ( "crypto/rsa" "crypto/rand" "crypto/x509" "

  • golang 如何获取pem格式RSA公私钥长度

    因在做license注册机制当中,有对根据本地RSA pem密钥文件判断出RSA的公私密钥长度的需求(即:根据pem内容判断出RSA密钥是1024位或者2048位,或者其他位数等),因此个人通过思考,摸索整理出一个方法,予以记录,备用,分享. package main import ( "crypto/rsa" "crypto/x509" "encoding/pem" "errors" "fmt" &quo

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

    基于 RSA 加密算法的接口鉴权方案 假设接口调用者是客户端,接口提供方是服务端,则此方案存在以下规则: 客户端需要使用 RSA 算法(1024 位长度的私钥)生成公私钥,并将公钥下发给服务端: 客户端使用私钥对请求内容加签,然后需要同时将请求内容和签名一并发给服务端: 服务端收到请求后,使用客户端给的公钥对请求内容和签名进行验签,以确定请求是来自客户端的. 生成公私钥 # 生成 1024 位长度的私钥 openssl genrsa -out private-key.pem 1024 # 生成公

  • 基于PHP实现JWT登录鉴权的示例代码

    目录 一.什么是JWT 1.简介 2.JWT的组成 3.JWT验证流程和特点 二.相关问题 三.PHP实现 1.引入依赖 2.功能实现 3.封装工具类如下 一.什么是JWT 1.简介 JWT(JSON Web Token)是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准. 简单的说,JWT就是一种Token的编码算法,服务器端负责根据一个密码和算法生成Token,然后发给客户端,客户端只负责后面每次请求都在HTTP header里面带上这个Token,服务器负责验证这个Token

  • springboot中shiro使用自定义注解屏蔽接口鉴权实现

    目录 传统做法 使用自定义注解屏蔽接口鉴权 拓展内容:关于spring中的派生注解 传统做法 spring boot整合shiro后,如果某些接口需要屏蔽鉴权的话(比如登录)接口,我们一般会这么做: @Bean(name = "shiroFilter") public ShiroFilterFactoryBean shiroFilterFactoryBean(org.apache.shiro.mgt.SecurityManager securityManager) { ShiroFil

  • 如何在SpringBoot中使用Spring-AOP实现接口鉴权

    目录 面向切面编程 AOP的底层原理实现 AOP的相关术语 相关注解以及切入点表达式 实现接口鉴权 1. 配置yml文件 2. 读取账密配置 3.编写接口鉴权方法 4. 编写AOP 5.编写接口测试 面向切面编程 面向切面编程,可以将与业务无关但是需要被各个业务模块共同调用的逻辑抽取出来,以切面的方式切入到代码中,从而降低系统中代码的耦合度,减少重复的代码. Spring AOP是通过预编译方式和运行期间动态代理实现程序面向切面编程 AOP的底层原理实现 AOP底层使用动态代理完成需求,为需要增

  • Java中使用JWT生成Token进行接口鉴权实现方法

    先介绍下利用JWT进行鉴权的思路: 1.用户发起登录请求. 2.服务端创建一个加密后的JWT信息,作为Token返回. 3.在后续请求中JWT信息作为请求头,发给服务端. 4.服务端拿到JWT之后进行解密,正确解密表示此次请求合法,验证通过:解密失败说明Token无效或者已过期. 流程图如下: 一.用户发起登录请求 二.服务端创建一个加密后的JWT信息,作为Token返回 1.用户登录之后把生成的Token返回给前端 @Authorization @ResponseBody @GetMappin

  • 使用Feign设置Token鉴权调用接口

    目录 Feign设置Token鉴权调用接口 声明FeignClient指定url 调用测试 返回对象可以封装demo 先去implementsRequestInterceptor重写apply方法 配置拦截器 Feign调用进行Token鉴权 项目场景 解决办法 具体实现 注意有Bug!!! Feign设置Token鉴权调用接口 声明FeignClient 指定url /**  * CREATE BY songzhongjin ON 2021.05.08 15:58 星期六  * DESC:fe

  • React路由鉴权的实现方法

    前言 上一篇文章中有同学提到路由鉴权,由于时间关系没有写,本文将针对这一特性对 vue 和 react 做专门说明,希望同学看了以后能够受益匪浅,对你的项目能够有所帮助,本文借鉴了很多大佬的文章篇幅也是比较长的. 背景 单独项目中是希望根据登录人来看下这个人是不是有权限进入当前页面.虽然服务端做了进行接口的权限,但是每一个路由加载的时候都要去请求这个接口太浪费了.有时候是通过SESSIONID来校验登陆权限的. 在正式开始 react 路由鉴权之前我们先看一下vue的路由鉴权是如何工作的: 一.

  • thinkjs微信中控之微信鉴权登陆的实现代码

    前言 上一篇文章大概写了一下如何搭一个微信中控服务: [thinkjs搭建微信中控服务] . 接下来这篇,专门写一下如何在此基础上扩展出来一个比较好用的微信鉴权登陆的方案. 由于这一段的逻辑着实有点绕,所以就单独拿出来写了. 有时候,调用方甚至可以通过这个方案,进行多公众号openid的之间的关联. 官方说明 开发文档 微信文档地址:传送门 鉴权逻辑 前端跳转到以下url,重定向或者代码跳转都可以:https://open.weixin.qq.com/connect/oauth2/authori

  • Python实现的rsa加密算法详解

    本文实例讲述了Python实现的rsa加密算法.分享给大家供大家参考,具体如下: 算法过程 1. 随意选择两个大的质数p和q,p不等于q,计算N=pq. 2. 根据欧拉函数,不大于N且与N互质的整数個数為(p-1)(q-1). 3. 选择一个整数e与(p-1)(q-1)互质,并且e小于(p-1)(q-1). 4. 用以下这个公式计算d:d× e ≡ 1 (mod (p-1)(q-1)). 5. 将p和q的记录销毁. (N,e)是公钥,(N,d)是私钥. python代码 # -*- coding

  • Python如何基于rsa模块实现非对称加密与解密

    这篇文章主要介绍了Python如何基于rsa模块实现非对称加密与解密,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.简单介绍: RSA加密算法是一种非对称加密算法 是由已知加密密钥推导出解密密钥在计算上是不可行的"密码体制.加密密钥(即公开密钥)PK是公开信息,而解密密钥(即秘密密钥)SK是需要保密的. RSA密钥至少为500位长,一般推荐使用1024位.RSA密钥长度随着保密级别提高,增加很快. 由于RSA的特性,一个1024位的密钥只能

随机推荐