Метод crypto.subtle.importKey() используется для
преобразования внешнего представления ключа (сырого массива байтов,
JWK-объекта, ключа в формате PKCS#8 или SPKI) в объект
CryptoKey, с которым работает Web Crypto API.
Этот этап является обязательным, когда ключ:
После импорта ключ становится доступным для операций шифрования, подписи, проверки подписи, обмена ключами или вывода производных ключей.
crypto.subtle.importKey(
format,
keyData,
algorithm,
extractable,
keyUsages
)
Определяет формат входного ключа. Поддерживаются четыре основных варианта:
Сырые байты ключа.
Используется для:
new Uint8Array([1, 2, 3, 4])
JSON Web Key — объект в формате JSON.
Пример:
{
"kty": "oct",
"k": "base64url-encoded-key",
"alg": "A256GCM",
"ext": true
}
Используется для приватных ключей асимметричной криптографии.
Формат:
Используется для публичных ключей.
Формат:
Входные данные ключа. Тип зависит от format:
| format | keyData |
|---|---|
| raw | ArrayBuffer / TypedArray |
| jwk | Object |
| pkcs8 | ArrayBuffer |
| spki | ArrayBuffer |
Описывает криптографический алгоритм, для которого импортируется ключ.
Объект всегда содержит поле name, остальные зависят от
алгоритма.
{ name: "AES-GCM" }
{ name: "AES-CBC" }
{ name: "AES-KW" }
{
name: "HMAC",
hash: "SHA-256"
}
{
name: "RSA-OAEP",
hash: "SHA-256"
}
{
name: "RSASSA-PKCS1-v1_5",
hash: "SHA-512"
}
{
name: "ECDSA",
namedCurve: "P-256"
}
{
name: "ECDH",
namedCurve: "P-384"
}
{
name: "PBKDF2"
}
Булево значение:
true — ключ можно экспортировать обратно через
exportKeyfalse — ключ становится неизвлекаемымКлючевая характеристика безопасности:
Массив строк, определяющих допустимые операции с ключом.
Возможные значения:
"encrypt""decrypt""sign""verify""deriveKey""deriveBits""wrapKey""unwrapKey""encrypt""decrypt""sign""verify""deriveKey""deriveBits"Метод возвращает Promise<CryptoKey>.
const key = await crypto.subtle.importKey(...)
const rawKey = new Uint8Array([
21, 31, 42, 55, 66, 77, 88, 99,
10, 20, 30, 40, 50, 60, 70, 80
]);
const cryptoKey = await crypto.subtle.importKey(
"raw",
rawKey,
{ name: "AES-GCM" },
false,
["encrypt", "decrypt"]
);
const secret = new TextEncoder().encode("super-secret");
const key = await crypto.subtle.importKey(
"raw",
secret,
{
name: "HMAC",
hash: "SHA-256"
},
true,
["sign", "verify"]
);
const spki = new Uint8Array([...]); // DER data
const publicKey = await crypto.subtle.importKey(
"spki",
spki.buffer,
{
name: "RSA-OAEP",
hash: "SHA-256"
},
true,
["encrypt"]
);
const pkcs8 = new Uint8Array([...]);
const privateKey = await crypto.subtle.importKey(
"pkcs8",
pkcs8.buffer,
{
name: "RSA-OAEP",
hash: "SHA-256"
},
false,
["decrypt"]
);
const jwk = {
kty: "oct",
k: "mX4f3s9kq0xYv2zA1bC9dQ",
alg: "A256GCM",
ext: true
};
const key = await crypto.subtle.importKey(
"jwk",
jwk,
{ name: "AES-GCM" },
true,
["encrypt", "decrypt"]
);
const jwk = {
kty: "RSA",
n: "...modulus...",
e: "AQAB",
d: "...privateExponent...",
alg: "RSA-OAEP-256",
ext: true
};
const privateKey = await crypto.subtle.importKey(
"jwk",
jwk,
{
name: "RSA-OAEP",
hash: "SHA-256"
},
true,
["decrypt"]
);
PBKDF2 не импортирует готовый криптографический ключ, а создаёт исходный материал для деривации.
const password = new TextEncoder().encode("password123");
const baseKey = await crypto.subtle.importKey(
"raw",
password,
"PBKDF2",
false,
["deriveKey"]
);
Далее используется deriveKey:
const derivedKey = await crypto.subtle.deriveKey(
{
name: "PBKDF2",
salt: new TextEncoder().encode("salt"),
iterations: 100000,
hash: "SHA-256"
},
baseKey,
{ name: "AES-GCM", length: 256 },
false,
["encrypt", "decrypt"]
);
Возникает при:
Возникает при:
Возникает при:
| Алгоритм | Поддерживаемые форматы |
|---|---|
| AES | raw, jwk |
| HMAC | raw, jwk |
| RSA | spki, pkcs8, jwk |
| ECDSA | spki, pkcs8, jwk |
| ECDH | spki, pkcs8, jwk |
| PBKDF2 | raw |
extractable: false нельзя обойти после импортаextractable: truekeyUsages строго необходимыми
операциями