zoukankan      html  css  js  c++  java
  • 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)
        }
    
    }
    




  • 相关阅读:
    安卓SharedPreferences类的使用
    安卓登录案例
    如何用Android Studio查看build.gradle源码
    学点Groovy来理解build.gradle代码
    build.gradle代码
    【Android】TextView文字长度测量和各种Paddding解析
    【Android】TextView跑马灯效果
    【分享】学长的安利来了~~O(∩_∩)O
    【Android】Fragment懒加载和ViewPager的坑
    【Android】你应该知道的调试神器----adb
  • 原文地址:https://www.cnblogs.com/hualou/p/12090813.html
Copyright © 2011-2022 走看看