HMAC на основе MD5 применяется как механизм проверки целостности и аутентичности сообщений, когда требуется связать сообщение с секретным ключом и получить фиксированную криптографическую подпись. В библиотеке CryptoJS этот алгоритм реализуется как часть набора HMAC-функций поверх хэш-функций, включая MD5.
HMAC (Hash-based Message Authentication Code) представляет собой конструкцию, которая использует хэш-функцию и секретный ключ для вычисления кода аутентификации сообщения. MD5 в данном случае выступает как базовая хэш-функция, обеспечивающая преобразование входных данных в 128-битный хэш.
Ключевая особенность HMAC заключается не в самой хэш-функции, а в способе комбинирования ключа и сообщения. Даже при использовании устаревших хэшей, таких как MD5, HMAC сохраняет криптографическую устойчивость к большинству атак на целостность, связанных с коллизиями хэша.
Алгоритм строится на двух уровнях хэширования:
Формально вычисление можно представить следующим образом:
0x36, повторённый до размера
блока0x5c, повторённый до размера
блокаПроцесс вычисления:
HMAC-MD5(key, message) =
MD5((key ⊕ opad) || MD5((key ⊕ ipad) || message))
Где:
⊕ — побитовое XOR|| — конкатенацияБиблиотека CryptoJS предоставляет реализацию HMAC-MD5 в составе модулей хэширования. Для работы требуется подключение основных компонентов:
import CryptoJS from "crypto-js";
В случае использования в браузере через CDN:
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.2.0/crypto-js.min.js"></script>
Основной способ получения HMAC-MD5 в CryptoJS:
const message = "message text";
const secretKey = "secret";
const hash = CryptoJS.HmacMD5(message, secretKey).toString();
Результат по умолчанию возвращается в шестнадцатеричном формате (hex).
CryptoJS поддерживает различные представления результата:
CryptoJS.HmacMD5("data", "key").toString();
CryptoJS.HmacMD5("data", "key").toString(CryptoJS.enc.Base64);
CryptoJS.HmacMD5("data", "key").toString(CryptoJS.enc.Hex);
CryptoJS оперирует внутренними объектами WordArray. При необходимости можно явно задавать кодировку входных данных.
const message = CryptoJS.enc.Utf8.parse("текст");
const key = CryptoJS.enc.Utf8.parse("ключ");
const result = CryptoJS.HmacMD5(message, key).toString();
HMAC-MD5 часто применяется для формирования подписи HTTP-запросов.
Пример формирования подписи:
const apiSecret = "my_secret";
const timestamp = "1714123456";
const method = "GET";
const path = "/api/v1/user";
const payload = method + path + timestamp;
const signature = CryptoJS.HmacMD5(payload, apiSecret).toString();
Подпись затем передаётся в заголовке:
Authorization: HMAC signature=<signature>
Если ключ превышает размер блока MD5 (64 байта), он предварительно хэшируется:
CryptoJS выполняет эту нормализацию автоматически, без необходимости ручной обработки.
MD5 как самостоятельная хэш-функция считается криптографически небезопасной из-за возможности построения коллизий. Однако в составе HMAC ситуация отличается:
Несмотря на поддержку, HMAC-MD5 применяется всё реже:
В современных системах чаще используются:
| Алгоритм | Длина хэша | Уровень безопасности | Скорость |
|---|---|---|---|
| HMAC-MD5 | 128 бит | низкий (MD5 устарел) | высокий |
| HMAC-SHA1 | 160 бит | средний | средний |
| HMAC-SHA256 | 256 бит | высокий | ниже |
HMAC-MD5 может использоваться как часть многоступенчатой обработки:
const step1 = CryptoJS.MD5("intermediate data");
const signature = CryptoJS.HmacMD5(step1.toString(), "key").toString();
Такой подход применяется в системах с промежуточным хэшированием данных перед подписью.
Типовые проблемы при работе с CryptoJS HMAC-MD5:
Пример корректной нормализации:
const normalized = JSON.stringify({
id: 10,
name: "test"
});
const signature = CryptoJS.HmacMD5(normalized, "key").toString();
Изменение кодировки приводит к полностью различным хэшам даже при одинаковом тексте.
Пример:
CryptoJS.HmacMD5("abc", "key").toString();
CryptoJS.HmacMD5(CryptoJS.enc.Utf8.parse("abc"), "key").toString();
Во втором случае вход преобразуется в WordArray до вычисления.
MD5 является одной из самых быстрых хэш-функций, поэтому HMAC-MD5 обладает высокой скоростью вычисления:
Однако выигрыш в скорости компенсируется снижением криптографической стойкости по сравнению с SHA-2 семейством.
CryptoJS обеспечивает одинаковое поведение в разных средах:
const sig = CryptoJS.HmacMD5("data", "key").toString();
const CryptoJS = require("crypto-js");
const sig = CryptoJS.HmacMD5("data", "key").toString();
Различий в реализации алгоритма нет, так как вся логика реализована на уровне JavaScript.