Node.js 解密golang中的JWE令牌

Node.js 解密golang中的JWE令牌,node.js,go,jwe,jose,node-jose,Node.js,Go,Jwe,Jose,Node Jose,我有这个问题,我在node.js中创建了一个JWE,使用以下方法: const密钥库=[ { kty:‘10月’, 孩子:“QLdRkgyMx_po0fpo5xNOZQB4ITCYAY36M_PA62SBiw”, k:'A-OAikjssQZeLkj8N_2Xb9qPBG6lSq10YeLbiTF-kQuM_QKY08JWFQWSLZN9FMNPKAYM9URG1HBRPOK_fGtQ' } ] const ks=wait jose.JWK.asKeyStore(keystore); const

我有这个问题,我在node.js中创建了一个JWE,使用以下方法:

const密钥库=[
{
kty:‘10月’,
孩子:“QLdRkgyMx_po0fpo5xNOZQB4ITCYAY36M_PA62SBiw”,
k:'A-OAikjssQZeLkj8N_2Xb9qPBG6lSq10YeLbiTF-kQuM_QKY08JWFQWSLZN9FMNPKAYM9URG1HBRPOK_fGtQ'
}
]
const ks=wait jose.JWK.asKeyStore(keystore);
const rawKey=ks.get(密钥库[0].kid)
const key=wait jose.JWK.asKey(rawKey);
const jwe=等待jose.jwe
.createEncrypt({格式:'压缩'},密钥)
.更新(有效载荷)
.final();
根据文档,它是用
“alg”:“PBES2-HS256+A128KW”,“enc”:“A128CBC-HS256”
创建的,如果我在jwt.io中检查它,它就是

然后,我需要在golang解密,所以我喜欢使用:

主程序包
进口(
“fmt”
“gopkg.in/square/go jose.v2”
)
常量jweRaw字符串="2.我的研究成果是一个具体的研究成果,一个具体的研究成果,一个具体的研究成果,一个具体的研究成果,一个关于2个关于在中国的基础上的研究成果,一个BZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZQYC6RQMTTVB7VdMArkqeB483g3-tcoCGWxafOb0VfVQHrPTdjpGMLF-9uIJw9z5.RA0Dn-B_Y3KVxYRVTINFQ“
const kid string=“QLdRkgyMx_po0fPo5XnOzQQB4iTcyay36m_PA62SBiw”
const k string=“A-OAikjssQZeLkj8N_2Xb9qPBG6lSq10YeLbiTF-kQuM_qky08jwfqwslzn9fmnpkaym9urg1lhbrpok_fGtQ”
func main(){
jwe,err1:=jose.ParseEncrypted(jweRaw)
如果err1!=nil{
恐慌(错误1)
}
fmt.Println(“jwe”,jwe)
字节,err2:=jwe.Decrypt(jose.JSONWebKey{算法:“PBES2-HS256+A128KW”,使用:“A128CBC-HS256”,KeyID:kid,Key:k})
如果err2!=nil{
恐慌(err2)
}
fmt.Println(“字节”,字符串(字节))
}
但它会引起恐慌“恐慌:square/go-jose:加密原语中的错误” 您可以在这里查看:

我已经试过了,但它不支持PBES2-HS256+A128KW算法

谢谢

更新:以下是更多信息:

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

const keystore=wait jose.JWK.createKeyStore()
const key=wait a.generate('oct',512)
log(key.toJSON(true))
然后将输出保存在此数组中:

const密钥库=[
{
kty:‘10月’,
孩子:“QLdRkgyMx_po0fpo5xNOZQB4ITCYAY36M_PA62SBiw”,
k:'A-OAikjssQZeLkj8N_2Xb9qPBG6lSq10YeLbiTF-kQuM_QKY08JWFQWSLZN9FMNPKAYM9URG1HBRPOK_fGtQ'
}
]

我一直在尝试在golang中使用相同的JWK创建相同的JWE,我可以在golang中解密,但在node中都无法解密(我遇到了一个“找不到密钥”错误)…所以,交叉解密对我来说不起作用。我做错了什么?

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


另外,作为旁注,
PBES2-HS256+128kw
用于密码,而不是密钥,因为它的计算量很大,我建议使用不同的密钥包装算法(不是基于对称密码短语的算法)。您可以使用非对称加密为收件人进行加密。如果您还想实现邮件的身份验证,请不要使用密钥包装,而是使用来自的直接密钥协议。

k
是八位组密钥的base64url编码表示,除非go接口在
JWK格式(它没有),您需要提供原始密钥。
base64url.decode()
k
以获取原始密钥字节。


另外,作为旁注,
PBES2-HS256+128kw
用于密码,而不是密钥,因为它的计算量很大,我建议使用不同的密钥包装算法(不是基于对称密码短语的算法)。您可以使用非对称加密为收件人进行加密。如果您还想实现邮件的身份验证,请不要使用密钥包装,而是使用来自的直接密钥协议。

尝试相同的错误。这是版本3。如果我在golang中创建JWE,并尝试使用节点jose进行解密,我会得到一个“找不到密钥”“错误尝试同样的错误。这是第三版。如果我在golang中创建JWE,并且我尝试用节点jose解密,我得到一个“找不到密钥”错误和FWIW,
node jose
包做了一些错误,因为我也不能解密JWE,而且你说它不能解密它自己加密的JWE,这很奇怪,因为它使用完全对称的算法。是的,那是。非常感谢你!抱歉,如果说错了,但节点jose可以解密是自己的JWE。只有交叉解密失败。这是我成功的测试:FWIW,
节点jose
包做了一些错误,因为我也不能解密JWE,你还说它不能解密它自己加密的JWE,这很奇怪,因为它使用完全对称的算法。是的,那是。非常感谢你!抱歉,如果说错了,但节点jose可以解密是自己的JWE。只有交叉解密失败。这是我成功的测试: