Метод crypto.subtle.wrapKey используется для
«обёртывания» (wrapping) криптографического ключа с помощью другого
ключа. В результате исходный ключ преобразуется в зашифрованный формат,
пригодный для безопасного хранения или передачи. Операция выполняется в
рамках Web Crypto API и относится к низкоуровневым криптографическим
примитивам, предоставляемым браузером.
Ключевая особенность механизма заключается в том, что сам ключ не
экспортируется в открытом виде, а преобразуется в защищённый бинарный
контейнер. Для обратной операции применяется
crypto.subtle.unwrapKey.
crypto.subtle.wrapKey(
format,
key,
wrappingKey,
wrapAlgo
)
Метод возвращает Promise, который резолвится в
ArrayBuffer, содержащий зашифрованное представление
ключа.
format Строка, определяющая формат экспорта ключа перед его шифрованием. Возможные значения:
"raw" — сырое представление ключа"pkcs8" — приватный ключ в формате PKCS#8"spki" — публичный ключ в формате
SubjectPublicKeyInfo"jwk" — JSON Web KeyВыбор формата зависит от типа ключа и последующего использования.
key Экспортируемый ключ (CryptoKey),
который требуется обернуть. Важные условия:
extractable должен быть установлен в
truewrappingKey Криптографический ключ
(CryptoKey), используемый для шифрования исходного ключа.
Этот ключ должен:
wrapKeycrypto.subtle.generateKeywrapAlgo Объект, определяющий алгоритм обёртывания ключа. Например:
{"name": "AES-KW"} — AES Key Wrap (RFC 3394){"name": "RSA-OAEP"} — RSA с оптимальным асимметричным
шифрованиемhash для
RSA-OAEPАлгоритм AES Key Wrap предназначен специально для защиты ключей. Он обеспечивает высокую производительность и криптографическую надёжность при симметричном подходе.
Особенности:
Асимметричный механизм обёртывания, использующий пару ключей.
Особенности:
Используется для симметричных ключей, например AES. Представляет собой бинарный массив.
Применяется для приватных ключей. Часто используется при работе с RSA или ECDSA.
Используется для публичных ключей. Подходит для передачи открытых ключей между системами.
JSON-формат, удобный для веб-приложений и REST API.
const wrappingKey = await crypto.subtle.generateKey(
{
name: "AES-KW",
length: 256
},
true,
["wrapKey", "unwrapKey"]
);
const keyToWrap = await crypto.subtle.generateKey(
{
name: "AES-GCM",
length: 256
},
true,
["encrypt", "decrypt"]
);
const wrappedKey = await crypto.subtle.wrapKey(
"raw",
keyToWrap,
wrappingKey,
"AES-KW"
);
const rsaKeys = await crypto.subtle.generateKey(
{
name: "RSA-OAEP",
modulusLength: 2048,
publicExponent: new Uint8Array([1, 0, 1]),
hash: "SHA-256"
},
true,
["encrypt", "decrypt", "wrapKey", "unwrapKey"]
);
const wrappedPrivateKey = await crypto.subtle.wrapKey(
"pkcs8",
rsaKeys.privateKey,
rsaKeys.publicKey,
{
name: "RSA-OAEP",
hash: "SHA-256"
}
);
Ключ, который передаётся в wrapKey, должен
соответствовать нескольким условиям:
extractable: true, иначе операция завершится
ошибкойwrapKeyНарушение любого из условий приводит к
InvalidAccessError.
Операция обёртывания всегда предполагает обратимость:
wrapKey — преобразует ключ в зашифрованный форматunwrapKey — восстанавливает исходный
CryptoKeyПри восстановлении требуется указать:
keyUsages)Обёртывание ключей применяется в следующих случаях:
Распространённые причины ошибок:
wrapKey в keyUsagespkcs8 для симметричного
ключа)При возникновении ошибки Promise отклоняется с соответствующим DOMException.
Операция wrapKey является частью модели «key
encapsulation»:
Такая модель минимизирует риск утечки ключевого материала при хранении и передаче.