В 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 исторически поддерживается в Web Crypto API, несмотря на его криптографическую устарелость.
{ name: "HMAC", hash: "SHA-1" }
Особенности:
SHA-1 используется преимущественно в легаси-протоколах и при взаимодействии с устаревшими API.
Наиболее распространённый вариант в современных приложениях.
{ name: "HMAC", hash: "SHA-256" }
Характеристики:
SHA-256 является фактическим стандартом для HMAC в большинстве веб-сервисов, включая JWT и API-аутентификацию.
{ name: "HMAC", hash: "SHA-384" }
Особенности:
Применяется в системах, где требуется повышенный уровень безопасности без перехода на SHA-512.
{ name: "HMAC", hash: "SHA-512" }
Свойства:
Используется в высокозащищённых системах, криптографических протоколах и финансовых сервисах.
При работе с HMAC хеш-функция передаётся как строковый идентификатор внутри объекта алгоритма:
const algorithm = {
name: "HMAC",
hash: { name: "SHA-256" }
};
Некоторые реализации допускают сокращённую форму:
hash: "SHA-256"
Однако полная форма считается более универсальной.
При попытке использовать неподдерживаемый алгоритм Web Crypto API
генерирует исключение NotSupportedError.
DOMException: The algorithm is not supported
Это происходит в случаях:
Поддержка SHA-1, SHA-256, SHA-384 и SHA-512 является обязательной частью спецификации SubtleCrypto для большинства современных браузеров. При этом:
Различие между алгоритмами сводится к трем параметрам:
SHA-256 занимает центральное положение, так как обеспечивает достаточную безопасность при умеренных затратах ресурсов. SHA-512 применяется там, где вычислительная стоимость не критична, а уровень защиты должен быть максимальным.
После выбора алгоритма хеш-функция фиксируется в ключе и применяется во всех операциях:
const signature = await crypto.subtle.sign(
"HMAC",
key,
dataBuffer
);
Проверка выполняется тем же ключом и алгоритмом:
const isValid = await crypto.subtle.verify(
"HMAC",
key,
signature,
dataBuffer
);
Несовпадение хеш-функции между ключами приводит к невозможности верификации даже при корректном ключе и данных.
Длина выходного значения HMAC напрямую зависит от выбранного алгоритма:
Эта характеристика критична при хранении токенов и интеграции с внешними протоколами, где ожидается фиксированная длина подписи.
В рамках Web Crypto API выбор хеша в HMAC фактически определяет криптографический профиль системы. Он влияет на:
Разные алгоритмы не являются взаимозаменяемыми без изменения всей схемы подписи.