Go实现基于RSA加密算法的接口鉴权
作者:K8sCat 发布时间:2024-05-10 13:56:33
标签: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)
}
来源:https://juejin.cn/post/6977375075464904735
0
投稿
猜你喜欢
- model:class Profile(models.Model): user = models.OneToOneField(User, o
- 使用Python+OpenCV实现鼠标画框的代码,供大家参考,具体内容如下# -*-coding: utf-8 -*-""
- 安装好mysql后,配制文件应该在/usr/local/mysql/share/mysql目录中,配制文件有几个,有my- huge.cnf
- 本文实例讲述了Python 网络编程之TCP客户端/服务端功能。分享给大家供大家参考,具体如下:demo.py(TCP客户端):import
- CreateOrUpdate 是业务开发中很常见的场景,我们支持用户对某个业务实体进行创建/配置。希望实现的 repository 接口要达
- 代码如下: Function NumberSplit(num) Dim i,length length=Len(num) For i=1 T
- 一、concat()函数功能:将多个字符串连接成一个字符串语法:concat(str1,str2,…) 其中的字符串既可以是数据表字段,也可
- Div+CSS+JS组和能够实现很多好看的特殊的效果,这里推荐一款可刷新的下拉菜单:下面是js代码部分:<script type=te
- 一、腾讯语音合成介绍腾讯云语音合成技术(TTS)可以将任意文本转化为语音,实现让机器和应用张口说话。 腾讯TTS技术可以应用到很多场景,比如
- 本文列出了HTML4标签的默认样式列表,对网页设计者来说这个应该很有用。原文来自:W3C (http://www.w3.org/TR/CSS
- 网上关于tensorflow模型文件ckpt格式转pb文件的帖子很多,本人几乎尝试了所有方法,最后终于成功了,现总结如下。方法无外乎下面两种
- import导入模块import time #导入的时模块中的所有内容print(time.ctime()) #调用模块中的函数
- 在oracle数据库迁移至mysql数据库,除了oracle数据库模型移到mysql外,还一个重要环节就是要将oracle数据库的数据移到m
- CSS重设就是由于各种浏览器解释CSS样式的初始值有所不同,导致设计师在没有定义某个CSS属性时,不同的浏览器会按照自己的默认值来为没有定义
- Python 字符串描述Python rstrip() 删除 string 字符串末尾的指定字符(默认为空格).语法rstrip()方法语法
- PHP屏蔽蜘蛛访问代码代码:常用搜索引擎名与 HTTP_USER_AGENT对应值百度baiduspider谷歌googlebot搜狗sog
- pytorch常用函数torch.randn()torch.randn(*sizes, out=None) → Tensor功能:从标准正态
- 翻译说明:这是Solid State Group网站上的一篇很友好的文章,解决了我在设计中遇到的很多问题,故在此我翻译其文,并对原作者表示非
- 在索引列上使用函数使得索引失效的是常见的索引失效原因之一,因此尽可能的避免在索引列上使用函数。尽管可以使用基于函数的索引来解决索引失效的问题
- 我们使用tp或者yii2的时候,会将网站的前台和后台按照模块分组。yii2的高级模板已经帮我们划分好了,tp系列框架需要自己配置分组。那么l