为了账号安全,请及时绑定邮箱和手机立即绑定

在 golang 中解密 JWE 令牌

在 golang 中解密 JWE 令牌

Go
哔哔one 2022-06-06 17:46:44
我有这个问题,我通过这种方式使用node-jose在 node.js 中创建了一个 JWE: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 中检查它,它就是。然后,我需要在 golang 中解密,所以我喜欢使用go-jose.v2:package mainimport (    "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))}但它会恐慌“恐慌:square/go-jose:密码原语中的错误”您可以在此处查看:https: //play.golang.org/p/qB3QNtGwBsK我已经尝试过https://github.com/lestrrat-go/jwx但是它不支持 PBES2-HS256+A128KW 算法谢谢。
查看完整描述

1 回答

?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

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

此外,作为旁注,PBES2-HS256+A128KW旨在与密码一起使用,而不是密钥,因为它的计算量很大,我建议使用不同的密钥包装算法(不是基于对称密码的算法)。您可以使用非对称加密为收件人加密。如果您还想实现消息的身份验证,则根本不要使用密钥包装,而是使用JWE的直接密钥协议。


查看完整回答
反对 回复 2022-06-06
  • 1 回答
  • 0 关注
  • 381 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号