RSA算法 token生成与解析

本文演示两种方式,一种是把密钥文件放在配置文件中,一种是把密钥文件本身放入项目或者容器中。

下面两种的区别在于私钥公钥的初始化, init方法,需要哪种取哪种。

  1. 通过文件读取

  • 首先是密钥文件(privateKey),放在如config目录下。

-----BEGIN RSA PRIVATE KEY-----
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAMu4IDG1XU6a7bXo
4V1jSnbKk9Eum2WguAyq+maCRcP9JoHlE/HmhPOjl91aN5gDHw3pgB7QMMkPkuyY
0aG9UiIo7PbBgjXsNBErprKa8G7GKhDN4B3m8jxEi1NLtCk2H8AEf8H/deGFXCde
fjQx0NcTbJ8STfbsqrLhOq2xzAgMBAAECgYEAg1kZMNOd8IOFxqb7P2o4ZbUh
b1rciL8CS/CleBiAgOgkvtWDcZFOoYQV83sqoxFIIYEuwS88dTZcZb32U5EsdYEx
JvJwAAYnzpch/YAz0llvXSHzZwNfGGvs4qt0d74bFpPfveli82wSKMlykeajP2Ro
RQpOniTYOWrJ01UHdUECQQDt1KTj/Xs5BNmEZAkJVmGekQROADk+ztceAe9UMj/J
s5xECdXVwuFh2Rm62MMQNNoW2Pjz4Y5NqhjRu0MMZnlTAkEA20hZsgA78aqTO7s+
+y/CLgP3Cd7uG/5RkcmjBWq2eXkt6wmazZl0BMYb7vshblnMjFXJwuOmfBJl7rTr
1fg8YQJAEo4Jg0QObgdj1QFc9x6HJTDZLiC0VqMag1vRSTdWZK0fnutJhJDctp6S
dFJe/Y+yCCBLY/OP/50qrIo4k+oWwwJAIn8hTTVoOL6C5xSv9cgvnhmVlYHyp4i8
wFieQs3k4vtDVARwzANmExIvdssfGUMbQMCGOxihKkeirYjcyQ6CQQJAbsbpzCjD
wd9JCogmTu/xYqtL898ek7LeNkhgIY2KhYtlptxlHfzgLBUgiSTNTcD1YWtSSp6u
A5ImxrryDYPmfg==
-----END RSA PRIVATE KEY-----
  • 处理私钥,生成token与解析

package mainimport ("crypto/rsa""crypto/x509""encoding/base64""errors""github.com/golang-jwt/jwt/v4""io/ioutil""log""time"
)var (publicKey  *rsa.PublicKeyprivateKey *rsa.PrivateKey
)func main() {token, _ := createToken(privateKey)println("-------------")println(token)println("-------------")a1, _ := getSubFromToken(token)println(a1)
}func init() {publicKeyByte, err := ioutil.ReadFile("公钥的路径/public.key")if err != nil {log.Println(err.Error())}publicKey, err = jwt.ParseRSAPublicKeyFromPEM(publicKeyByte)privateKeyByte, err := ioutil.ReadFile("私钥的路径/private.key")if err != nil {log.Println(err.Error())}privateKey, _ = jwt.ParseRSAPrivateKeyFromPEM(privateKeyByte)
}// createToken 生成一个RS256验证的Token
// Token里面包括的值,可以自己根据情况添加,
func createToken(privateKey *rsa.PrivateKey) (tokenStr string, err error) {expireTime := time.Now().Add(7 * 24 * time.Hour)var audi = jwt.ClaimStrings{"zwmgc",}var expir = jwt.NewNumericDate(expireTime)claim := jwt.RegisteredClaims{Audience:  audi,ExpiresAt: expir, //过期时间//IssuedAt:  time.Now().Unix(),Issuer:  "simba-sdk",                              // 签名颁发者Subject: "23258bd202e451a988234c2145d754a", //签名主题}// jwt.SigningMethodHS256token := jwt.NewWithClaims(jwt.SigningMethodRS256, claim)tokenStr, _ = token.SignedString(privateKey)return
}// getSubFromToken 获取Token的主题(也可以更改获取其他值)
// 参数tokenStr指的是 从客户端传来的待验证Token
// 验证Token过程中,如果Token生成过程中,指定了iat与exp参数值,将会自动根据时间戳进行时间验证
func getSubFromToken(tokenStr string) (sub string, err error) {// 基于公钥验证Token合法性token, err := jwt.Parse(tokenStr, func(token *jwt.Token) (interface{}, error) {// 基于JWT的第一部分中的alg字段值进行一次验证if _, ok := token.Method.(*jwt.SigningMethodRSA); !ok {return nil, errors.New("验证Token的加密类型错误")}return publicKey, nil})if err != nil {return}if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {return claims["sub"].(string), nil}return "", errors.New("token无效或者无对应值")
}
  1. 通过配置文件或者字符串

package mainimport ("crypto/rsa""crypto/x509""encoding/base64""errors""github.com/golang-jwt/jwt/v4""io/ioutil""log""time"
)var (publicKey  *rsa.PublicKeyprivateKey *rsa.PrivateKey
)func main() {token, _ := createToken(privateKey)println("-------------")println(token)println("-------------")a1, _ := getSubFromToken(token)println(a1)
}func init() {// 初始化 public Keyvar publicKeyStr = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDLuCAxtV1Omu216OFdY0p2ypPR\n" +"LptloLgMqvpmgkXD/SaB5RPx5oTzo5fdWjeYAx8N6YAe0DDJD5LsmNGhvVIiKOz2\n" +"wYI17DQRK6aymvBuxioQzeAd5vI8RBH/B/3XhhVwnXn40MdDQxA3E\n" +"2yfEk327Kqy4TqtscwIDAQAB"publicKeyBinary := make([]byte, base64.StdEncoding.DecodedLen(len(publicKeyStr)))publicKeyLen, _ := base64.StdEncoding.Decode(publicKeyBinary, []byte(publicKeyStr))publicKeyBinary = publicKeyBinary[:publicKeyLen]pubInterface, _ := x509.ParsePKIXPublicKey(publicKeyBinary)publicKey = pubInterface.(*rsa.PublicKey)// 初始化 private Keyvar privateKeyStr = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAMu4IDG1XU6a7bXo\n" +"4V1jSnbKk9Eum2WguAyq+maCRcP9JoHlE/HmhPOjl91aN5gDHw3pgB7QMMkPkuyY\n" +"0aG9UiIo7PbBgjXsNBErprKa8G7GKhDN4B3m8jxEi1NLtCk2H8AEf8H/deGFXCde\n" +"fjQx0NDEDcTbJ8STfbsqrLhOq2YEAg1kZMNOd8IOFxqb7P2o4ZbUh\n" +"b1rciL8CS/CleBiAgOgkvtWDcZFOoYQV83sqoxFIIYEuwS88dTZcZb32U5EsdYEx\n" +"JvJwAAYnzpch/YAz0llvXSHzZwNfGGvs4qt0d74bFpPfveli82wSKMlykeajP2Ro\n" +"RQpOniTYOWrJ01UHdUECQQDt1KTj/Xs5BNmEZAkJVmGekQROADk+ztceAe9UMj/J\n" +"s5xECdXVwuFh2Rm62MMQNNoW2Pjz4Y5NqhjRu0MMZnlTAkEA20hZsgA78aqTO7s+\n" +"+y/CLgP3Cd7uG/5RkcmjBWq2eXkt6wmazZl0BMYb7vshblnMjFXJwuOmfBJl7rTr\n" +"1fg8YQJAEo4Jg0QObgdj1QFc9x6HJTDZLiC0VqMag1vRSTdWZK0fnutJhJDctp6S\n" +"dFJe/Y+yCCBLY/OP/50qrIo4k+oWwwJAIn8hTTVoOL6C5xSv9cgvnhmVlYHyp4i8\n" +"wFieQs3k4vtDVARwzANmExIvdssfGUMbQMCGOxihKkeirYjcyQ6CQQJAbsbpzCjD\n" +"wd9JCogmTu/xYqtL898ek7LeNkhgIY2KhYtlptxlHfzgLBUgiSTNTcD1YWtSSp6u\n" +"A5ImxrryDYPmfg=="privateKeyBinary := make([]byte, base64.StdEncoding.DecodedLen(len(privateKeyStr)))privateKeyLen, _ := base64.StdEncoding.Decode(privateKeyBinary, []byte(privateKeyStr))privateKeyBinary = privateKeyBinary[:privateKeyLen]privateInterface, _ := x509.ParsePKCS8PrivateKey(privateKeyBinary)privateKey = privateInterface.(*rsa.PrivateKey)
}// createToken 生成一个RS256验证的Token
// Token里面包括的值,可以自己根据情况添加,
func createToken(privateKey *rsa.PrivateKey) (tokenStr string, err error) {expireTime := time.Now().Add(7 * 24 * time.Hour)var audi = jwt.ClaimStrings{"zwmgc",}var expir = jwt.NewNumericDate(expireTime)claim := jwt.RegisteredClaims{Audience:  audi,ExpiresAt: expir, //过期时间//IssuedAt:  time.Now().Unix(),Issuer:  "simba-sdk",                              // 签名颁发者Subject: "23258bd202e451a988234c2145d754a", //签名主题}// jwt.SigningMethodHS256token := jwt.NewWithClaims(jwt.SigningMethodRS256, claim)tokenStr, _ = token.SignedString(privateKey)return
}// getSubFromToken 获取Token的主题(也可以更改获取其他值)
// 参数tokenStr指的是 从客户端传来的待验证Token
// 验证Token过程中,如果Token生成过程中,指定了iat与exp参数值,将会自动根据时间戳进行时间验证
func getSubFromToken(tokenStr string) (sub string, err error) {// 基于公钥验证Token合法性token, err := jwt.Parse(tokenStr, func(token *jwt.Token) (interface{}, error) {// 基于JWT的第一部分中的alg字段值进行一次验证if _, ok := token.Method.(*jwt.SigningMethodRSA); !ok {return nil, errors.New("验证Token的加密类型错误")}return publicKey, nil})if err != nil {return}if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {return claims["sub"].(string), nil}return "", errors.New("token无效或者无对应值")
}

golang通过RSA算法生成token,go从配置文件中注入密钥文件,go从文件中读取密钥文件,go RSA算法下token生成与解析;go java token共用相关推荐

  1. qt先生成json文件后程序启动时读取json文件在一组数据模拟下正常,换一组数据就出现乱码

    提要 程序编号后自己模拟的数据程序在生成和解析json时都正常,但是换了一组数据,生成的json文件中部分中文乱码,且出现json文件的格式被混乱的现象. 效果 上述出现的不正确的json文件,如下: ...

  2. python将字符串s和换行符写入文件fp_软件测试技术之如何用python在Windows系统下,生成UNIX格式文件...

    本文将带你了解软件测试技术之如何用python在Windows系统下,生成UNIX格式文件,希望对大家学测试技术有所帮助 如何用python在Windows系统下,生成UNIX格式文件 平时测试工作中 ...

  3. python将文件转成linux格式,怎么用python在Windows系统下,生成UNIX格式文件

    如何用python在Windows系统下,生成UNIX格式文件 平时测试工作中,少不了制造测试数据.最近一个项目,我就需要制造一批可在UNIX下正确读取的文件.为确保这批文件能从FTP下载成功,开发叮 ...

  4. 10.算法进阶之分布式篇——分布式环境下如何生成唯一ID——UUID

    UUID--全局唯一ID--universally unique identifie. 一般来说常用的基于时间进行排序,因为时间是自然递增的.但是全局唯一ID的两个核心要求是: 全局唯一 粗略有序 在 ...

  5. java token生成和验证_Java Token登录验证 生成解析Token

    借鉴参考 Java Token登录验证 使用jjwt生成和解析JWT java基于token验证之登陆验证 等 什么是Token? 我的理解来说 token就是你访问服务器的口令,只要token合法, ...

  6. linux下keytool生成证书_生成证书命令keytool

    NOTE: (xp:%JAVA_HOME%/jre/lib/security/cacerts,linux: $JAVA_HOME/jre/lib/security/cacerts) 验证是否已创建过同 ...

  7. linux下keytool生成证书_使用keytool 生成证书

    keytool 简介 keytool 是java 用于管理密钥和证书的工具,官方文档 其功能包括: 创建并管理密钥 创建并管理证书 作为CA 为证书授权 导入导出证书 主要格式 keytool 采用 ...

  8. 记录下Mac生成安卓证书

    最近开发基于uniapp框架的app,需要打包为安卓的apk安装包. 会用到安卓证书. 先装环境: JRE(Java Runtime Environment)环境, 我们需要安装Java SE.下载对 ...

  9. 在Windows平台下自己生成crt证书

    由于一个朋友的网站需要使用HTTPS协议,在配置Apache的使用ssl出错导致Apache无法启动.如果没有现成的crt证书,则可以自己生成crt证书,当然这种自己生成的crt证书也是有局限性的,没 ...

  10. 编程实现路由算法 实验报告_lt;中国通信专刊gt; EARS:用于软件定义网络中自动路由的智能驱动体验网络架构...

    题目:EARS:用于软件定义网络中自动路由的智能驱动体验网络架构 摘要:软件定义网络(SDN)通过将控制平面与数据平面解耦来适应逻辑集中的控制,并提供对网络资源的有效利用.但是,由于传统路由策略依赖于 ...

最新文章

  1. python pytorch 包的安装
  2. 中国CIO最关心的八大问题(上)
  3. 第一章初始mybatis框架
  4. 没有人会告诉您乘坐飞机时的几个事实 但是您一定要知道
  5. C++中正确使用PRId64
  6. IPv6 解说 ,与IPv4的同异
  7. 阿里一面 缓存穿透、缓存击穿、缓存雪崩和热点数据失效问题的解决方案
  8. win7系统还原在哪​
  9. ios图文详情加载html_IOS WKWebView加载本地H5以及css,js等样式
  10. 拼多多:“优惠券Bug属网络诈骗”;抖音多闪上架 App Store;任正非不知谁是接班人 | 极客头条...
  11. 【面试】计算机操作系统
  12. LeetCode——706,设计哈希映射
  13. 用正则表达式将字符串中的下划线小写转换成大写
  14. 用Woocommerce建立一个网上商店 [03] 增加产品类别
  15. elementUI实现table表头展示上、下角标
  16. 7-3 拍7令三 (100 分)
  17. 如何在直播视频上添加水印Logo
  18. 5G技术发展的发展现状,未来发展有哪些关键点和趋势
  19. adobe flash(转载)
  20. 拓展实践:系统函数的调用

热门文章

  1. Linux安装mysql,一步到位!
  2. java写游戏的聊天怎么写_怎么用JAVA编写一个打字游戏
  3. 2022-2028年中国乳制品行业市场需求预测与投资战略规划分析报告
  4. 2022-2028中国工作服市场现状及未来发展趋势
  5. 2022-2028年中国聚氨酯结构胶行业发展动态分析及投资机会预测报告
  6. 离线安装Visual Studio Code插件
  7. js获取html代码中所有图片地址
  8. npm install遇到ENOENT: no such file or directory, rename错误
  9. 计算机组成原理-第二章 数据表示与运算
  10. ❤️手撕这十道HiveSQL题还不能吊打面试官,却能保你不被吊打❤️【推荐收藏】