当前位置: 首页 > 面试题库 >

如何始终通过无效的密钥类型错误生成JWT令牌

张宣
2023-03-14
问题内容

我遇到了这个问题,真的不知道如何解决,有人可以帮助您提供有效的解决方案吗?

func GenerateJWT(name, role string) (string, error)  {
    //create a singner for rsa 256
    claims := &jwt.StandardClaims{
        ExpiresAt: 15000,
        Issuer:    "test",
    }

    token :=jwt.NewWithClaims(jwt.SigningMethodES256, claims)
    log.Println("generated toke is ")
    log.Println(token)
    tokenString, err := token.SignedString([]byte("secret"))
....
}

现在我总是有:

密钥类型无效

错误。我在Google上搜索了很多东西,甚至对于jwt-go图书馆本身,他们也提供了完全相同的解决方案,但是为什么我一直拥有

密钥类型无效

错误?

谁能提供有关如何生成jwt令牌的有效示例go


问题答案:

从自述文件

ECDSA签名方法(ES256,ES384,ES512)期望 ecdsa.PrivateKey进行签名,而 ecdsa.PublicKey进行验证

因此,使用椭圆曲线键:

package main

import (
        "crypto/ecdsa"
        "crypto/elliptic"
        "crypto/rand"
        "log"

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

func main() {
        key, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
        if err != nil {
                log.Fatal(err)
        }

        claims := &jwt.StandardClaims{
                ExpiresAt: 15000,
                Issuer:    "test",
        }

        token := jwt.NewWithClaims(jwt.SigningMethodES256, claims)

        tokenString, err := token.SignedString(key)
        if err != nil {
                log.Fatal(err)
        }

        log.Println(tokenString)
}

要存储生成的密钥以供以后与jwt.ParseECPrivateKeyFromPEM和jwt.ParseECPublicKeyFromPEM一起使用:

import (
        "crypto/ecdsa"
        "crypto/x509"
        "encoding/pem"
)

func pemKeyPair(key *ecdsa.PrivateKey) (privKeyPEM []byte, pubKeyPEM []byte, err error) {
        der, err := x509.MarshalECPrivateKey(key)
        if err != nil {
                return nil, nil, err
        }

        privKeyPEM = pem.EncodeToMemory(&pem.Block{
                Type:  "EC PRIVATE KEY",
                Bytes: der,
        })

        der, err = x509.MarshalPKIXPublicKey(key.Public())
        if err != nil {
                return nil, nil, err
        }

        pubKeyPEM = pem.EncodeToMemory(&pem.Block{
                Type:  "EC PUBLIC KEY",
                Bytes: der,
        })

        return
}


 类似资料:
  • 我试图为某些设备生成密钥时出错。我能够在运行4.4.2的三星Galaxy Note上重现错误。 我创建了一个小应用程序,只能通过从Android开发者页面“生成新私钥”下的https://developer.android.com/training/articles/keystore.html逐行复制代码来生成密钥 错误似乎发生在kpg.generateKeyPair(),在Android Key

  • 我试图测试我正在构建的一个关于JWT的软件的功能,以了解它,它使用Firebase JWT PHP包 我正在尝试创建一个使用密钥对作为编码/解码的测试用例,但无法获得http://jwt.io页面以使用我的密钥创建令牌。 这些是我使用命令创建的密钥,没有任何修改。 我转到页面,选择HS256/384/512并删除页面默认设置的键。然后我粘贴我的私钥以便对我的数据进行签名。但是,该页面不会生成任何J

  • 我知道RSA密钥可以使用不同的算法生成。使用,我似乎无法指定密钥生成器应该使用什么算法。我怀疑它使用的是。 如何在bashshell或Ruby中使用不同的算法(例如)生成RSA密钥?库是否支持使用不同的算法生成RSA密钥?如果没有,有人知道我可以使用另一个图书馆吗?(在ruby中,似乎不允许选择算法,但文档对我来说很难遵循soo…?) 很抱歉,如果这个问题已经得到了回答,但我还没有找到答案。 也许

  • 问题内容: 此代码给出了无效的AES密钥长度错误。我该如何纠正?(我想要128位密钥AES加密) 任何帮助表示赞赏 问题答案: 使用a 从密码派生密钥字节。您可以在此处查看详细示例。请注意,您需要指定128位密钥的密钥长度,而不是该示例中所示的256位。 您将遇到的下一个问题是您没有指定填充方案。除非您的消息是16字节(AES块大小)的倍数,否则将引发错误。如示例所示,使用PKCS5Padding

  • 鉴于: 由RSACryptoServiceProvider生成的签名密钥。 创建带有孩子的签名jwt的需求。 如果签名密钥来自x509证书,那么我会将kid设置为x5t。在这种情况下,情况并非如此。我可以为孩子编造一些武断的东西,但是如果碰撞不太可能发生,并且孩子和证书之间存在有意义的联系,那就最好了。 我的意图是:- 创建一个字节数组,通过将模字节附加到指数字节来创建。 SHA256编码数组。

  • 我试图对他们的新v2 api进行基本的身份验证api调用,并返回一个无效的api密钥错误。 我重新发布api密钥只是为了验证,同样的错误。 如何对bitfinex的新v2 api进行身份验证api调用?