нативное криптографическое шифрование DOMException - PullRequest
1 голос
/ 20 марта 2020

Я использую пакет native-crypto, который представляет собой API для кроссплатформенной криптографии (таким образом, веб и 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 (в среда браузера) без дополнительных подробностей.

Как мне решить эту проблему?

Возможные проблемы:

  • Возможно, я использую неправильную комбинацию функций
  • Это может быть связано с тем, что key_ops моего сгенерированного ключа содержит только ["sign"], но ничего для шифрования.

1 Ответ

1 голос
/ 24 марта 2020

Давайте начнем с исключения ... по какой-то причине вы не видите сообщение об ошибке.

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

Асинхронный или синхронный

Эта первая ошибка, потому что вы пытаетесь использовать асинхронный API синхронно .

Вам необходимо добавить ключевое слово await в строку генерации keyPair:

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

Без ключевого слова await Обещание присваивается keyPair вместо Объект, содержащий 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...