Параметры генерации для симметричных алгоритмов

Общая структура генерации симметричного ключа

В Web Crypto API генерация симметрических ключей выполняется через метод crypto.subtle.generateKey(), где параметры задаются строго через объект алгоритма и дополнительные флаги безопасности:

const key = await crypto.subtle.generateKey(
  algorithm,
  extractable,
  keyUsages
);

Каждый из трёх аргументов определяет поведение криптографического ключа и напрямую влияет на совместимость с алгоритмами, уровнем безопасности и возможностями последующего использования.


Объект алгоритма (algorithm)

Первый параметр определяет тип симметричного алгоритма и его криптографические характеристики. Для симметричных алгоритмов используется структура вида:

{
  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
}

Особенности:

  • Требует случайный iv
  • Не обеспечивает целостность данных
  • Уязвим при неправильной реализации padding oracle атак

AES-CTR Режим счётчика, превращающий блочный шифр в потоковый.

{
  name: "AES-CTR",
  length: 256
}

Особенности:

  • Использует nonce + counter
  • Параллелизуемое шифрование
  • Не обеспечивает аутентификацию

AES-KW Алгоритм для обёртки ключей (Key Wrapping).

{
  name: "AES-KW",
  length: 128
}

Особенности:

  • Используется только для шифрования ключей
  • Не применяется для произвольных данных
  • Поддерживает фиксированные режимы упаковки

Длина ключа (length)

Параметр length определяет криптографическую стойкость ключа и измеряется в битах.

Длина Уровень безопасности Применение
128 базовый высокая производительность
192 средний ограниченная поддержка
256 высокий рекомендованный стандарт

Ключевые ограничения:

  • AES-KW допускает только 128 бит
  • Некоторые реализации WebCrypto в браузерах могут не поддерживать 192-битные ключи
  • AES-256 считается стандартом для современных систем

Флаг extractable

Второй параметр определяет возможность извлечения ключа из контекста Web Crypto API.

const extractable = false;

Значения:

  • true — ключ может быть экспортирован через exportKey
  • false — ключ остаётся неизвлекаемым

Критические особенности:

  • Не влияет на возможность шифрования/дешифрования внутри API
  • Необратим после генерации (если false)
  • Рекомендуется для производственных сценариев

Назначение ключа (keyUsages)

Третий параметр задаёт допустимые операции с ключом:

["encrypt", "decrypt"]

Возможные значения:

  • encrypt — шифрование данных
  • decrypt — расшифрование
  • wrapKey — упаковка ключей
  • unwrapKey — распаковка ключей
  • deriveKey — вывод ключей (ограниченно для симметричных схем)

Комбинации параметров по алгоритмам

AES-GCM

crypto.subtle.generateKey(
  { name: "AES-GCM", length: 256 },
  true,
  ["encrypt", "decrypt"]
);

Особенности:

  • encrypt и decrypt обязательны для практического использования
  • Используется в TLS-подобных сценариях

AES-CBC

crypto.subtle.generateKey(
  { name: "AES-CBC", length: 256 },
  false,
  ["encrypt", "decrypt"]
);

Особенности:

  • Часто используется в устаревших системах
  • Требует строгого контроля IV

AES-CTR

crypto.subtle.generateKey(
  { name: "AES-CTR", length: 128 },
  true,
  ["encrypt", "decrypt"]
);

Особенности:

  • Ошибки в nonce приводят к критической уязвимости
  • Требует уникальности счётчика

AES-KW

crypto.subtle.generateKey(
  { name: "AES-KW", length: 128 },
  false,
  ["wrapKey", "unwrapKey"]
);

Особенности:

  • Используется только для управления ключами
  • Не предназначен для шифрования данных

Внутренние ограничения Web Crypto API

При генерации симметричных ключей действуют системные ограничения:

  • Несоответствие keyUsages и алгоритма приводит к ошибке InvalidAccessError
  • Неподдерживаемые длины ключей вызывают NotSupportedError
  • Некоторые браузеры ограничивают AES-192
  • Алгоритм должен быть явно поддержан платформой через crypto.subtle.supports

Типичные ошибки конфигурации

Несовместимые назначения ключа

["sign", "verify"] // для AES недопустимо

Симметричные алгоритмы не поддерживают цифровые подписи.


Неверная длина ключа

{ name: "AES-KW", length: 256 } // ошибка

AES-KW ограничен 128 битами.


Отсутствие необходимых операций

["encrypt"] // но требуется decrypt

Дешифрование станет невозможным при одностороннем ключе.


Особенности поведения extractable

При extractable: false:

  • exportKey() всегда возвращает ошибку
  • ключ остаётся внутри криптографического контекста
  • повышается устойчивость к утечкам через JS-слой

При extractable: true:

  • возможен экспорт в форматах raw, jwk
  • увеличивается риск компрометации при XSS

Рекомендованные комбинации параметров

Безопасный универсальный вариант AES-GCM

{
  name: "AES-GCM",
  length: 256
},
false,
["encrypt", "decrypt"]

Производительный вариант для ограниченных сред

{
  name: "AES-CTR",
  length: 128
},
false,
["encrypt", "decrypt"]

Управление ключами

{
  name: "AES-KW",
  length: 128
},
false,
["wrapKey", "unwrapKey"]

Влияние параметров на безопасность

Криптографическая стойкость определяется не только длиной ключа, но и комбинацией всех параметров:

  • длина ключа задаёт теоретическую стойкость
  • режим шифрования определяет модель угроз
  • keyUsages ограничивает поверхность атаки
  • extractable влияет на возможность утечки через API

Неправильная комбинация параметров может полностью обесценить криптографическую стойкость даже при использовании AES-256.