Если вы пользуетесь криптографией: все это устарело. В наши дни нет причин сочетать MAC или хэш с шифрованием. Используйте стандарт AEAD алгоритм, который сочетает в себе защиту конфиденциальности и подлинности способом, проверенным криптографами. Он может использовать MAC-затем-шифрование, шифрование-затем-MAC или шифрование-и-MAC под капотом или что-то, что не вписывается ни в одну из этих трех схем, но вам не нужно заботиться.
Если вы разработчик криптографических примитивов: все это потенциальные способы обеспечения шифрования с проверкой подлинности. Аутентифицированное шифрование сообщения гарантирует два свойства: конфиденциальность (только объекты, у которых есть секретный ключ, могут восстановить сообщение из зашифрованного текста) и подлинность (только объекты, у которых есть секретный ключ, могут создать действительный зашифрованный текст).
MAC гарантирует подлинность. Шифрование гарантирует конфиденциальность при определенных условиях (например, шифрование без аутентификации может быть уязвимо для атак оракула). заполнение атак оракула против популярного режима CBC). Вы можете комбинировать примитив MAC М
с примитивом шифрования Е
в сообщении м
разными способами (||
это конкатенация):
Э(М) || М (Е (м))
: зашифровать-затем-MAC. Зашифруйте сообщение и добавьте MAC-адрес шифрования.
Е(м || М(м))
: MAC-затем шифровать. Добавьте MAC-адрес сообщения к сообщению и зашифруйте результат.
Э(М) || М (м)
: зашифровать-и-MAC. Зашифруйте сообщение и добавьте MAC-адрес исходного сообщения.
Можно получить каждый из них правильно. Также возможно ошибиться в каждом из них. Обзор преимуществ и недостатков каждого подхода см. Должны ли мы «MAC-затем-шифровать» или «зашифровать-затем-MAC»?
Hash-then-encrypt — это то же самое, что и MAC-then-encrypt, за исключением того, что вместо MAC-адреса используется хеш-функция: Е(М || Н(ч))
. Это имеет хорошие шансы гарантировать конфиденциальность, поскольку все зашифровано. Аутентичность более хрупкая: она полагается на то, что злоумышленник не сможет зашифровать хэш. Я не знаю рабочей конструкции, использующей этот фреймворк, но вполне возможно, что она существует.
Бонусный вопрос: почему бы не зашифровать-затем-хешировать или зашифровать-и-хешировать?
Они не могут работать. Шифровать, затем хешировать (Е(м) || Н (Е (м))
) позволяет любому подделывать произвольные сообщения, просто создавая зашифрованный текст и добавляя его хэш. (И злоумышленник может даже знать содержание сообщения; например, усечение зашифрованного текста часто соответствует усечению сообщения, поэтому злоумышленник может свободно усекать существующее сообщение.) Шифрование и хеширование (Е(м) || Н(м)
) раскрывает хэш сообщения, так что любой может хотя бы предположить, что это за сообщение, и проверить свою догадку.