1.RSA非對稱加密
RSA非對稱加密的是對簽名的加密,不是對jwt的頭部,荷載加密,頭部和荷載用的時base64加密,從jwt官網就可以知道
token是通過拼字串拼在一起的,
從而得出結論:
1.荷載里面可以放自定義的資料,但是不能放敏感資料,



如上圖,就算拿著token到這里,可以看見header,payload,但是左下角顯示的時無效的簽名Invalid Signature,因為沒有放入公鑰
輸入對應的公鑰,就可以看見,完成了校驗,從而就可以知道公鑰和密鑰的使用方式和場景,

2.公鑰和密鑰
非對稱加密,前提需要公鑰和密鑰,它們是成對出現
一般密鑰用來簽名,公鑰用來校驗,這一般是兩個檔案存放的資料,生成密鑰可以使用golang的rsa庫,公鑰可以直接從密鑰中獲取,
使用golang的rsa庫生成密鑰
其實在這里,我們可以選擇每次生成新token時都重新生成一堆密鑰公鑰,然后將公鑰發布到需要更新公鑰的系統中,也可以始終只用一對公鑰密鑰,這在分布式的系統中很有幫助,產生鑰匙對的系統只用將公鑰發布給各個系統即可,因為它們只需要做校驗功能,
func CreateKeys() (*rsa.PrivateKey, rsa.PublicKey) {
privateKey, err := rsa.GenerateKey(rand.Reader, 4096)
if err != nil {
panic(err)
}
publicKey := privateKey.PublicKey
return privateKey, publicKey
}
這里我們將已經生成的密鑰存入了一個private.key檔案
根據檔案路徑獲取密鑰
func GetPrivateKey(privateKeyFilePath string) *rsa.PrivateKey {
file, err := os.Open(filePath)
if err != nil {
fmt.Errorf("%v", err)
}
pkBytes, err := ioutil.ReadAll(file)
if err != nil {
fmt.Errorf("%v", err)
}
key, err := jwt.ParseRSAPrivateKeyFromPEM(pkBytes)
if err != nil {
fmt.Errorf("cannot parse private key>%v", err)
}
return key
}
獲取公鑰
func GetPublicKeyByPrivateKey(privateKeyFilePath string) *rsa.PublicKey {
privateKey := GetPrivateKey(filePath)
publicKey := privateKey.PublicKey
return &publicKey
}
生成token
func (j *JWT) CreateToken(claims request.CustomClaims) (string, error) {
//選擇簽名演算法,傳入荷載
token := jwt.NewWithClaims(jwt.SigningMethodRS512, claims)
//獲取密鑰
privateKey := GetPrivateKey("./source/keyFile/private.key")
//簽名
tokenStr, err := token.SignedString(privateKey)
return tokenStr, err
}
決議token
這里從密鑰獲取公鑰是因為,這是在jwt簽名的系統中進行的決議,就無所謂了
// 決議 token
func (j *JWT) ParseToken(tokenString string) (*request.CustomClaims, error) {
publicKey := GetPublicKeyByPrivateKey("密鑰資料檔案路徑")
token, err := jwt.ParseWithClaims(tokenString, &request.CustomClaims{}, func(token *jwt.Token) (i interface{}, e error) {
return publicKey, nil
})
if err != nil {
if ve, ok := err.(*jwt.ValidationError); ok {
if ve.Errors&jwt.ValidationErrorMalformed != 0 {
return nil, TokenMalformed
} else if ve.Errors&jwt.ValidationErrorExpired != 0 {
// Token is expired
return nil, TokenExpired
} else if ve.Errors&jwt.ValidationErrorNotValidYet != 0 {
return nil, TokenNotValidYet
} else {
return nil, TokenInvalid
}
}
}
if token != nil {
if claims, ok := token.Claims.(*request.CustomClaims); ok && token.Valid {
return claims, nil
}
return nil, TokenInvalid
} else {
return nil, TokenInvalid
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/389362.html
標籤:區塊鏈
上一篇:用戶憑據明文傳輸
