javascript - JWK“key_ops”成员与 Web Crypto 调用指定的成员不一致
问题描述
在 NodeJS 上,我生成密钥并将其导出如下,
const { Crypto } = require("@peculiar/webcrypto");
const crypto = new Crypto();
....
....
....
let KeyPair = await crypto.subtle.generateKey(
{
name: "ECDH",
namedCurve: "P-384"
},
false,
["deriveKey"]
);
let exportPubKey = await crypto.subtle.exportKey(
"jwk",
KeyPair.publicKey
)
现在,当我尝试在使用 Chrome 浏览器的客户端上导入导出的密钥时,它会引发 DOM 异常,我像这样导入它,
window.crypto.subtle.importKey("jwk", {"kty":"EC","crv":"P-384","key_ops":[],"ext":true,"x":"mbLH4QWKwgYu3cwaUsk59M9awwhJydGdJOH0z8WapKuW6DAlnI8bcUg7kOl9ZCdb","y":"-PQ_HUtA45oC8YL3Zk2dExIWxykhimjfqFAc2pQrPTmrDKa-5AVn4Noz3PitZw2W"}, {"name": "ECDH", "namedCurve": "P-384"}, false, ["deriveKey"])
错误是,
DOMException: The JWK "key_ops" member was inconsistent with that specified by the Web Crypto call. The JWK usage must be a superset of those requested
令我惊讶的是,我可以在 Node 上导入相同的东西而不会出现任何错误。我的意思是客户端以几乎相同的格式生成 JWK。
解决方案
经过一番模糊测试,我发现你必须传递一个空数组来克服错误。
window.crypto.subtle.importKey("jwk", {"kty":"EC","crv":"P-384","key_ops":[],"ext":true,"x":"mbLH4QWKwgYu3cwaUsk59M9awwhJydGdJOH0z8WapKuW6DAlnI8bcUg7kOl9ZCdb","y":"-PQ_HUtA45oC8YL3Zk2dExIWxykhimjfqFAc2pQrPTmrDKa-5AVn4Noz3PitZw2W"}, {"name": "ECDH", "namedCurve": "P-384"}, false, ["deriveKey"])
变成,
window.crypto.subtle.importKey("jwk", {"kty":"EC","crv":"P-384","key_ops":[],"ext":true,"x":"mbLH4QWKwgYu3cwaUsk59M9awwhJydGdJOH0z8WapKuW6DAlnI8bcUg7kOl9ZCdb","y":"-PQ_HUtA45oC8YL3Zk2dExIWxykhimjfqFAc2pQrPTmrDKa-5AVn4Noz3PitZw2W"}, {"name": "ECDH", "namedCurve": "P-384"}, false, [])
推荐阅读
- c++ - 使用 [] 访问字符串元素会打印随机结果
- r - 计算 r 中每个患者的持续时间
- javascript - 如何使用来自 Ajax JQuery 的响应更新 html 元素
- python - 使用pandas DataFrame 比较两个file_csv 找出差异并将F2 加入F1
- php - 函数内array_push(mainArr,subAssociativeArr)的PHP问题
- powerbi - 计算累计总计时如何提取月份
- python - 如何从 django 中的预先编写的视图中删除 put
- format - 首次使用时,MIFARE Ultralight 上的 OTP 页面是否应该为空?
- html - 如何删除活动li选项卡上的边框
- laravel-5 - Laravel 航海者与 phpunit