НМАС и псевдослучайная функция
Для получения МАС используется НМАС, поэтому если не знать секрета МАС, подделать МАС невозможно.
НМАС может использоваться с различными хэш-алгоритмами. TLS задействует при Рукопожатии два алгоритма, MD5 и SHA-1, обозначаемых как HMAC_MD5 (secret, data) и HMAC_SHA (secret, data). Могут быть определены дополнительные хэш-алгоритмы, но в настоящей версии используются только MD5 и SHA-1.
В алгоритме определена функция, которая расширяет секрет до нужной длины для создания всех необходимых ключей. Такая псевдослучайная функция, PRF, получает в качестве входа секрет, "зерно" (seed – значение, которое с одной стороны является случайным, а с другой стороны не является секретным, т.е. может стать известно оппоненту) и идентификационную метку, и создает выход требуемой длины.
Для того чтобы сделать PRF как можно более безопасной, используются два безопасных хэш-алгоритма.
Во-первых, определяется функция расширения данных P_hash (secret, data), которая применяет единственную хэш-функцию для расширения секрета и "зерна":
P_hash (secret, seed) = HMAC_hash (secret, A(1) + seed) + HMAC_hash (secret, A(2) + seed) + HMAC_hash (secret, A(3) + seed) + ...
Где
+ – обозначает конкатенацию.
А () – определяется следующим образом:
А (0) = seed
A (i) = HMAC_hash (secret, A (i – 1))
P_hash может иметь столько итераций, сколько необходимо для создания требуемого количества данных. Например, если P_SHA-1 используется для создания 64 байтов данных, то количество итераций должно быть равно 4, при этом будет создано 80 байтов данных; последние 16 байтов заключительной итерации будут отброшены, чтобы оставить только 64 байта выходных данных.
PRF создается путем расщепления секрета на две половины, одна половина используется для создания данных с помощью P_MD5, а другая – для создания данных с помощью P_SHA-1, после чего оба выхода этих функций складываются по модулю 2.
PRF определяется как результат сложения по модулю 2 этих двух псевдослучайных значений.
PRF (secret, label, seed) = P_MD5 (S1, label + seed)
P_SHA-1 (S2, label + seed);
Label является фиксированной текстовой строкой.
Заметим, что поскольку MD5 создает 16-байтные значения, а SHA-1 создает 20-байтные значения, то границы внутренних итераций не будут совпадать. Например, для создания 80-байтного значения необходимо выполнить 5 итераций P_MD5 и 4 итерации P_SHA-1.