Ошибка типа параметра алгоритма web crypto importKey

#typescript #webcrypto-api

#typescript #webcrypto-api

Вопрос:

Я реализую примеры для pbkdf2, показанные в mdn. Мой тестовый код

 let enc = new TextEncoder();
let password = enc.encode("password");
window.crypto.subtle.importKey(
                "raw",
                password,
                {"name": "PBKDF2"},
                false,
                ["deriveBits", "deriveKey"]
                )
  

Это приводит к следующей ошибке (typescript 3.3.4000):

 credential.service.ts:6:3 - error TS2345: Argument of type '{ "name": string; }' is not assignable to parameter of type 'string | AesKeyAlgorithm | EcKeyImportParams | HmacImportParams | RsaHashedImportParams | DhImportKeyParams'.
  Type '{ "name": string; }' is missing the following properties from type 'DhImportKeyParams': generator, prime

{"name": "PBKDF2"},
  

Код отлично работает в Chrome.

Комментарии:

1. Попробуйте удалить " из "name"

2. это приводит к точно такой же ошибке

3. Вы запускаете webcrypto на Edge? Похоже, PBKDF2 не поддерживается. Смотрите developer.microsoft.com/en-us/microsoft-edge/platform/issues /…

4. Я не пробовал edge — chrome работает. Проблема заключается в компиляторе typescript.

Ответ №1:

Следующий (уродливый) обходной путь делает свое дело:

 window.crypto.subtle.importKey(
                "raw",
                password,
                {
                    "name": "PBKDF2",
                    // the next two lines are just to trick typescript
                    "generator": new Uint8Array(12),
                    "prime": new Uint8Array(12)
                },
                false,
                ["deriveBits", "deriveKey"]
                )
  

Это некрасиво, поскольку заставляет typescript думать, что PBKDF2 объект является чем-то иным, чем он есть на самом деле.

Ответ №2:

Я думаю, что пример неверен в этой строке. Когда вы посмотрите выше на Parameters section / algorithm , вы увидите, что:

Для PBKDF2 : передайте строку PBKDF2.

Поэтому вместо {name: 'PBKDF2'} использования just 'PBKDF2' .

MDN: SubtleCrypto.importKey()
https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/importKey#Parameters