Алгоритмы и параметры алгоритмов

Алгоритмы Web Crypto API в браузере представлены не строками и не «магическими именами», а структурированными объектами параметров, которые передаются в методы SubtleCrypto: generateKey, encrypt, decrypt, sign, verify, digest, deriveKey, importKey, exportKey. Каждый алгоритм задаётся через поле name, а дополнительные параметры зависят от конкретного криптопримитива.

Во всех операциях используется единая схема:

  • объект алгоритма всегда содержит поле name
  • дополнительные параметры строго зависят от алгоритма
  • параметры проверяются на уровне реализации браузера
  • несовпадение структуры приводит к DataError

Пример общей формы:

{
  name: "AES-GCM",
  iv: Uint8Array(...),
  additionalData: Uint8Array(...),
  tagLength: 128
}

Именно сочетание name + параметры определяет поведение криптографической операции.


Хэш-алгоритмы (digest)

Операция crypto.subtle.digest принимает только имя алгоритма.

Поддерживаемые значения:

  • "SHA-1" (устаревший)
  • "SHA-256"
  • "SHA-384"
  • "SHA-512"

Формат:

crypto.subtle.digest("SHA-256", data)

Параметр — строка, а не объект. Это единственный класс алгоритмов в WebCrypto, где структура минимальна.


Симметричное шифрование AES

AES-CTR

{
  name: "AES-CTR",
  counter: Uint8Array,
  length: 64
}

Параметры:

  • counter — 16-байтовый блок счётчика (nonce + начальное значение)
  • length — число бит, используемых как счётчик (обычно 64 или 128)

Особенность: отсутствует аутентификация, используется только потоковое шифрование.


AES-CBC

{
  name: "AES-CBC",
  iv: Uint8Array
}

Параметры:

  • iv — 16-байтовый вектор инициализации

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

  • требует паддинга (PKCS#7 внутри реализации)
  • не обеспечивает целостность данных

AES-GCM

{
  name: "AES-GCM",
  iv: Uint8Array,
  additionalData?: Uint8Array,
  tagLength?: 128
}

Параметры:

  • iv — уникальный nonce (рекомендуется 12 байт)
  • additionalData — ассоциированные данные (AAD), не шифруются, но аутентифицируются
  • tagLength — длина тега аутентификации (обычно 128)

Ключевая особенность: режим AEAD (Authenticated Encryption with Associated Data).

Важно учитывать:

  • повтор IV полностью ломает безопасность
  • additionalData должна совпадать при шифровании и расшифровке

HMAC (Hash-based Message Authentication Code)

{
  name: "HMAC",
  hash: { name: "SHA-256" }
}

Параметры:

  • hash — хэш-функция, используемая внутри HMAC

Поддерживаемые хэши:

  • SHA-1
  • SHA-256
  • SHA-384
  • SHA-512

HMAC не шифрует данные, а создаёт код аутентичности.


RSA-OAEP (шифрование)

{
  name: "RSA-OAEP",
  hash: { name: "SHA-256" }
}

Параметры:

  • hash — хэш-функция для padding OAEP

Используется в:

  • encrypt
  • decrypt
  • wrapKey / unwrapKey

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

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

RSA-PSS (подпись)

{
  name: "RSA-PSS",
  saltLength: 32
}

Параметры:

  • saltLength — длина соли в байтах

Дополнительно используется:

{
  name: "SHA-256"
}

(передаётся отдельно в sign / verify как hash в ключе)

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

  • probabilistic signature scheme
  • одинаковый вход даёт разные подписи

ECDSA (эллиптические кривые, подпись)

{
  name: "ECDSA",
  hash: { name: "SHA-256" }
}

Параметры:

  • hash — хэш-функция перед подписью

Кривые определяются при генерации ключа:

  • P-256
  • P-384
  • P-521

Алгоритм не требует дополнительных параметров в sign, кроме hash.


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

{
  name: "ECDH"
}

Сам алгоритм не содержит параметров, но ключевая конфигурация задаётся при deriveKey:

{
  name: "ECDH",
  public: CryptoKey
}

Параметры:

  • public — публичный ключ второй стороны

Используется в:

  • deriveKey
  • deriveBits

PBKDF2 (выведение ключа из пароля)

{
  name: "PBKDF2",
  salt: Uint8Array,
  iterations: 100000,
  hash: "SHA-256"
}

Параметры:

  • salt — случайная соль
  • iterations — количество итераций (нагрузка на вычисление)
  • hash — хэш-функция

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

  • критично высокое значение iterations повышает безопасность
  • используется для защиты паролей

HKDF (ключевая деривация)

{
  name: "HKDF",
  salt: Uint8Array,
  info: Uint8Array,
  hash: "SHA-256"
}

Параметры:

  • salt — криптографическая соль
  • info — контекстная информация (может быть пустой)
  • hash — базовая хэш-функция

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

  • используется после получения общего секрета (например, ECDH)
  • обеспечивает разделение ключей по контексту

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

AES

{
  name: "AES-GCM",
  length: 256
}
  • length — размер ключа в битах (128 / 192 / 256)

RSA

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

Параметры:

  • modulusLength — размер ключа (2048, 3072, 4096)
  • publicExponent — обычно 65537
  • hash — алгоритм padding

ECDSA / ECDH

{
  name: "ECDSA",
  namedCurve: "P-256"
}

Параметры:

  • namedCurve:

    • P-256
    • P-384
    • P-521

Алгоритмы импорта ключей

При importKey алгоритм может быть:

  • "raw"
  • "jwk"
  • "pkcs8"
  • "spki"
  • "wrapKey"

Здесь algorithm часто равен null или { name: ... } в зависимости от контекста.

Особенность: импорт не всегда требует параметров алгоритма, но требует согласования с extractable и keyUsages.


DeriveKey и DeriveBits

ECDH deriveKey

{
  name: "ECDH",
  public: CryptoKey
}

PBKDF2 deriveKey

{
  name: "PBKDF2",
  salt: Uint8Array,
  iterations: 100000,
  hash: "SHA-256"
}

HKDF deriveKey

{
  name: "HKDF",
  salt: Uint8Array,
  info: Uint8Array,
  hash: "SHA-256"
}

Общая особенность:

  • вход всегда зависит от секретного материала
  • выходной алгоритм задаётся отдельно (например AES-GCM)

Структура параметров и строгая типизация

WebCrypto API не допускает «нестрогих» значений:

  • строки вместо Uint8Array приводят к ошибке
  • пропущенные обязательные поля вызывают TypeError
  • неверный name приводит к NotSupportedError

Типичные правила:

  • IV всегда Uint8Array фиксированной длины
  • hash всегда объект { name: "SHA-256" } или строка в deriveKey
  • публичные ключи передаются как CryptoKey
  • дополнительные данные (AAD, info, salt) должны быть детерминированы и совпадать при повторной операции

Совместимость алгоритмов и операций

Каждый алгоритм поддерживает строго ограниченный набор операций:

  • AES-GCM → encrypt / decrypt
  • AES-CBC → encrypt / decrypt
  • RSA-OAEP → encrypt / decrypt / wrapKey / unwrapKey
  • RSA-PSS → sign / verify
  • ECDSA → sign / verify
  • ECDH → deriveKey / deriveBits
  • HMAC → sign / verify
  • PBKDF2 → deriveKey / deriveBits
  • HKDF → deriveKey / deriveBits

Несовпадение алгоритма и операции приводит к InvalidAccessError.


Критичные нюансы параметров

  • IV и nonce должны быть уникальны в пределах ключа (особенно AES-GCM)
  • salt в PBKDF2 должен быть случайным и достаточной длины
  • iterations в PBKDF2 напрямую влияет на стойкость
  • tagLength в AES-GCM уменьшает или увеличивает криптографическую надёжность
  • publicExponent в RSA практически всегда фиксирован (65537), отклонения могут снижать совместимость

Общая модель взаимодействия алгоритмов

Алгоритмы WebCrypto не являются независимыми сущностями — они связаны через:

  • формат ключей
  • допустимые операции
  • совместимость параметров
  • строгую сериализацию данных (ArrayBuffer / TypedArray)

Любая ошибка в параметрах не компенсируется библиотекой, а приводит к немедленному исключению на уровне API, что делает корректное формирование алгоритм-объектов центральной частью работы с WebCrypto.