Метод crypto.subtle.verify используется для проверки
цифровой подписи или кода аутентичности сообщения. В случае HMAC он
применяется для верификации целостности и подлинности данных на основе
симметричного ключа.
HMAC (Hash-based Message Authentication Code) представляет собой
механизм, который сочетает криптографическую хеш-функцию и секретный
ключ. Метод verify позволяет сравнить переданный MAC
(message authentication code) с вычисленным значением, не раскрывая при
этом сам секретный ключ.
Метод вызывается через интерфейс SubtleCrypto:
crypto.subtle.verify(
algorithm,
key,
signature,
data
);
algorithm Объект, описывающий используемый алгоритм. Для HMAC это:
{ name: "HMAC" }
key Ключ типа CryptoKey, полученный
через crypto.subtle.importKey или
crypto.subtle.generateKey. Ключ обязательно должен
быть:
algorithm: HMACusages: ["verify"] или
["sign", "verify"]extractable: false (в большинстве безопасных
сценариев)signature Буфер ArrayBuffer или
TypedArray, содержащий HMAC-код, который требуется
проверить.
data Данные (ArrayBuffer или
TypedArray), для которых выполняется проверка.
Возвращаемое значение Promise, который разрешается в логическое значение:
true — подпись совпадаетfalse — подпись не совпадаетПроверка HMAC не расшифровывает данные и не восстанавливает ключ. Вместо этого происходит повторное вычисление MAC:
Если значения совпадают — данные считаются подлинными и неизменёнными.
Перед использованием verify необходимо создать или
импортировать ключ.
const key = await crypto.subtle.generateKey(
{
name: "HMAC",
hash: "SHA-256"
},
false,
["sign", "verify"]
);
const encoder = new TextEncoder();
const data = encoder.encode("сообщение для проверки");
const signature = await crypto.subtle.sign(
"HMAC",
key,
data
);
const isValid = await crypto.subtle.verify(
"HMAC",
key,
signature,
data
);
console.log(isValid); // true
Любое изменение входного сообщения приводит к изменению результата проверки.
const tampered = encoder.encode("изменённое сообщение");
const isValid = await crypto.subtle.verify(
"HMAC",
key,
signature,
tampered
);
console.log(isValid); // false
Внутри реализации используется защищённое сравнение, предотвращающее timing-атаки. Это исключает возможность определения совпадения по времени выполнения.
Проверка возможна только при использовании того же
CryptoKey, что применялся для генерации подписи. Даже
незначительное расхождение делает результат false.
Поддерживаются:
ArrayBufferTypedArray (Uint8Array и др.)Строки напрямую не поддерживаются и требуют предварительного преобразования.
const rawKey = encoder.encode("secret-key");
const key = await crypto.subtle.importKey(
"raw",
rawKey,
{
name: "HMAC",
hash: "SHA-256"
},
false,
["sign", "verify"]
);
const valid = await crypto.subtle.verify(
"HMAC",
key,
signature,
data
);
HMAC используется для подтверждения, что данные:
В веб-сервисах HMAC часто применяется для:
const expectedSignature = await crypto.subtle.verify(
"HMAC",
secretKey,
receivedSignature,
requestBody
);
Если результат false, запрос отклоняется.
Разные способы преобразования строки в байты приводят к различным HMAC:
TextEncoder().encode("text")
и
Buffer.from("text")
могут давать разные результаты в зависимости от окружения.
Ключ должен быть именно HMAC-типа. RSA или ECDSA ключи несовместимы с
verify для HMAC.
Даже один изменённый байт делает подпись недействительной.
Нельзя проверять HMAC через обычное сравнение строк:
if (computed === signature) // небезопасно
Причины:
Метод crypto.subtle.verify решает эти проблемы на уровне
реализации.
verify всегда возвращает Promise, так как
криптографические операции выполняются вне основного потока выполнения
JavaScript.
await crypto.subtle.verify(...)
Это важно учитывать при построении цепочек обработки данных и серверной логики в браузере.
Все входные параметры метода работают на уровне байтов. Это означает:
TextEncoderArrayBuffercrypto.subtle.verifycrypto.subtle.signМетод verify всегда используется в паре с:
crypto.subtle.sign — создание HMACcrypto.subtle.verify — проверка HMACОба метода работают с одинаковыми входными параметрами алгоритма и ключа, обеспечивая симметричную модель аутентификации данных.