返回

JWT新手入门 | 一文搞懂对称与非对称JWT签名与验签

后端

JWT 签名和验证:一探究竟

简介

JWT(JSON Web Token)是一种流行的授权机制,允许您安全地将用户身份信息存储在一个紧凑的字符串中。JWT 签名和验证是保护 JWT 内容完整性和真实性的至关重要的环节,可防止恶意篡改和伪造。

什么是 JWT 签名和验证?

JWT 签名涉及使用密钥对 JWT 内容进行哈希计算,生成签名。JWT 验证则涉及将签名与 JWT 内容以及相同的密钥进行哈希计算,然后比较结果。如果结果一致,则表示 JWT 未被篡改,是合法的。

对称与非对称 JWT 签名和验证

JWT 签名和验证有两种常见方法:对称签名和非对称签名。

  • 对称签名 :使用相同的密钥进行签名和验证,简单易用,但密钥安全性至关重要。
  • 非对称签名 :使用一对密钥:公钥和私钥。公钥用于签名,私钥用于验证,更安全,因为私钥是保密的。

Go 语言中 JWT 签名和验证

Go 语言的 jwt-go 库提供了丰富的 JWT 处理功能,包括签名和验证。

对称 JWT 签名和验证

import (
    "github.com/golang-jwt/jwt/v4"
)

func SignJWT(claims jwt.Claims, secretKey string) (string, error) {
    token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
    return token.SignedString([]byte(secretKey))
}

func VerifyJWT(tokenString, secretKey string) (*jwt.Token, error) {
    return jwt.ParseWithClaims(tokenString, &jwt.StandardClaims{}, func(token *jwt.Token) (interface{}, error) {
        return []byte(secretKey), nil
    })
}

非对称 JWT 签名和验证

import (
    "crypto/rsa"
    "crypto/x509"
    "encoding/pem"
    "github.com/golang-jwt/jwt/v4"
)

func SignJWT(claims jwt.Claims, privateKey *rsa.PrivateKey) (string, error) {
    token := jwt.NewWithClaims(jwt.GetSigningMethod("RS256"), claims)
    return token.SignedString(privateKey)
}

func VerifyJWT(tokenString, publicKey *rsa.PublicKey) (*jwt.Token, error) {
    return jwt.ParseWithClaims(tokenString, &jwt.StandardClaims{}, func(token *jwt.Token) (interface{}, error) {
        return publicKey, nil
    })
}

常见问题解答

  1. 什么是 JWT 签名算法?
    JWT 签名算法决定了用于生成签名的哈希函数,例如 HS256(对称)或 RS256(非对称)。

  2. JWT 验证的目的是什么?
    JWT 验证确保 JWT 未被篡改,是使用正确的密钥创建的,并且尚未过期。

  3. 非对称 JWT 比对称 JWT 更安全吗?
    是的,非对称 JWT 更安全,因为私钥是保密的,即使公钥泄露,也不会影响 JWT 的安全性。

  4. JWT 签名和验证的性能影响是什么?
    对称 JWT 签名和验证比非对称 JWT 签名和验证更快,因为非对称签名需要使用更复杂的数学运算。

  5. JWT 签名和验证在实际应用程序中的常见用法是什么?
    JWT 签名和验证用于 Web API 和移动应用程序中,以保护用户身份信息和防止身份盗用。