首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用EC密钥在node-jose (js)和jwcrypto (python)之间进行互操作?

使用EC密钥在node-jose (js)和jwcrypto (python)之间进行互操作?
EN

Stack Overflow用户
提问于 2017-10-19 00:02:21
回答 1查看 513关注 0票数 1

我正在努力用相同的密钥在jwcrypto中生成一个与node-jose中的JWE等同的JWE。目标是在node-jose中生成密钥,并将pubkey导出到jwcrypto以加密有效负载,然后该负载将由node-jose使用并解密。

我的测试完全在node-jose中运行良好:

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

代码语言:javascript
复制
    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时,它会失败,并显示"Error: no key found“。奇怪的是(或者不是,这是我第一次使用JWE...),两个加密结果是(参见下面的示例)。我想我错过了如何获取jwcrypto,像node-jose,不需要'header‘值,但当我拉出那些值时,它会抱怨。

node-jose示例(垃圾数据):

代码语言:javascript
复制
{
    ciphertext: "1e7YX6hNDJWJELhHTNXEOg",
    iv: "oQZZq2smHX8u8MMwoC6NBA",
    protected: "eyJhbGciOi".....(very long string),
    tag: "3NfEqx9f2ivL8QodG5Duaw",
}

jwcrypto (垃圾数据):

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

回答 1

Stack Overflow用户

发布于 2017-10-19 14:21:02

唯一的区别是node-jose在protected成员(完整性保护的报头)中设置您的报头,而jwcrypto在header成员(每个接收者不受保护的报头)中设置它。

我的理解是,node-jose抛出一个错误,因为它在头部(epk成员)中找不到公钥。它只检查protected成员,而不检查与RFC7516 section 2 paragraph 4.不兼容的其他标头(header以及unprotected成员

让JOSE标头成为JWE Protected标头、JWE共享未保护标头和对应的JWE每收件人未保护标头的成员的并集

从我的角度来看,当只为一个收件人创建JWE时,没有理由在不受保护的头部中设置epk成员(以及algenc成员)。这些不受保护的头的存在将阻止您使用JWE压缩序列化。因此,jwcrypto的行为应该改变。

我不知道这两个库是如何工作的,但是有两种方法可以解决这个问题:

  • 强制jwcrypto使用完整性保护的报头,而不是不受保护的报头(best).
  • Ask node.jose考虑其他报头(good,但可能需要一些时间)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46814499

复制
相关文章

相似问题

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