go中的jwt加密

本文介绍了如何使用JWT进行加密,并展示了如何生成RSA公钥和私钥,以及如何利用这些密钥进行加密和解密操作。通过示例代码,演示了使用Go语言实现JWT的HS256和RS256签名方法,以及解析JWT token的过程。
摘要由CSDN通过智能技术生成

jwt密钥加密

  1. 下载jwt包
go get -u github.com/dgrijalva/jwt-go
  1. 加密代码
package main

import (
	"fmt"
	"github.com/dgrijalva/jwt-go"
	"io/ioutil"
	"log"
)

type UserClaim struct {
	Uname string `json:"username"`
	jwt.StandardClaims
}

func main() {
	sec := []byte("123abc")
	token_obj := jwt.NewWithClaims(jwt.SigningMethodHS256, UserClaim{Uname: "baibing"})
	token, _ := token_obj.SignedString(sec)
	fmt.Println(token)

	//parse, _ := jwt.Parse(token, func(token *jwt.Token) (interface{}, error) {
	//	return sec, nil
	//})
	//
	//if parse.Valid {
	//	fmt.Println(parse.Claims)
	//
	//}
	uc := UserClaim{}
	parse, _ := jwt.ParseWithClaims(token, &uc, func(token *jwt.Token) (interface{}, error) {
		return sec, nil
	})

	if parse.Valid {
		fmt.Println(parse.Claims.(*UserClaim).Uname)

	}
}

jwt公钥加密,私钥解密

  1. 先生成公钥和私钥,执行下面的代码,会在本地生成两个文件private.pem和public.pem
package main

import (
	"crypto/rand"
	"crypto/rsa"
	"crypto/x509"
	"encoding/pem"
	"os"
)

//生成RSA私钥和公钥,保存到文件中
// bits 证书大小
func GenerateRSAKey(bits int) {
	//GenerateKey函数使用随机数据生成器random生成一对具有指定字位数的RSA密钥
	//Reader是一个全局、共享的密码用强随机数生成器
	privateKey, err := rsa.GenerateKey(rand.Reader, bits)
	if err != nil {
		panic(err)
	}
	//保存私钥
	//通过x509标准将得到的ras私钥序列化为ASN.1 的 DER编码字符串
	X509PrivateKey := x509.MarshalPKCS1PrivateKey(privateKey)
	//使用pem格式对x509输出的内容进行编码
	//创建文件保存私钥
	privateFile, err := os.Create("private.pem")
	if err != nil {
		panic(err)
	}
	defer privateFile.Close()
	//构建一个pem.Block结构体对象
	privateBlock := pem.Block{Type: "RSA Private Key", Bytes: X509PrivateKey}
	//将数据保存到文件
	pem.Encode(privateFile, &privateBlock)

	//保存公钥
	//获取公钥的数据
	publicKey := privateKey.PublicKey
	//X509对公钥编码
	X509PublicKey, err := x509.MarshalPKIXPublicKey(&publicKey)
	if err != nil {
		panic(err)
	}
	//pem格式编码
	//创建用于保存公钥的文件
	publicFile, err := os.Create("public.pem")
	if err != nil {
		panic(err)
	}
	defer publicFile.Close()
	//创建一个pem.Block结构体对象
	publicBlock := pem.Block{Type: "RSA Public Key", Bytes: X509PublicKey}
	//保存到文件
	pem.Encode(publicFile, &publicBlock)
}

func main() {
	//生成密钥对,保存到文件
	GenerateRSAKey(2048)
}

  1. 利用生成的私钥和公钥实现生成token并解秘
package main

import (
	"fmt"
	"github.com/dgrijalva/jwt-go"
	"io/ioutil"
	"log"
)

type UserClaim struct {
	Uname string `json:"username"`
	jwt.StandardClaims
}

func main() {
	priKeyBytes, err := ioutil.ReadFile("./private.pem")
	if err != nil {
		log.Fatal("私钥文件读取失败")
	}

	prikey, err := jwt.ParseRSAPrivateKeyFromPEM(priKeyBytes)
	if err != nil {
		log.Fatal("私钥错误")
	}

	pubKeyBytes, err := ioutil.ReadFile("./public.pem")
	if err != nil {
		log.Fatal("公钥文件读取失败")
	}

	pubkey, err := jwt.ParseRSAPublicKeyFromPEM(pubKeyBytes)
	if err != nil {
		log.Fatal("公钥错误")
	}

	token_obj := jwt.NewWithClaims(jwt.SigningMethodRS256, UserClaim{Uname: "baibing"})
	token, _ := token_obj.SignedString(prikey)
	fmt.Println(token)

	uc := UserClaim{}
	parse, _ := jwt.ParseWithClaims(token, &uc, func(token *jwt.Token) (interface{}, error) {
		return pubkey, nil
	})

	if parse.Valid {
		fmt.Println(parse.Claims.(*UserClaim).Uname)
		fmt.Println(parse.Claims.(*UserClaim).ExpiresAt)
	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值