Поддерживаемые хеш-алгоритмы в HMAC

В HMAC в Web Crypto API выбор хеш-функции определяет не только криптографическую стойкость к атакующим, но и совместимость с внешними системами, где протоколы подписания часто жёстко фиксируют используемый алгоритм.

HMAC (Hash-based Message Authentication Code) строится на основе криптографической хеш-функции и секретного ключа. В Web Crypto API хеш-функция задаётся явно при создании или использовании ключа через параметр hash.

const key = await crypto.subtle.importKey(
  "raw",
  secretKeyBuffer,
  { name: "HMAC", hash: "SHA-256" },
  false,
  ["sign", "verify"]
);

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

Поддерживаемые хеш-алгоритмы

Web Crypto API стандартизирует набор доступных хеш-функций для HMAC. Поддержка зависит от спецификации и реализации браузера, однако базовый набор остаётся стабильным.

SHA-1

Алгоритм SHA-1 исторически поддерживается в Web Crypto API, несмотря на его криптографическую устарелость.

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

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

  • длина выхода: 160 бит
  • высокая совместимость со старыми системами
  • уязвимость к коллизиям делает его непригодным для новых систем безопасности

SHA-1 используется преимущественно в легаси-протоколах и при взаимодействии с устаревшими API.

SHA-256

Наиболее распространённый вариант в современных приложениях.

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

Характеристики:

  • длина выхода: 256 бит
  • высокая устойчивость к коллизиям
  • оптимальный баланс между производительностью и безопасностью

SHA-256 является фактическим стандартом для HMAC в большинстве веб-сервисов, включая JWT и API-аутентификацию.

SHA-384

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

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

  • увеличенная длина хеша (384 бита)
  • более высокая криптостойкость по сравнению с SHA-256
  • более высокая вычислительная нагрузка

Применяется в системах, где требуется повышенный уровень безопасности без перехода на SHA-512.

SHA-512

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

Свойства:

  • длина выхода: 512 бит
  • максимальная стойкость среди алгоритмов семейства SHA-2 в WebCrypto
  • заметно более тяжёлый по вычислениям, особенно на мобильных устройствах

Используется в высокозащищённых системах, криптографических протоколах и финансовых сервисах.

Представление алгоритма в WebCrypto API

При работе с HMAC хеш-функция передаётся как строковый идентификатор внутри объекта алгоритма:

const algorithm = {
  name: "HMAC",
  hash: { name: "SHA-256" }
};

Некоторые реализации допускают сокращённую форму:

hash: "SHA-256"

Однако полная форма считается более универсальной.

Ограничения и поведение при ошибках

При попытке использовать неподдерживаемый алгоритм Web Crypto API генерирует исключение NotSupportedError.

DOMException: The algorithm is not supported

Это происходит в случаях:

  • использование нестандартного хеша (например, SHA-3)
  • попытка задать алгоритм вне спецификации WebCrypto
  • отсутствие реализации в конкретном окружении

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

Поддержка SHA-1, SHA-256, SHA-384 и SHA-512 является обязательной частью спецификации SubtleCrypto для большинства современных браузеров. При этом:

  • SHA-256 и SHA-512 поддерживаются повсеместно
  • SHA-384 поддерживается практически во всех актуальных окружениях
  • SHA-1 сохраняется исключительно для обратной совместимости

Выбор хеш-функции в HMAC

Различие между алгоритмами сводится к трем параметрам:

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

SHA-256 занимает центральное положение, так как обеспечивает достаточную безопасность при умеренных затратах ресурсов. SHA-512 применяется там, где вычислительная стоимость не критична, а уровень защиты должен быть максимальным.

Использование в операциях sign и verify

После выбора алгоритма хеш-функция фиксируется в ключе и применяется во всех операциях:

const signature = await crypto.subtle.sign(
  "HMAC",
  key,
  dataBuffer
);

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

const isValid = await crypto.subtle.verify(
  "HMAC",
  key,
  signature,
  dataBuffer
);

Несовпадение хеш-функции между ключами приводит к невозможности верификации даже при корректном ключе и данных.

Влияние хеш-функции на длину HMAC

Длина выходного значения HMAC напрямую зависит от выбранного алгоритма:

  • SHA-1 → 160 бит
  • SHA-256 → 256 бит
  • SHA-384 → 384 бит
  • SHA-512 → 512 бит

Эта характеристика критична при хранении токенов и интеграции с внешними протоколами, где ожидается фиксированная длина подписи.

Практическое значение выбора алгоритма

В рамках Web Crypto API выбор хеша в HMAC фактически определяет криптографический профиль системы. Он влияет на:

  • устойчивость к атакам перебора
  • вероятность коллизий
  • совместимость с OAuth, JWT и API-шлюзами
  • производительность на клиентской стороне

Разные алгоритмы не являются взаимозаменяемыми без изменения всей схемы подписи.