Функция HMAC описана в RFC 2104 и предполагает использование ключа длиной L байт и некоторой произвольной однонаправленной хэш-функции HASH, выходное значение которой также составляет L байт.
Для любой используемой хэш-функции предполагается, что она имеет единственный аргумент TEXT произвольной длины, разбиваемый на блоки по B байт (L < B), и некоторую инициализирующую последовательность INIT также длиной B байт. Таким образом, синтаксис хэш-функции принимает вид:
HASH(INIT, TEXT)
Значение аутентифицирующей комбинации вычисляется исходя из секретного ключа аутентификации AUTH и непосредственно данных DATA произвольной длины по следующему правилу:
HMAC = HASH(KEY1, HASH(KEY2, DATA))
Поясним это выражение.
Рекомендуемая длина ключа AUTH составляет L байт. Допускается и длина в диапазоне от L до B байт. Если же ключ длиннее B байт, то к нему применяется хэш-функция HASH и в качестве ключа уже используется полученная новая комбинация длиной L байт.
Далее ключ AUTH дополняется нулями до длины B байт, таким образом, получается некоторое значение TEMP, которое используется для вычисления инициализирующих комбинаций:
KEY1 = TEMP xor 0x5C(повторено B раз)
KEY2 = TEMP xor 0x36(повторено B раз)
Смысл применения инициирующей комбинации заключается в следующем.
Любая хэш-функция имеет свое внутреннее состояние. В начале работы функции ее состояние всегда одинаково и описано в стандарте на нее (см. ниже описание соответствующих алгоритмов). Чтобы усилить стойкость хеширования, перед поступлением на вход собственно данных, выполняется хеширование некоей инициализирующей последовательности, которое изменяет начальное состояние функции и вносит дополнительный элемент разнообразия. Таким образом, запись
HASH(INIT, TEXT)
в реальности преобразуется следующим образом:
HASH_INIT(INIT),
HASH(TEXT),
где HASH_INIT – хэш-функция со стандартным начальным состоянием.
В заключении отметим, что полное обозначение процедуры вычисления аутентифицирующей комбинации складывается из названия алгоритма и используемой хэш-функции. Например, HMAC-MD5 или HMAC-SHA1. При этом предполагается, что длина комбинации определяется хэш-функцией (в данном случае 128 и 160 бит, соответственно). Иногда используются не все разряды результата, как правило, отбрасываются младшие биты. В этом случае в обозначение кода алгоритма аутентификации добавляют количество используемых разрядов. Например, наиболее часто используемыми являются алгоритмы HMAC-MD5-80 и HMAC-SHA1-96.