首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Go中Jose加密/解密JWE

用Go中Jose加密/解密JWE
EN

Stack Overflow用户
提问于 2019-12-05 14:54:39
回答 2查看 3.4K关注 0票数 1

我正在尝试创建一个JWE解密函数,但在确定如何使用Go Jose接口时遇到了困难。我已经使用密码分析了加密(对于这个用例,我更喜欢密码):

代码语言:javascript
复制
    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,对它进行编码,压缩它并返回键。然而,现在还不完全清楚如何用密码解密它。

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

所以我考虑到了这一点:

代码语言:javascript
复制
    object, err = jose.ParseEncrypted(Key)
    if err != nil {
        panic(err)
    }
    decrypted, err := object.Decrypt(...)

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-12-05 17:54:19

我好像做错了几件事。首先,rsa.GenerateKey使用随机值。这是完全错误的:-p以下是如何使用令牌将JWT加密为JWE的:

代码语言:javascript
复制
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")
}

你就是这样解密的:

代码语言:javascript
复制
// Decrypt the receive key
jwe, err := jose.ParseEncrypted(jewPlaintextToken)
if err != nil {
    panic("oops")
}
decryptedKey, err := jwe.Decrypt("mypassphrase")
if err != nil {
    panic("oops")
}

如果有人发现此方法存在任何重大问题/安全问题,请提及。

票数 3
EN

Stack Overflow用户

发布于 2019-12-05 15:07:15

在椭圆中的

,我不知道该放什么。我似乎无法根据密码来决定如何传递密钥。

从文档中的JWE示例中,您必须传递私钥。有关解密,请参见下面部分。

https://godoc.org/gopkg.in/square/go-jose.v2#JSONWebEncryption.Decrypt

代码语言:javascript
复制
// 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))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59197770

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档