0

我有一个关于在 Go 中使用方法 HS256 进行 JWT 签名的问题。我正在使用这个导入“github.com/dgrijalva/jwt-go”

它不需要密钥长度 >= 256 位(32 字节)?

假设我有一个用 Golang 编写的服务器应用程序,它使用 16 位的密钥长度为 JWT 签名。当我尝试使用相同的密钥在客户端应用程序(用 Java 编写)中验证这个 JWT 时,它给了我一个错误:

io.jsonwebtoken.security.WeakKeyException: The specified key byte array is 16 bits which is not secure enough for any JWT HMAC-SHA algorithm.

好吧,这个错误是有道理的,因为密钥长度小于 256 位,但是服务器应用程序如何生成使用大小小于 256 位的密钥签名的 JWT 而不会出错?

这是创建访问令牌的函数:

import(
    "time"

    "github.com/dgrijalva/jwt-go"
)

func CreateToken(userid uint64) (string, error) {
    var err error
    //Creating Access Token
    atClaims := jwt.MapClaims{}
    atClaims["authorized"] = true
    atClaims["user_id"] = userid
    atClaims["exp"] = time.Now().Add(time.Minute * 15).Unix()
    at := jwt.NewWithClaims(jwt.SigningMethodHS256, atClaims)
    token, err := at.SignedString([]byte("NRF"))
    if err != nil {
        return "", err
    }
    return token, nil
}
4

1 回答 1

0

Go 中没有“标准”jwt 库。所以要彻底回答这个问题,我们需要查看服务器代码,或者服务器正在使用哪个库。

crypto/hmaccrypto/hash包没有定义任何情况下要返回的任何错误。因此,正如您所描述的,密钥长度检查应该由调用者完成。所以这不是语言的go问题。这是程序如何编写的问题。

如果您想了解更多信息,可以在https://jwt.io/#libraries-io上浏览不同的实现。(按 Go 手动过滤)。

于 2020-04-25T16:07:47.237 回答