在 Go 中使用 Jose 加密/解密 JWE

我正在尝试创建 JWE 解密函数,但无法确定如何使用 Go Jose 接口来执行此操作。我已经使用密码短语加密(我更喜欢这个用例的密码短语):


    token := jwt.NewWithClaims(

        jwt.SigningMethodHS256,

        claims,

    )

    ss, err := token.SignedString("thisisatestpassphraserighthere")

    if err != nil {

        panic("COULD_NOT_GENERATE")

        return

    }

    privateKey, err := rsa.GenerateKey(rand.Reader, 2048)

    if err != nil {

        panic(err)

    }

    publicKey := &privateKey.PublicKey

    encrypter, err := jose.NewEncrypter(

        jose.A128CBC_HS256,

        jose.Recipient{Algorithm: jose.RSA_OAEP, Key: publicKey},

        nil,

    )

    if err != nil {

        return

    }

    object, err := encrypter.Encrypt([]byte(ss))

    if err != nil {

        errRes = s.Error(codes.Internal, err, nil)

        return

    }

    key, err := object.CompactSerialize()

    if err != nil {

        errRes = s.Error(codes.Internal, err, nil)

        return

    }

    fmt.Println(key)

上面的代码创建了一个 JWT,对其进行编码、压缩并返回密钥。然而,现在如何用密码解密它并不完全清楚。


Jose 文档中有一个 JWE 示例:https ://godoc.org/gopkg.in/square/go-jose.v2#example-Encrypter--Encrypt


所以我考虑到了这一点:


    object, err = jose.ParseEncrypted(Key)

    if err != nil {

        panic(err)

    }

    decrypted, err := object.Decrypt(...)

在椭圆内,我不知道该放什么。我似乎无法确定如何根据密码传递密钥。


梵蒂冈之花
浏览 394回答 2
2回答

慕村9548890

我似乎做错了一些事情。首先 rsa.GenerateKey 使用随机值。这是完全错误的:-p 以下是如何使用令牌将 JWT 加密为 JWE:rcpt := jose.Recipient{    Algorithm:  jose.PBES2_HS256_A128KW,    Key:        "mypassphrase",    PBES2Count: 4096,    PBES2Salt: []byte{ your salt... },}enc, err := jose.NewEncrypter(jose.A128CBC_HS256, rcpt, nil)if err != nil {   panic("oops")}jewPlaintextToken, err := enc.Encrypt(jwtToken)if err != nil {    panic("oops")}key, err := object.CompactSerialize()if err != nil {    panic("oops")}这是您解密的方式:// Decrypt the receive keyjwe, err := jose.ParseEncrypted(jewPlaintextToken)if err != nil {    panic("oops")}decryptedKey, err := jwe.Decrypt("mypassphrase")if err != nil {    panic("oops")}如果有人发现此方法有任何重大问题/安全问题,请提及。

侃侃无极

在椭圆内,我不知道该放什么。我似乎无法确定如何根据密码传递密钥。从JWE文档中的示例中,您必须传递私钥。解密见下文https://godoc.org/gopkg.in/square/go-jose.v2#JSONWebEncryption.Decrypt// Generate a public/private key pair to use for this example.privateKey, err := rsa.GenerateKey(rand.Reader, 2048)if err != nil {    panic(err)}// Parse the serialized, encrypted JWE object. An error would indicate that// the given input did not represent a valid message.object, err = ParseEncrypted(serialized)if err != nil {    panic(err)}// Now we can decrypt and get back our original plaintext. An error here// would indicate the the message failed to decrypt, e.g. because the auth// tag was broken or the message was tampered with.decrypted, err := object.Decrypt(privateKey)if err != nil {    panic(err)}fmt.Printf(string(decrypted))
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go