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

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

Общий вид вызова:

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

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


Объект алгоритма генерации

RSA-OAEP и RSASSA-PKCS1-v1_5

Для RSA-алгоритмов объект параметров содержит несколько обязательных полей:

const algorithm = {
  name: "RSA-OAEP",
  modulusLength: 2048,
  publicExponent: new Uint8Array([1, 0, 1]),
  hash: "SHA-256"
};

name

Определяет тип алгоритма:

  • "RSA-OAEP" — шифрование и расшифрование
  • "RSASSA-PKCS1-v1_5" — цифровая подпись
  • "RSA-PSS" — современный вариант подписи с вероятностным дополнением

Выбор алгоритма влияет на допустимые keyUsages.


modulusLength

Длина RSA-ключа в битах:

  • 1024 — устаревшее значение, не используется в современных системах
  • 2048 — минимально допустимый уровень безопасности
  • 3072 и 4096 — повышенная стойкость, увеличенная стоимость операций

Увеличение длины напрямую влияет на:

  • скорость генерации ключа
  • скорость шифрования/подписи
  • устойчивость к атакующим моделям

publicExponent

Обычно фиксированное значение:

new Uint8Array([1, 0, 1]) // 65537

Это стандартный публичный экспонент RSA, выбранный из-за оптимального баланса между безопасностью и производительностью. Альтернативные значения встречаются редко и требуют строгого обоснования.


hash

Определяет хэш-функцию, используемую внутри алгоритма:

  • "SHA-1" — устаревший, не рекомендуется
  • "SHA-256" — стандартный вариант
  • "SHA-384", "SHA-512" — повышенная криптостойкость

Хэш-функция влияет на внутреннюю схему паддинга и устойчивость к коллизиям.


Эллиптические кривые (ECDSA и ECDH)

Генерация ключей на эллиптических кривых требует более компактного набора параметров.

const algorithm = {
  name: "ECDSA",
  namedCurve: "P-256"
};

namedCurve

Определяет используемую кривую:

  • "P-256" (secp256r1) — наиболее распространённая
  • "P-384" — повышенная криптостойкость
  • "P-521" — максимальная стойкость в рамках стандартных кривых

Для ECDH структура аналогична:

const algorithm = {
  name: "ECDH",
  namedCurve: "P-256"
};

Особенности ECDSA vs ECDH

  • ECDSA используется для цифровых подписей
  • ECDH используется для обмена ключами

Несмотря на одинаковые кривые, ключи не взаимозаменяемы из-за различий в назначении и операциях.


Extractable — управляемость ключом

const extractable = true;

Параметр определяет возможность извлечения приватного ключа:

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

Практическое значение:

  • false повышает безопасность (ключ нельзя украсть через API)
  • true требуется при резервном копировании или переносе

keyUsages — ограничения применения ключа

Массив назначений определяет, какие операции допустимы для ключа.

RSA-OAEP

["encrypt", "decrypt", "wrapKey", "unwrapKey"]

RSASSA-PKCS1-v1_5 / RSA-PSS

["sign", "verify"]

ECDSA

["sign", "verify"]

ECDH

["deriveKey", "deriveBits"]

Ошибки конфигурации keyUsages являются одной из частых причин исключений InvalidAccessError.


Пример полной генерации RSA-OAEP

const keyPair = await crypto.subtle.generateKey(
  {
    name: "RSA-OAEP",
    modulusLength: 2048,
    publicExponent: new Uint8Array([1, 0, 1]),
    hash: "SHA-256"
  },
  false,
  ["encrypt", "decrypt"]
);

Пример генерации ECDSA ключей

const keyPair = await crypto.subtle.generateKey(
  {
    name: "ECDSA",
    namedCurve: "P-256"
  },
  true,
  ["sign", "verify"]
);

Влияние параметров на криптографические свойства

Размер ключа и безопасность

Для RSA увеличение modulusLength экспоненциально повышает сложность факторизации, но также увеличивает вычислительные затраты.

Кривая и производительность

В ECC:

  • P-256 быстрее
  • P-521 устойчивее, но значительно медленнее

Хэш-функция и устойчивость схем

В RSA-OAEP и RSA-PSS выбор hash влияет на:

  • устойчивость к коллизиям
  • размер внутреннего дайджеста
  • совместимость с внешними системами

Ошибки конфигурации параметров

Несовместимый hash

Некоторые реализации браузеров ограничивают допустимые комбинации алгоритмов и хэшей. Например, RSA-PSS с SHA-1 может быть запрещён.


Недопустимые keyUsages

Если указано:

["encrypt", "sign"]

для RSA-OAEP, возникнет ошибка, так как алгоритм не поддерживает подпись.


Неподдерживаемая кривая

Если указать:

namedCurve: "secp256k1"

в большинстве браузеров это вызовет NotSupportedError, хотя криптографически кривая широко используется в блокчейн-системах.


Особенности реализации в браузерах

Поддержка алгоритмов зависит от движка:

  • Chromium (V8) — наиболее полная поддержка
  • Firefox (SpiderMonkey) — строгая проверка параметров
  • Safari (WebKit) — исторически ограниченная поддержка некоторых кривых и RSA-режимов

Связь параметров генерации с дальнейшими операциями

Параметры, заданные на этапе generateKey, определяют:

  • допустимость encrypt/decrypt
  • возможность sign/verify
  • совместимость с importKey/exportKey
  • формат сериализации ключей

Несоответствие между параметрами генерации и последующим использованием приводит к ошибкам уже на этапе выполнения криптоопераций.


Типовые конфигурации

Шифрование данных (RSA-OAEP)

  • modulusLength: 2048+
  • hash: SHA-256
  • usages: encrypt/decrypt

Подпись (ECDSA P-256)

  • namedCurve: P-256
  • usages: sign/verify
  • extractable: true (для тестирования), false (для production)

Обмен ключами (ECDH)

  • namedCurve: P-256 или P-384
  • usages: deriveKey, deriveBits

Структурная зависимость параметров

Параметры генерации нельзя рассматривать изолированно. Они образуют связанную систему:

  • выбор алгоритма определяет допустимые поля
  • поля определяют криптографическую модель
  • модель определяет набор операций и ограничения безопасности

Ошибочная комбинация параметров приводит не к деградации безопасности, а к полной невозможности использования ключа.