Теория MAC и его назначение

Коды аутентификации сообщений (MAC, Message Authentication Code) используются для проверки целостности и подлинности данных в криптографических системах. Их задача — гарантировать, что сообщение не было изменено в процессе передачи и действительно создано отправителем, обладающим секретным ключом.

MAC представляет собой короткую строку фиксированной длины, вычисляемую из сообщения и секретного ключа:

  • вход: сообщение M и секретный ключ K
  • выход: значение T = MAC(K, M)

Получатель, имеющий тот же ключ, может повторно вычислить MAC и сравнить его с полученным значением. Если значения совпадают, сообщение считается подлинным и неизменённым.

Ключевая особенность MAC — зависимость от секретного ключа. В отличие от хэш-функций, которые являются публичными, MAC невозможно корректно вычислить без знания ключа.


Отличие MAC от хэш-функций

Хэш-функции и MAC часто путают, поскольку обе операции превращают входные данные в фиксированную строку. Однако их назначение различается:

  • Хэш-функция: обеспечивает целостность данных без секретного ключа
  • MAC: обеспечивает целостность и аутентификацию с использованием секретного ключа

Хэш можно вычислить любому пользователю, MAC — только владельцу ключа.


Требования к MAC-функциям

Качественная MAC-функция должна обладать следующими свойствами:

  • Устойчивость к подделке (unforgeability) без знания ключа невозможно создать корректный MAC для нового сообщения

  • чувствительность к изменениям входа даже минимальное изменение сообщения должно полностью менять MAC

  • вычислительная эффективность алгоритм должен быть достаточно быстрым для практического использования

  • отсутствие коллизий в практическом смысле найти два сообщения с одинаковым MAC должно быть вычислительно невозможно без ключа


Типы MAC-алгоритмов

HMAC (Hash-based Message Authentication Code)

Наиболее распространённый тип MAC основан на криптографических хэш-функциях.

Структурно HMAC выглядит как:

HMAC(K, M) = H((K ⊕ opad) || H((K ⊕ ipad) || M))

где:

  • H — криптографическая хэш-функция (например SHA-256)
  • K — секретный ключ
  • M — сообщение
  • — побитовое XOR
  • ipad, opad — фиксированные константы

HMAC считается устойчивым даже при использовании небезопасных свойств базовой хэш-функции, если она сохраняет определённую стойкость к коллизиям.


CMAC (Cipher-based Message Authentication Code)

Основан на блочных шифрах (например AES). В отличие от HMAC:

  • использует симметричный шифр вместо хэш-функции
  • применяется в системах, где уже используется AES
  • обеспечивает хорошую производительность на аппаратном уровне

Угрозы и атаки на MAC

Криптоанализ MAC направлен на попытку подделки сообщений или восстановления ключа. Основные типы атак:

  • атака подбора ключа (brute force) перебор возможных ключей до нахождения корректного MAC

  • атака на расширение сообщения (length extension attack) актуальна для простых хэш-функций, но предотвращается в HMAC

  • выборочно-адаптивные атаки злоумышленник анализирует MAC для множества сообщений

HMAC специально разработан так, чтобы быть устойчивым к этим классам атак при корректной реализации.


MAC в контексте SJCL

В библиотеке SJCL (Stanford JavaScript Crypto Library) реализация MAC основана на HMAC с различными хэш-функциями (например SHA-256, SHA-1).

Типичный процесс использования:

  1. выбор хэш-функции
  2. создание ключа
  3. вычисление MAC для сообщения
  4. проверка MAC на стороне получателя

Пример использования HMAC в SJCL

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 используется в:

  • защищённых API-запросах
  • протоколах обмена сообщениями
  • системах авторизации
  • сетевых протоколах (TLS, SSH)
  • распределённых системах и блокчейн-подобных структурах

Основная цель — предотвратить незаметную модификацию данных и обеспечить доверие между сторонами без необходимости асимметричной криптографии на каждом этапе.


Ограничения MAC

Несмотря на высокую надёжность, MAC не решает всех задач безопасности:

  • не обеспечивает неотказуемость (отправитель может отрицать создание сообщения, так как ключ общий)
  • требует безопасного обмена ключами заранее
  • не защищает от компрометации конечной точки

Поэтому MAC часто используется совместно с другими криптографическими механизмами, такими как цифровые подписи и протоколы обмена ключами.