В Web Crypto API каждый ключ (CryptoKey) обладает
свойством, определяющим возможность его извлечения из криптографического
контекста:
extractable: boolean
Это логический флаг, который задаётся при создании или импорте ключа
и определяет, можно ли экспортировать ключевое значение наружу через
crypto.subtle.exportKey.
extractable: true Ключ может быть экспортирован в
поддерживаемые форматы (например, spki, pkcs8,
jwk).extractable: false Ключ становится неизвлекаемым:
попытка экспорта приводит к ошибке OperationError.Основная задача параметра — контроль утечек криптографического материала:
const key = await crypto.subtle.generateKey(
{
name: "AES-GCM",
length: 256
},
false, // extractable
["encrypt", "decrypt"]
);
Попытка экспорта:
await crypto.subtle.exportKey("raw", key);
Приведёт к исключению.
Неизвлекаемые ключи усиливают модель защиты, но вводят ограничения:
Поэтому выбор значения зависит от архитектуры:
falsetruetrueСвойство usages определяет, какие криптографические операции разрешены для конкретного ключа.
Это массив строк, фиксируемый при создании или импорте ключа:
usages: ["encrypt", "decrypt"]
Web Crypto API использует этот механизм как встроенную политику доступа.
"encrypt" — разрешено шифрование"decrypt" — разрешено расшифрование"wrapKey" — упаковка ключей"unwrapKey" — распаковка ключей"sign" — создание цифровой подписи"verify" — проверка подписи"deriveKey" — вывод ключа"deriveBits" — получение битового материалаКлюч нельзя использовать за пределами указанных операций.
Пример:
const key = await crypto.subtle.generateKey(
{
name: "AES-GCM",
length: 256
},
true,
["encrypt"]
);
await crypto.subtle.decrypt(
{ name: "AES-GCM", iv },
key,
data
);
Результат — ошибка, так как "decrypt" отсутствует в
usages.
Проверка выполняется браузером на уровне Web Crypto API до выполнения операции. Это не логическое соглашение, а встроенное ограничение исполнения.
Оба параметра задаются при создании ключа и формируют его криптографическую политику.
crypto.subtle.generateKey(
algorithm,
extractable,
usages
);
extractable регулирует возможность экспортаusages регулирует допустимые криптографические
операцииОни не влияют друг на друга напрямую.
extractable: false,
usages: ["encrypt", "decrypt"]
Характеристика:
extractable: true,
usages: ["sign"]
Характеристика:
extractable: true,
usages: ["encrypt", "decrypt", "wrapKey"]
Характеристика:
Если операция не входит в список usages, API возвращает
InvalidAccessError.
Возникает:
OperationErrorДля производных ключей критично корректное указание:
usages: ["deriveKey", "deriveBits"]
Отсутствие одного из значений блокирует соответствующий метод.
После создания ключа:
extractable нельзя изменитьusages нельзя изменитьКлюч становится неизменяемым объектом политики доступа.
Некоторые алгоритмы игнорируют часть usages, но Web Crypto API всё равно требует их корректного указания.
При импорте/экспорте через JWK поле "key_ops"
синхронизируется с usages.
usages: ["encrypt", "decrypt", "sign", "verify"]
Проблема: нарушение принципа минимальных привилегий.
Ключ создан, но операция не выполняется из-за отсутствия
"decrypt" или "sign".
extractable: false часто приводит к неожиданным ошибкам
при интеграции с внешними системами.
usages до строго
необходимогоextractable: false для ключей хранения и
шифрования локальных данныхextractable и usages формируют основу
модели безопасности Web Crypto API:
Эти параметры превращают ключ не просто в бинарный объект, а в строго ограниченный криптографический ресурс с фиксированной политикой использования