В Web Crypto API генерация симметрических ключей выполняется через
метод crypto.subtle.generateKey(), где параметры задаются
строго через объект алгоритма и дополнительные флаги безопасности:
const key = await crypto.subtle.generateKey(
algorithm,
extractable,
keyUsages
);
Каждый из трёх аргументов определяет поведение криптографического ключа и напрямую влияет на совместимость с алгоритмами, уровнем безопасности и возможностями последующего использования.
Первый параметр определяет тип симметричного алгоритма и его криптографические характеристики. Для симметричных алгоритмов используется структура вида:
{
name: "AES-GCM" | "AES-CBC" | "AES-CTR" | "AES-KW",
length: 128 | 192 | 256
}
AES-GCM Режим аутентифицированного шифрования (AEAD), обеспечивающий конфиденциальность и целостность данных.
{
name: "AES-GCM",
length: 256
}
Особенности:
iv при шифрованииAES-CBC Классический режим блочного шифрования с цепочкой блоков.
{
name: "AES-CBC",
length: 256
}
Особенности:
ivAES-CTR Режим счётчика, превращающий блочный шифр в потоковый.
{
name: "AES-CTR",
length: 256
}
Особенности:
AES-KW Алгоритм для обёртки ключей (Key Wrapping).
{
name: "AES-KW",
length: 128
}
Особенности:
Параметр length определяет криптографическую стойкость
ключа и измеряется в битах.
| Длина | Уровень безопасности | Применение |
|---|---|---|
| 128 | базовый | высокая производительность |
| 192 | средний | ограниченная поддержка |
| 256 | высокий | рекомендованный стандарт |
Ключевые ограничения:
Второй параметр определяет возможность извлечения ключа из контекста Web Crypto API.
const extractable = false;
Значения:
exportKeyКритические особенности:
Третий параметр задаёт допустимые операции с ключом:
["encrypt", "decrypt"]
Возможные значения:
encrypt — шифрование данныхdecrypt — расшифрованиеwrapKey — упаковка ключейunwrapKey — распаковка ключейderiveKey — вывод ключей (ограниченно для симметричных
схем)crypto.subtle.generateKey(
{ name: "AES-GCM", length: 256 },
true,
["encrypt", "decrypt"]
);
Особенности:
encrypt и decrypt обязательны для
практического использованияcrypto.subtle.generateKey(
{ name: "AES-CBC", length: 256 },
false,
["encrypt", "decrypt"]
);
Особенности:
crypto.subtle.generateKey(
{ name: "AES-CTR", length: 128 },
true,
["encrypt", "decrypt"]
);
Особенности:
crypto.subtle.generateKey(
{ name: "AES-KW", length: 128 },
false,
["wrapKey", "unwrapKey"]
);
Особенности:
При генерации симметричных ключей действуют системные ограничения:
keyUsages и алгоритма приводит к ошибке
InvalidAccessErrorNotSupportedErrorcrypto.subtle.supports["sign", "verify"] // для AES недопустимо
Симметричные алгоритмы не поддерживают цифровые подписи.
{ name: "AES-KW", length: 256 } // ошибка
AES-KW ограничен 128 битами.
["encrypt"] // но требуется decrypt
Дешифрование станет невозможным при одностороннем ключе.
При extractable: false:
exportKey() всегда возвращает ошибкуПри extractable: true:
raw, jwk{
name: "AES-GCM",
length: 256
},
false,
["encrypt", "decrypt"]
{
name: "AES-CTR",
length: 128
},
false,
["encrypt", "decrypt"]
{
name: "AES-KW",
length: 128
},
false,
["wrapKey", "unwrapKey"]
Криптографическая стойкость определяется не только длиной ключа, но и комбинацией всех параметров:
Неправильная комбинация параметров может полностью обесценить криптографическую стойкость даже при использовании AES-256.