为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
白衣染霜花 2021-10-18 11:13:05
我正在 Go 网络服务中试用 JWT(JSON 网络令牌)。这是我到目前为止所做的:package jwtimport(    "fmt"    "net/http"    "github.com/gorilla/mux"    "github.com/dgrijalva/jwt-go"    "io/ioutil")var privateKey []bytevar 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)}现在,如果我的理解是正确的,可以使用公钥解码使用私钥编码的令牌。这就是我在上面的代码中假设的,但是当我运行代码时出现错误:无法处理此令牌:签名无效如果我使用相同的密钥进行编码和解码,则代码有效。我想知道的是,我的理解或代码有什么问题吗?
查看完整描述

3 回答

?
缥缈止盈

TA贡献2041条经验 获得超4个赞

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


查看完整回答
反对 回复 2021-10-18
?
白板的微信

TA贡献1883条经验 获得超3个赞

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


查看完整回答
反对 回复 2021-10-18
  • 3 回答
  • 0 关注
  • 329 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信