Создание HMAC для шифрования PHP

0

Я просто смотрел на добавление HMAC к шифрованию PHP mcrypt.

Это просто хэширование зашифрованных данных с помощью hash_hmac с использованием ключа шифрования и добавление его к зашифрованным данным? Затем при расшифровке вы отделили HMAC, hash_hmac остальную часть данных с помощью ключа снова и проверьте, соответствует ли он HMAC.

Я смущен, потому что в этом вопросе SO. При аутентификации зашифрованных текстов, что должно быть HMACed? он говорит:

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

Это так? Если это так, почему недостаточно использовать hash_hmac только для зашифрованных данных?

Теги:
encryption

1 ответ

2
Лучший ответ

Короткий ответ: Да

Длительный ответ:

HMAC - это код аутентификации сообщения на основе Hash. Вы должны HMAC что-либо, что вы хотите аутентифицировать, или, другими словами, все, что вы хотите защитить от модификации.

Хотя стандарт RFC является более сложным, может иметь смысл думать о HMAC как о соленом хеше.

например hmac (message, key) = hash (сообщение + клавиша)

  1. Вы можете только воссоздать тот же HMAC с одинаковым сообщением и ключом.
  2. Вы не можете воссоздать один и тот же hmac, если ключ идентичен, но сообщение отличается.
  3. Вы не можете воссоздать один и тот же hmac, если сообщение идентично, но ключ отличается.

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

В вашей цитате, плакат говорит IV, и алгоритм также должен быть хэширован. Рассмотрим формат файла/базы данных, состоящий из

ALGORITHM + IV + CIPHERTEXT + HMAC

Если вы только HMAC зашифрованный текст, злоумышленник сможет модифицировать алгоритм или IV (развращать файл), не влияя на действительность HMAC. Это плохо, потому что вы можете получить поврежденный зашифрованный файл с допустимым HMAC. Расшифровка будет продолжаться как обычно, потому что ваше программное обеспечение будет думать, что все в порядке. Результатом является полностью искаженное дешифрование, но дело в том, что ваше программное обеспечение нарушено, потому что оно вернуло неправильный вывод при расшифровке и не выдавало никаких ошибок. Это можно классифицировать как "риск безопасности", если ваше приложение пытается что-то сделать с этими ошибочными данными, поскольку оно предполагает, что оно правильно. Это не риск для безопасности в том смысле, что он делает базовое шифрование слабее или легче взломать. HMAC и симметричное шифрование - это две совершенно разные технологии, которые делают разные вещи. Точка использования HMAC заключается в том, что вы можете предположить, что уровень дешифрования возвращает данные, которые на 100% правильны.

В приведенном выше примере ALGORITHM представляет собой динамическую часть данных, которую я использовал для объяснения "гибкости алгоритма" в цитате OP. Он определяет, какой алгоритм шифрования использовался. Дело в том, что оно динамическое, поэтому его нужно читать откуда-то, а не жестко. Этот факт делает его зависимым от расшифровки, поэтому он должен быть включен в сообщение HMAC. Однако, если вы всегда используете какой-либо статический алгоритм, тогда его необходимо принять (с помощью жесткого кодирования) вашего кода дешифрования, и нет необходимости хранить эти данные в любом случае. Нет необходимости включать статические данные в сообщение HMAC, поскольку оно не влияет на расшифровку.

Примером формата файла, который использует статический алгоритм, является формат файла AES-256 Crypt с открытым исходным кодом. Алгоритм согласован, поэтому он всегда принимается. Фактически он использует 2 HMAC для скорости. 1 для аутентификации IV и ключей, а второй для аутентификации зашифрованной части данных.

  • 0
    Тем не менее можно проверить, было ли расшифрование успешным, если библиотека шифрования проверяет все байты заполнения. Если в заполнении есть хотя бы одна ошибка, он может выдать исключение или что-то в этом роде. HMAC предотвращает дешифрование, если оно повреждено.
  • 0
    В зависимости от используемого дополнения, проверка подлинности путем проверки правильности дополнения почти всегда менее надежна, чем при использовании hmac. Это может случайно создать допустимое дополнение случайно даже с плохой расшифровкой.
Показать ещё 8 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню