首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用golang解密JWE令牌

用golang解密JWE令牌
EN

Stack Overflow用户
提问于 2020-06-03 13:05:37
回答 1查看 1.5K关注 0票数 1

我遇到了这个问题,我用这种方式在node.js中使用节点-何塞创建了一个JWE:

代码语言:javascript
复制
const keystore = [
  {
    kty: 'oct',
    kid: 'QLdRkgyMx_po0fPo5XnOzQQB4iTcyay36m_PA62SBiw',
    k: 'A-OAikjssQZeLkj8N_2Xb9qPBG6lSq10YeLbiTF-kQuM_qKy08jwFqQwsLzn9fmNPkayM9uRg1lHBrPoK_fGtQ'
  }
]

const ks = await jose.JWK.asKeyStore(keystore);
const rawKey = ks.get(keystore[0].kid)
const key = await jose.JWK.asKey(rawKey);
const jwe = await jose.JWE
      .createEncrypt({format: 'compact'}, key)
      .update(payload)
      .final();

根据文档,它是用"alg": "PBES2-HS256+A128KW", "enc": "A128CBC-HS256",创建的,如果我在jwt.io中检查它,它就是。

然后,我需要在金刚解密,所以我喜欢使用go-jose.v2

代码语言:javascript
复制
package main

import (
    "fmt"
    "gopkg.in/square/go-jose.v2"
)

const jweRaw string = "eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJlbmMiOiJBMTI4Q0JDLUhTMjU2Iiwia2lkIjoiUUxkUmtneU14X3BvMGZQbzVYbk96UVFCNGlUY3lheTM2bV9QQTYyU0JpdyIsInAyYyI6ODE5MiwicDJzIjoiaVktZEdKaWtYbUZCdXMwRFp5eHdIQSJ9.QkuIGmPojLDX-wpTVTjZRnA093fJRVM6OHkpmoQeyLubahOABg62WQ.z6dm86nWHcWgzmPXiuk0kg.7mOgYF6d9hgfXtTj9RUv7BNuYH-jBAs8px0boOFj1mke_JPetIT44yY7ceffFRfS2QYc6RQMtTvb7vdMArkqeB483g3-tcoCGWxafOb0VfVQHrPTdjpGMLF-9uIJw9z5.RA0Dn-B_Y3kvXYRvVTiNFQ"
const kid string = "QLdRkgyMx_po0fPo5XnOzQQB4iTcyay36m_PA62SBiw"
const k string = "A-OAikjssQZeLkj8N_2Xb9qPBG6lSq10YeLbiTF-kQuM_qKy08jwFqQwsLzn9fmNPkayM9uRg1lHBrPoK_fGtQ"

func main() {
    jwe, err1 := jose.ParseEncrypted(jweRaw)
    if err1 != nil {
        panic(err1)
    }
    fmt.Println("jwe", jwe)
    bytes, err2 := jwe.Decrypt(jose.JSONWebKey{Algorithm: "PBES2-HS256+A128KW", Use: "A128CBC-HS256", KeyID: kid, Key: k})
    if err2 != nil {
        panic(err2)
    }
    fmt.Println("bytes", string(bytes))
}

但是它惊慌失措地“恐慌:正方形/方格-何塞:密码原语中的错误”,你可以在这里检查它:https://play.golang.org/p/qB3QNtGwBsK

我已经尝试过用https://github.com/lestrrat-go/jwx,但是它不支持PBES-HS256+A128KW算法

谢谢。

更新:以下是更多信息:

它们在节点中的密钥是使用以下内容创建的:

代码语言:javascript
复制
const keystore = await jose.JWK.createKeyStore()
const key = await a.generate('oct', 512)
console.log(key.toJSON(true))

然后将输出保存在以下数组中:

代码语言:javascript
复制
const keystore = [
  {
    kty: 'oct',
    kid: 'QLdRkgyMx_po0fPo5XnOzQQB4iTcyay36m_PA62SBiw',
    k: 'A-OAikjssQZeLkj8N_2Xb9qPBG6lSq10YeLbiTF-kQuM_qKy08jwFqQwsLzn9fmNPkayM9uRg1lHBrPoK_fGtQ'
  }
]

我一直在尝试用相同的JWK在golang创建相同的JWE,我可以在golang中解密,但是在节点中都不能解密(我得到了一个“没有找到密钥”错误).所以交叉解密对我不起作用。我做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-04 11:24:48

k是八位键的base64url编码表示,除非go接口特别提到以JWK格式传递密钥,否则需要提供原始密钥。base64url.decode() k 以获取原始密钥字节.

另外,作为一个侧字符,PBES2-HS256+A128KW用于密码,而不是密钥,考虑到它的计算量很大,我建议使用不同的密钥包装算法(而不是基于对称密码的算法)。您可以使用非对称密码为收件人加密。如果您还想实现消息的身份验证,则完全不要使用密钥包装,而是使用来自JWE的直接密钥协议。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62173564

复制
相关文章

相似问题

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