我努力在jwcrypto中生成一个JWE,相当于node-jose中使用相同键的JWE。目标是在node-jose中生成一个密钥,并将pubkey导出到jwcrypto以加密有效负载,然后由node-jose消解并解密。
我的测试完全在node-jose中工作正常:
var jose = require("node-jose")
var keyStore = jose.JWK.createKeyStore()
keyStore.generate('EC', 'P-521').then(function (result) {
// Use exported key to encrypt something (so we see the same thing jwcrypto does)
jose.JWK.asKey(result.toJSON()).then(function(result) {
jose.JWE.createEncrypt(result).update('this is a test payload').final().then(function (result) {
jose.JWE.createDecrypt(keyStore).decrypt(result).then(function (result) {
// Result is good
console.log(result)
})
})
})
但是,当我在python中执行相同操作时,node-jose会生成不同的JWE:
key = jwk.JWK(**json.loads(the_exported_key))
# This key looks exactly the same as the exported key in node-jose
print(key.export(private_key=False))
payload = "this is a test payload"
header = {
'alg': 'ECDH-ES',
'enc': 'A128CBC-HS256',
}
my_jwe = jwe.JWE(payload.encode('utf-8'), header)
my_jwe.add_recipient(key)
当node-jose尝试解密my_jwe时,它会失败并显示"错误:找不到密钥"。奇怪(或者不是,这是我第一次使用JWE ......),这两个加密结果是(见下面的例子)。我想我错过了如何获得jwcrypto,比如node-jose,不需要' header'价值观,但是当我提出它时,它会抱怨。
node-jose示例(垃圾数据):
{
ciphertext: "1e7YX6hNDJWJELhHTNXEOg",
iv: "oQZZq2smHX8u8MMwoC6NBA",
protected: "eyJhbGciOi".....(very long string),
tag: "3NfEqx9f2ivL8QodG5Duaw",
}
jwcrypto(垃圾数据):
{
ciphertext: "7ldKnkcsLZUy-SXFRv_HpkWOsb-YUUlNFv-4M5yZhCA",
iv: "1uErMiK_RWcaPXPCPq12Uw",
header: {
alg: "ECDH-ES",
enc: "A128CBC-HS256",
epk: {
crv: "P-521",
kty: "EC",
x: different from the exported key, I assume this is expected 'epk',
y: different from the exported key, I assume this is expected 'epk',
},
kid: "JCU3sWKfirVybFbpy2NPOnq-4-43JiemRZLO5dmPMVo"
},
tag: "51AMFyCJld5uPyMFLLl-sw",
}
答案 0 :(得分:0)
使用jwcrypto或node-jose获得的结果看起来与RFC7516兼容。
唯一的区别是node-jose在protected
成员中设置了标头(完整性受保护的标头),而jwcrypto将其设置在header
成员中(每个收件人不受保护的标头)。
我的理解是node-jose会抛出错误,因为它无法在标头(epk
成员)中找到公钥。它仅检查protected
成员,而不检查其他标题(header
以及unprotected
成员(如果有)),这些标题不符合RFC7516 section 2 paragraph 4.:
让JOSE标头成为JWE受保护标头,JWE共享无保护标头和相应的JWE每接收方无保护标头成员的联合
从我的角度来看,当只为一个收件人创建JWE时,没有理由设置epk
成员(以及alg
和enc
成员)在一个不受保护的标题中。这些未受保护的标头的存在将阻止您使用JWE Compact Serialization。所以应该改变jwcrypto的行为。
我不知道这两个库是如何工作的,但是有两种方法可以解决这个问题: