jwt 私钥_28.Jwt集成(2):生成公私钥、非对称加密生成和解析token

生成公钥和私钥代码

package utils

import (

"crypto/rand"

"crypto/rsa"

"crypto/x509"

"encoding/pem"

"fmt"

"io/ioutil"

)

func GenRSAPubAndPri(bits int,filepath string ) error {

// 生成私钥文件

privateKey, err := rsa.GenerateKey(rand.Reader, bits)

if err != nil {

return err

}

derStream := x509.MarshalPKCS1PrivateKey(privateKey)

priBlock := &pem.Block{

Type: "RSA PRIVATE KEY",

Bytes: derStream,

}

err= ioutil.WriteFile(filepath+"/private.pem",pem.EncodeToMemory(priBlock), 0644)

if err!=nil{

return err

}

fmt.Println("=======私钥文件创建成功========")

// 生成公钥文件

publicKey := &privateKey.PublicKey

derPkix, err := x509.MarshalPKIXPublicKey(publicKey)

if err != nil {

return err

}

publicBlock := &pem.Block{

Type: "PUBLIC KEY",

Bytes: derPkix,

}

err= ioutil.WriteFile(filepath+"/public.pem",pem.EncodeToMemory(publicBlock), 0644)

if err!=nil{

return err

}

fmt.Println("=======公钥文件创建成功=========")

return nil

}

调用上面代码生成公钥私钥

package main

import (

"gomicro/utils"

"log"

)

func main() {

err := utils.GenRSAPubAndPri(1024, "./pem") //1024是长度,长度越长安全性越高,但是性能也就越差

if err != nil {

log.Fatal(err)

}

//执行完生成公钥和私钥,公钥给别人私钥给自己

}

使用私钥去加密

package main

import (

"fmt"

"github.com/dgrijalva/jwt-go"

"io/ioutil"

"log"

)

type UserClaim struct { //这个结构体主要是用来宣示当前公钥的使用者是谁,只有使用者和公钥的签名者是同一个人才可以用来正确的解密,还可以设置其他的属性,可以去百度一下

Uname string `json:"username"`

jwt.StandardClaims //嵌套了这个结构体就实现了Claim接口

}

func main() {

priBytes, err := ioutil.ReadFile("./pem/private.pem")

if err != nil {

log.Fatal("私钥文件读取失败")

}

pubBytes, err := ioutil.ReadFile("./pem/public.pem")

if err != nil {

log.Fatal("公钥文件读取失败")

}

pubKey, err := jwt.ParseRSAPublicKeyFromPEM(pubBytes)

if err != nil {

log.Fatal("公钥文件不正确")

}

priKey, err := jwt.ParseRSAPrivateKeyFromPEM(priBytes)

if err != nil {

log.Fatal("私钥文件不正确")

}

token_obj := jwt.NewWithClaims(jwt.SigningMethodRS256, UserClaim{Uname: "xiahualou"}) //所有人给xiahualou发送公钥加密的数据,但是只有xiahualou本人可以使用私钥解密

token, _ := token_obj.SignedString(priKey)

uc := &UserClaim{}

getToken, _ := jwt.ParseWithClaims(token, uc, func(token *jwt.Token) (i interface{}, e error) { //使用私钥解密

return pubKey, nil //这里的返回值必须是公钥,不然解密肯定是失败

})

if getToken.Valid { //服务端验证token是否有效

fmt.Println(getToken.Claims.(*UserClaim).Uname)

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值