В криптографии HMAC (Hash-based Message Authentication Code) - это особая конструкция для вычисления кода аутентификации сообщения (MAC), включающая криптографическую хеш-функцию в сочетании с секретным ключом.

В криптографии HMAC (Hash-based Message Authentication Code) - это особая конструкция для вычисления кода аутентификации сообщения (MAC), включающая криптографическую хеш-функцию в сочетании с секретным ключом. Как и любой MAC, он может использоваться для одновременной проверки целостности данных и подлинности сообщения. Любая криптографическая хеш-функция, такая как MD5 или SHA-1, может использоваться при вычислении HMAC; результирующий алгоритм MAC называется HMAC-MD5 или HMAC-SHA1 соответственно. Криптографическая стойкость HMAC зависит от криптографической стойкости базовой хэш-функции, размера ее выходной длины хеш-функции в битах, а также от размера и качества криптографического ключа.

Итеративная хеш-функция разбивает сообщение на блоки фиксированного размера и выполняет итерацию по ним с помощью функции сжатия. Например, MD5 и SHA-1 работают с 512-битными блоками. Размер вывода HMAC такой же, как и у базовой хэш-функции (128 или 160 бит в случае MD5 или SHA-1, соответственно), хотя при желании он может быть усечен.

Определение и анализ конструкции HMAC были впервые опубликованы в 1996 году Михиром Белларе, Ран Канетти и Хьюго Кравчик, которые также написали RFC 2104. В этой статье также определен вариант, называемый NMAC, который используется редко, если вообще используется. FIPS PUB 198 обобщает и стандартизирует использование HMAC. HMAC-SHA-1 и HMAC-MD5 используются в протоколах IPsec и TLS.

Источник: Википедия


Пример вычисления HMAC-SHA256 в Java:

byte[] expectedResult = { /* Expected HMAC result from a prior run */
        96, 21, 116, 11, 4, -51, -115, -20, 104, 18, 117, -75, 3, -100, 126,
        -89, -22, 120, -120, 30, 102, 104, -125, -120, -62, 111, -75,
        24, 14, 62, 48, -65 };

byte[] secret = "your eyes only".getBytes();
String algorithm = "HmacSha256";

SecretKeySpec signingKey = new SecretKeySpec(secret, algorithm);

// Init HMAC usign secret
Mac hmac = Mac.getInstance(algorithm);
hmac.init(signingKey);

// Run message through HMAC and calculate result
byte[] message = "Don't tamper with me".getBytes();
byte[] macOutput = hmac.doFinal(message);

// Compare HMAC output to expected result
// A message that has been altered will not be equal
assertTrue(Arrays.equals(macOutput, expectedResult));