#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