Коды аутентификации сообщений (MAC, Message Authentication Code) используются для проверки целостности и подлинности данных в криптографических системах. Их задача — гарантировать, что сообщение не было изменено в процессе передачи и действительно создано отправителем, обладающим секретным ключом.
MAC представляет собой короткую строку фиксированной длины, вычисляемую из сообщения и секретного ключа:
M и секретный ключ KT = MAC(K, M)Получатель, имеющий тот же ключ, может повторно вычислить MAC и сравнить его с полученным значением. Если значения совпадают, сообщение считается подлинным и неизменённым.
Ключевая особенность MAC — зависимость от секретного ключа. В отличие от хэш-функций, которые являются публичными, MAC невозможно корректно вычислить без знания ключа.
Хэш-функции и MAC часто путают, поскольку обе операции превращают входные данные в фиксированную строку. Однако их назначение различается:
Хэш можно вычислить любому пользователю, MAC — только владельцу ключа.
Качественная MAC-функция должна обладать следующими свойствами:
Устойчивость к подделке (unforgeability) без знания ключа невозможно создать корректный MAC для нового сообщения
чувствительность к изменениям входа даже минимальное изменение сообщения должно полностью менять MAC
вычислительная эффективность алгоритм должен быть достаточно быстрым для практического использования
отсутствие коллизий в практическом смысле найти два сообщения с одинаковым MAC должно быть вычислительно невозможно без ключа
Наиболее распространённый тип MAC основан на криптографических хэш-функциях.
Структурно HMAC выглядит как:
HMAC(K, M) = H((K ⊕ opad) || H((K ⊕ ipad) || M))
где:
H — криптографическая хэш-функция (например
SHA-256)K — секретный ключM — сообщение⊕ — побитовое XORipad, opad — фиксированные константыHMAC считается устойчивым даже при использовании небезопасных свойств базовой хэш-функции, если она сохраняет определённую стойкость к коллизиям.
Основан на блочных шифрах (например AES). В отличие от HMAC:
Криптоанализ MAC направлен на попытку подделки сообщений или восстановления ключа. Основные типы атак:
атака подбора ключа (brute force) перебор возможных ключей до нахождения корректного MAC
атака на расширение сообщения (length extension attack) актуальна для простых хэш-функций, но предотвращается в HMAC
выборочно-адаптивные атаки злоумышленник анализирует MAC для множества сообщений
HMAC специально разработан так, чтобы быть устойчивым к этим классам атак при корректной реализации.
В библиотеке SJCL (Stanford JavaScript Crypto Library) реализация MAC основана на HMAC с различными хэш-функциями (например SHA-256, SHA-1).
Типичный процесс использования:
var sjcl = require('sjcl');
// секретный ключ
var key = sjcl.codec.utf8String.toBits("secret_key");
// сообщение
var message = sjcl.codec.utf8String.toBits("important data");
// создание HMAC на основе SHA-256
var hmac = new sjcl.misc.hmac(key, sjcl.hash.sha256);
// вычисление MAC
var mac = hmac.encrypt(message);
// вывод результата в hex
console.log(sjcl.codec.hex.fromBits(mac));
Проверка выполняется путём повторного вычисления MAC:
var receivedMac = mac; // полученный MAC
var recomputedMac = hmac.encrypt(message);
if (sjcl.bitArray.equal(receivedMac, recomputedMac)) {
console.log("Сообщение подлинное");
} else {
console.log("Нарушена целостность или подделка");
}
MAC используется в:
Основная цель — предотвратить незаметную модификацию данных и обеспечить доверие между сторонами без необходимости асимметричной криптографии на каждом этапе.
Несмотря на высокую надёжность, MAC не решает всех задач безопасности:
Поэтому MAC часто используется совместно с другими криптографическими механизмами, такими как цифровые подписи и протоколы обмена ключами.