首页 > 解决方案 > native-crypto 加密抛出 DOMException

问题描述

我正在使用这个native-crypto包,它是一个用于跨平台加密的 API(所以 web 和 node.js)。

let crypto = require("native-crypto");

我已经生成了一个公钥/私钥对...

keyPair = crypto.generate('P-256');

...我正在尝试加密这样的消息:

let message = "Hello, World!";
let encrypted = crypto.rsa.encrypt(keyPair.privateKey, message);

但是,这不起作用,我收到DOMException(在浏览器环境中)没有更多详细信息。

我该如何解决这个问题?

可能的问题:

标签: javascriptnode.jsencryptioncryptography

解决方案


让我们从异常开始......由于某种原因,您没有看到错误消息。

Uncaught (in promise) DOMException: The required JWK member "kty" was missing

异步与同步

第一个错误是因为您尝试同步使用异步API 。

您需要在生成行上添加await关键字:keyPair

keyPair = await crypto.generate('P-256');

如果没有await关键字,则分配一个 PromisekeyPair而不是包含kty.

错误的密钥类型

一旦你解决了这个问题,你会看到另一个错误:

The JWK "kty" member was not "RSA"

这是因为 ECDSA 密钥与 RSA 加密一起使用。

还有一个问题

一旦你修复它,你会看到另一个错误

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

我帮不上这个忙。我怀疑这是native-crypto. 您可能需要在他们的github repo上提交错误报告。这是一个仅使用 Web Crypto API 的大致等效示例。

const crypto = window.crypto.subtle;

async function main() {
  const keyPair = await crypto.generateKey(
    {
      name: "RSA-OAEP",
      modulusLength: 4096,
      publicExponent: new Uint8Array([1, 0, 1]),
      hash: "SHA-256"
    },
    true,
    ["encrypt", "decrypt"]
  );

  let message = "hello";

  message = new TextEncoder().encode(message);
  const encrypted = await crypto.encrypt({ name: "RSA-OAEP" }, keyPair.publicKey, message);

  console.log(encrypted);
}

main()

推荐阅读