Аутентификация сообщений с помощью HMAC в криптографии

LinuxBeginner
Практиковаться сейчас

Введение

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

Здесь на помощь приходит HMAC (Hash-based Message Authentication Code — Код аутентификации сообщения на основе хеша). HMAC — это особый тип MAC (Message Authentication Code), который объединяет криптографическую хеш-функцию (например, SHA-256) с секретным ключом. Только стороны, владеющие секретным ключом, могут генерировать и проверять HMAC для данного сообщения. Этот процесс обеспечивает как целостность данных, так и их аутентичность.

В этой лабораторной работе вы получите практический опыт работы с HMAC. Вы начнете с понимания концепции, затем используете мощный инструмент командной строки openssl для генерации ключей и вычисления HMAC. Наконец, вы увидите, как реализовать HMAC в скрипте Python, что является распространенной задачей при разработке приложений.

Введение в HMAC

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

Стандартная хеш-функция, такая как SHA-256, принимает входное сообщение и генерирует строку символов фиксированного размера, известную как хеш или дайджест. Если изменится хотя бы один бит сообщения, результирующий хеш будет совершенно другим. Это отлично подходит для проверки целостности данных. Однако это не обеспечивает аутентичности. Если злоумышленник перехватит и изменит сообщение, он может просто вычислить новый хеш для измененного сообщения и отправить его вместе с ним. У получателя не будет способа узнать, что сообщение было изменено.

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

Процесс HMAC работает примерно следующим образом:

  1. Отправитель объединяет секретный ключ с сообщением.
  2. К этому сочетанию применяется хеш-функция (например, SHA-256).
  3. Полученный хеш, который теперь называется HMAC, отправляется вместе с исходным сообщением.

Когда получатель получает сообщение и HMAC, он выполняет тот же расчет, используя свою копию секретного ключа.

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

Этот шаг является чисто концептуальным. В следующих шагах вы примените эту теорию на практике.

Генерация секретного ключа HMAC

На этом шаге вы сгенерируете безопасный случайный секретный ключ, который является основой безопасности HMAC. Предсказуемый ключ позволил бы злоумышленнику подделать HMAC. Мы будем использовать утилиту openssl — универсальную утилиту командной строки для криптографии.

Мы будем использовать команду openssl rand для генерации случайных данных.

  • -hex: Этот параметр указывает openssl выводить случайные данные в виде шестнадцатеричной строки.
  • 32: Этот параметр указывает количество генерируемых случайных байтов. 32 байта эквивалентны 256 битам, что является надежной и часто используемой длиной ключа, особенно в сочетании с алгоритмом хеширования SHA-256.

Чтобы ключ было легко использовать в последующих командах, мы сгенерируем его и сохраним в переменной окружения с именем HMAC_KEY. Выполните следующую команду в вашем терминале:

export HMAC_KEY=$(openssl rand -hex 32)

Эта команда выполняет openssl rand -hex 32, и ее вывод (шестнадцатеричный ключ) захватывается и присваивается переменной HMAC_KEY.

Вы можете просмотреть только что сгенерированный ключ с помощью команды echo:

echo $HMAC_KEY

Вы должны увидеть длинную строку шестнадцатеричных символов. Ваш ключ будет уникальным.

0db348c78473ce8460416f875cd87239d0f5f66fbe5103ba4b5c84cf2cd76914

Теперь, когда у вас есть секретный ключ, вы готовы создать HMAC.

Вычисление HMAC-SHA256

На этом шаге вы вычислите HMAC для тестового сообщения, используя сгенерированный вами ключ. Сначала создадим файл, содержащий наше сообщение.

Мы будем использовать команду echo для создания файла с именем message.txt. Флаг -n важен, поскольку он предотвращает добавление символа новой строки в конец строки командой echo, что изменило бы содержимое и, следовательно, итоговый HMAC.

echo -n "This is a secret message." > message.txt

Теперь, имея сообщение и ключ, мы можем вычислить HMAC. Мы будем использовать команду openssl dgst, которая используется для вычисления дайджестов сообщений (хешей).

  • -sha256: Указывает, что мы хотим использовать алгоритм хеширования SHA-256.
  • -mac hmac: Указывает, что мы хотим вычислить Код Аутентификации Сообщения (MAC) с использованием метода HMAC.
  • -macopt hexkey:$HMAC_KEY: Это предоставляет опции для алгоритма MAC. Здесь мы указываем, что наш ключ находится в шестнадцатеричном формате (hexkey), и передаем сам ключ с помощью переменной окружения $HMAC_KEY, которую мы создали ранее.
  • message.txt: Входной файл, содержащий данные, которые необходимо аутентифицировать.

Выполните следующую команду для генерации HMAC:

openssl dgst -sha256 -mac hmac -macopt hexkey:$HMAC_KEY message.txt

Вывод будет представлять собой дайджест HMAC для вашего сообщения, вычисленный с использованием вашего секретного ключа. Формат вывода покажет используемый алгоритм и полученное значение HMAC.

HMAC-SHA2-256(message.txt)= 214fbb56f716dfe1c2f4a60615a5b901b263fd74c9678b2aef4f01779b34dea8

Это значение HMAC — то, что вы отправите вместе с вашим сообщением получателю, у которого также есть секретный ключ.

Проверка целостности HMAC

На этом шаге вы увидите процесс проверки HMAC в действии. Вы увидите, как использование правильного ключа приводит к успеху, в то время как использование неправильного ключа или измененного сообщения приводит к сбою.

Проверка с правильным ключом

Проверка — это не специальная команда; это просто действие, при котором получатель повторно вычисляет HMAC самостоятельно и сравнивает его с полученным. Если вы снова выполните команду из предыдущего шага, вы получите абсолютно то же самое значение HMAC. Это подтверждает, что пока ключ и сообщение не изменены, HMAC остается согласованным.

Наблюдение сбоя с неправильным ключом

Теперь давайте смоделируем атаку или неправильную конфигурацию, попытавшись проверить сообщение с другим ключом. Сначала сгенерируем новый, "неправильный" ключ:

export WRONG_KEY=$(openssl rand -hex 32)

Теперь попробуйте вычислить HMAC для исходного message.txt, но используя этот WRONG_KEY:

openssl dgst -sha256 -mac hmac -macopt hexkey:$WRONG_KEY message.txt

В выводе вы увидите новое значение HMAC:

HMAC-SHA2-256(message.txt)= 781729497e89f3f9cb1d8c7ab632e22753062ac39cd64de0e5b81a45de245d78

Обратите внимание, что этот HMAC совершенно отличается от того, который вы сгенерировали с помощью правильного $HMAC_KEY. Это демонстрирует, что без правильного секретного ключа невозможно создать действительный HMAC для сообщения, тем самым обеспечивая аутентичность.

Наблюдение сбоя с измененным сообщением

Давайте также посмотрим, что произойдет, если само сообщение будет изменено. Мы немного изменим message.txt:

echo -n "This is a tampered message." > message.txt

Теперь снова вычислим HMAC, используя исходный, правильный ключ ($HMAC_KEY):

openssl dgst -sha256 -mac hmac -macopt hexkey:$HMAC_KEY message.txt

Опять же, вы получите совершенно другое значение HMAC. Это доказывает, что любое изменение сообщения, каким бы незначительным оно ни было, будет обнаружено, тем самым обеспечивая целостность.

Реализация HMAC на Python

На этом шаге вы узнаете, как программно выполнять операции HMAC с помощью Python. Это распространенное требование в веб-приложениях, API и другом программном обеспечении, которому необходимо обеспечить безопасность сообщений. Стандартная библиотека Python предоставляет для этой цели модули hmac и hashlib.

Мы напишем простой Python-скрипт для вычисления HMAC-SHA256 сообщения. Сначала откройте файл hmac_example.py с помощью текстового редактора nano:

nano hmac_example.py

Теперь скопируйте и вставьте следующий код Python в редактор nano. Этот код импортирует необходимые библиотеки, определяет ключ и сообщение, а затем вычисляет и выводит HMAC.

Примечание: В этом примере ключ и сообщение "зашиты" в код (hardcoded). В реальном приложении ключ должен извлекаться из безопасного хранилища. И ключ, и сообщение должны быть байтовыми строками, поэтому мы предваряем их префиксом b.

import hmac
import hashlib

## Секретный ключ (должен быть в байтах)
## В реальном приложении получите его из безопасного места
key = b'\x0d\xb3\x48\xc7\x84\x73\xce\x84\x60\x41\x6f\x87\x5c\xd8\x72\x39\xd0\xf5\xf6\x6f\xbe\x51\x03\xba\x4b\x5c\x84\xcf\x2c\xd7\x69\x14'

## Сообщение для аутентификации (должно быть в байтах)
message = b'This is a secret message.'

## 1. Создание нового объекта HMAC
##    - Передача ключа
##    - Передача сообщения
##    - Указание алгоритма хеширования (из hashlib)
h = hmac.new(key, message, hashlib.sha256)

## 2. Получение дайджеста в шестнадцатеричном формате
hex_digest = h.hexdigest()

print("HMAC Digest:")
print(hex_digest)

После вставки кода сохраните файл и выйдите из nano, нажав Ctrl+O, затем Enter для подтверждения имени файла и, наконец, Ctrl+X для выхода.

Теперь запустите ваш Python-скрипт из терминала:

python3 hmac_example.py

Скрипт выполнится и выведет вычисленный дайджест HMAC.

HMAC Digest:
214fbb56f716dfe1c2f4a60615a5b901b263fd74c9678b2aef4f01779b34dea8

Теперь вы успешно реализовали генерацию HMAC в Python — навык, который напрямую применим при создании безопасного программного обеспечения.

Резюме

В этой лабораторной работе вы получили практический опыт работы с кодами аутентификации сообщений на основе хеша (HMAC), которые являются краеугольным камнем современной криптографии для обеспечения целостности и подлинности данных.

Вы узнали, что:

  • HMAC объединяет криптографическую хеш-функцию с секретным ключом для создания кода аутентификации сообщения.
  • Только стороны, владеющие секретным ключом, могут генерировать или проверять HMAC, что предотвращает несанкционированное изменение и подделку.
  • Инструмент командной строки openssl является мощным средством для выполнения криптографических операций, включая генерацию случайных ключей (openssl rand) и вычисление HMAC (openssl dgst).
  • Любое изменение сообщения или использование неправильного ключа приведет к получению совершенно другого значения HMAC, что позволяет легко обнаружить подделку.
  • Python предоставляет библиотеки hmac и hashlib для простой интеграции функциональности HMAC в ваши приложения.

Освоив HMAC, вы сделали важный шаг к созданию более безопасных и надежных систем.