Метод SubtleCrypto.unwrapKey используется для преобразования зашифрованного ключевого материала обратно в объект CryptoKey с помощью другого криптографического ключа, выполняющего роль ключа для «развёртывания» (unwrapping). По сути, это операция обратная wrapKey: если wrapKey упаковывает ключ в безопасный переносимый формат, то unwrapKey восстанавливает его из этого состояния.
Работа метода строго зависит от выбранных алгоритмов, формата ключа и контекста криптографической операции, так как Web Crypto API требует явного указания всех параметров преобразования.
Метод вызывается через интерфейс SubtleCrypto:
crypto.subtle.unwrapKey(
format,
wrappedKey,
unwrappingKey,
unwrapAlgo,
unwrappedKeyAlgo,
extractable,
keyUsages
);
Возвращаемое значение — Promise<CryptoKey>.
Параметр format определяет способ представления
зашифрованного ключа:
"raw" — необработанные байты ключа"pkcs8" — приватный ключ в формате PKCS#8"spki" — публичный ключ в формате
SubjectPublicKeyInfo"jwk" — JSON Web KeyФормат должен соответствовать тому, как ключ был предварительно
упакован через wrapKey, иначе операция завершится
ошибкой.
wrappedKey — это зашифрованный ключевой материал,
представленный как ArrayBuffer или
TypedArray.
Он является результатом crypto.subtle.wrapKey, где ключ
был защищён с использованием криптографического алгоритма (например,
AES-GCM или RSA-OAEP).
unwrappingKey — объект CryptoKey,
используемый для расшифровки wrappedKey.
Он должен быть:
"decrypt"unwrapAlgoПримеры алгоритмов для ключа развёртывания:
Параметр unwrapAlgo описывает алгоритм, с помощью
которого был зашифрован ключ.
Чаще всего используется:
{
name: "AES-GCM",
iv: ivBuffer
}
{
name: "RSA-OAEP"
}
Этот параметр должен строго соответствовать алгоритму,
использованному при wrapKey.
unwrappedKeyAlgo описывает алгоритм будущего ключа,
который будет получен после операции.
Пример для AES-256:
{
name: "AES-GCM",
length: 256
}
Для RSA:
{
name: "RSA-PSS",
hash: "SHA-256"
}
Этот объект аналогичен параметрам метода importKey, так
как unwrapKey фактически выполняет импорт после расшифровки.
Булевый параметр, определяющий возможность дальнейшего экспорта ключа:
true — ключ можно экспортировать через
exportKeyfalse — ключ остаётся внутри Web Crypto APIВыбор значения влияет на безопасность хранения ключевого материала.
Массив строк, определяющий допустимые операции с восстановленным ключом:
"encrypt""decrypt""sign""verify""deriveKey""deriveBits""wrapKey""unwrapKey"Пример:
["encrypt", "decrypt"]
Если указанные usage не соответствуют алгоритму ключа, браузер выдаст ошибку.
Сценарий: ключ был упакован с использованием AES-GCM и затем восстанавливается тем же алгоритмом.
const wrappedKeyBuffer = /* ArrayBuffer с зашифрованным ключом */;
const iv = /* initialization vector */;
const unwrappingKey = await crypto.subtle.importKey(
"raw",
secretKeyMaterial,
{ name: "AES-GCM" },
false,
["decrypt"]
);
const key = await crypto.subtle.unwrapKey(
"raw",
wrappedKeyBuffer,
unwrappingKey,
{ name: "AES-GCM", iv },
{ name: "AES-GCM", length: 256 },
true,
["encrypt", "decrypt"]
);
RSA часто применяется для защиты симметричных ключей.
const unwrappingKey = await crypto.subtle.importKey(
"pkcs8",
privateKeyBuffer,
{
name: "RSA-OAEP",
hash: "SHA-256"
},
false,
["decrypt"]
);
const aesKey = await crypto.subtle.unwrapKey(
"raw",
wrappedAesKey,
unwrappingKey,
{
name: "RSA-OAEP"
},
{
name: "AES-GCM",
length: 256
},
true,
["encrypt", "decrypt"]
);
unwrapKey всегда предполагает наличие предварительного вызова wrapKey:
Если алгоритмы не совпадают, операция невозможна.
Если unwrapAlgo отличается от использованного при
wrapKey, результатом будет OperationError.
Переданный format должен совпадать с исходным форматом
при упаковке.
Несоответствие между назначением ключа и usage приводит к
SyntaxError.
Ключ должен поддерживать операцию "decrypt", иначе будет
ошибка InvalidAccessError.
Операция unwrapKey считается чувствительной, так как:
Критично ограничивать:
extractablekeyUsagesunwrapKey часто применяется в гибридной криптографии:
Такая схема обеспечивает баланс между производительностью симметричного шифрования и безопасностью асимметричного обмена ключами.