28.Jwt集成:生成公私钥非对称加密生成和解析token

Posted hualou

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了28.Jwt集成:生成公私钥非对称加密生成和解析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)
    }

}




以上是关于28.Jwt集成:生成公私钥非对称加密生成和解析token的主要内容,如果未能解决你的问题,请参考以下文章

Python rsa公私钥生成 rsa公钥加密(分段加密)私钥加签实战

使用php openssl扩展实现非对称加密

python使用rsa非对称加密

非对称加密算法

对称加密 和 非对称加密

JAVA RSA加密公私钥