与公钥和私钥以及 JWT 有关的混淆

我正在 Go 网络服务中试用 JWT(JSON 网络令牌)。这是我到目前为止所做的:


package jwt


import(

    "fmt"

    "net/http"

    "github.com/gorilla/mux"

    "github.com/dgrijalva/jwt-go"

    "io/ioutil"

)


var privateKey []byte

var publicKey []byte 


func JSONWebTokensHandler(w http.ResponseWriter, r * http.Request){


    // Create the token

    encodeToken := jwt.New(jwt.SigningMethodHS256)

    // Set some claims

    encodeToken.Claims["Latitude"] = "25.000"

    encodeToken.Claims["Longitude"] = "27.000"

    // Sign and get the complete encoded token as a string

    tokenString, err := encodeToken.SignedString(privateKey)


    decodeToken, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {


        if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {

            return nil, fmt.Errorf("Unexpected signing method: %v", token.Header["alg"])

        }


        return publicKey,nil

    })


    if decodeToken.Valid {


        fmt.Fprintf(w,"Lat:  %s, Lng: %s",decodeToken.Claims["Latitude"],decodeToken.Claims["Longitude"])


    }  else {


        fmt.Fprintf(w,"Couldn't handle this token: %s", err)


    }


}


func init(){


    privateKey,_ = ioutil.ReadFile("demo.rsa")

    publicKey,_ = ioutil.ReadFile("demo.rsa.pub")


    r := mux.NewRouter()

    r.HandleFunc("/jwt",JSONWebTokensHandler).Methods("GET")

    http.Handle("/", r)


}

现在,如果我的理解是正确的,可以使用公钥解码使用私钥编码的令牌。这就是我在上面的代码中假设的,但是当我运行代码时出现错误:


无法处理此令牌:签名无效


如果我使用相同的密钥进行编码和解码,则代码有效。


我想知道的是,我的理解或代码有什么问题吗?


白衣染霜花
浏览 330回答 3
3回答

缥缈止盈

JWT 没有使用像 RSA 这样的非对称密码进行签名。它使用HMAC,它使用单个秘密密钥。事实上,这里的重点不是向其他人证明您签署了令牌。这是为了向自己证明你签署了它,从而禁止任何没有你的密钥的人修改令牌。

白板的微信

非常有趣,因为我有类似的问题,当我有微服务和客户端应用程序需要验证来自另一个内部服务器的令牌时,所以如果您建议使用 HMAC 而不是 RSA 它们意味着我需要将私有微服务和客户端应用程序中的关键?那不会是一个严重的安全漏洞吗?
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go