Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 与公钥、私钥和JWT有关的混淆_Go_Google App Engine_Jwt_Jwt Go - Fatal编程技术网

Go 与公钥、私钥和JWT有关的混淆

Go 与公钥、私钥和JWT有关的混淆,go,google-app-engine,jwt,jwt-go,Go,Google App Engine,Jwt,Jwt Go,我正在Go Web服务中试用JWT JSON Web令牌。以下是我迄今为止所做的工作: 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.

我正在Go Web服务中试用JWT JSON Web令牌。以下是我迄今为止所做的工作:

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)

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

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

如果我使用相同的密钥进行编码和解码,那么代码就可以工作


我想知道的是,我的理解或代码是否有问题

JWT不是使用像RSA这样的非对称密码签名的。它使用一个密钥,它使用一个单独的密钥。事实上,这里的重点不是向其他人证明你签署了代币。这是为了向自己证明您已经签署了该令牌,因此禁止任何没有您的密钥的人修改该令牌。

JWT不是使用像RSA这样的非对称密码签署的。它使用一个密钥,它使用一个单独的密钥。事实上,这里的重点不是向其他人证明你签署了代币。这是为了向自己证明您已经签署了该令牌,因此禁止任何没有您的密钥的人修改该令牌。

您正在使用jwt.SigningMethodHMAC。因此,您使用HMAC进行签名,签名是由对称密钥密钥加密的令牌

您应使用:jwt.Newjwt.SigningMethodRS256使用非对称密钥对进行签名。

您使用的是jwt.SigningMethodHMAC。因此,您使用HMAC进行签名,签名是由对称密钥密钥加密的令牌


您应该使用:jwt.Newjwt.SigningMethods256使用非对称密钥对进行签名。

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

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

正确,尽管RSA算法是JWT“标准”的一部分,并包含在JWT go包中。但是,我强烈建议不要这样做:从实现的角度来看,HMAC构造更容易“正确”,并且仍然提供所需的功能:防止第三方修改令牌。@elithrar谢谢。我把答案编辑成JWT而不是JWT。发布的代码使用了HMAC.Correct,尽管RSA算法是JWT“标准”的一部分,并且包含在JWT go包中。但是,我强烈建议不要这样做:从实现的角度来看,HMAC构造更容易“正确”,并且仍然提供所需的功能:防止第三方修改令牌。@elithrar谢谢。我把答案编辑成JWT而不是JWT。发布的代码使用HMAC。