#cryptography #hash
#криптография #хэш
Вопрос:
Дайджест сообщения используется для проверки того, что сообщение является предназначенным.
На сколько объединение дайджеста хэша с содержимым для формирования сообщения увеличит сложность атак на сообщение с использованием коллизий и прообразов?
Например, для кодирования:
message = data . hash1(data)
message_hash = hash2(message)
Для проверки сообщения с помощью message_hash:
check(hash2(message) == message_hash)
data = message[:-digest_size]
check(hash1(data) == message[-digest_size:])
hash1
и hash2
могут быть совершенно разные типы хэш-функций.
Я аргументировал это тем, что любая атака должна была бы нарушить обе хэш-функции — подделка внешнего дайджеста потребовала бы создания сообщения с допустимым внутренним хэшем.
Ответ №1:
Если внешний алгоритм хэширования нарушен, внутренний хэш может помочь, но вы должны учитывать, насколько вероятен такой сценарий при использовании хорошо зарекомендовавшего себя алгоритма.
Если внешний хэш настолько мал, что возможна атака методом перебора, внутренний хэш вообще не сильно поможет. Вместо поиска сообщения с тем же хэшем злоумышленнику пришлось бы найти сообщение плюс внутренний хэш с тем же внешним хэшем, что в значительной степени равнозначно одному и тому же.
Поэтому сделайте хэш как можно большим и сосредоточьтесь на том, чтобы убедиться, что в остальной части вашей системы нет лазеек. 64 бита, вероятно, вполне подойдут, если вы не ожидаете, что правительство или крупная корпорация проявят интерес к взлому вашего хэша.
Ответ №2:
Ваше предложение чем-то напоминает мне HMAC. Это конструкция, которая позволяет создавать коды аутентификации сообщений, хэши с ключами, если хотите.
Однако я не вижу смысла использовать 2 хэш-функции. Выберите один из стандартных дайджестов, которые до сих пор противостояли атакам, и действуйте с ним. Если вы предполагаете, что один из них будет взломан, зачем вообще его использовать? SHA-2 или любой из последних кандидатов на конкурс SHA3 должен подойти, если вы хотите надежную защиту, больше информации здесь:http://ehash.iaik.tugraz.at/wiki/The_SHA-3_Zoo.
Комментарии:
1. У меня есть ограничение на внешний дайджест — он должен быть как можно меньше. Я подумал, что, возможно, эта идея компенсирует снижение надежности.
2. Размер вашего дайджеста фиксируется используемой вами хэш-функцией. Однако, когда вы создаете хэши с помощью симметричного примитива (т. Е. не с помощью асимметричного шифрования), вы можете выполнить усечение хэша: просто возьмите последние
n
биты. На стороне получателя сделайте то же самое и посмотрите, совпадают ли ваши результаты. Конечно, это снижает надежность вашего дайджеста хэша.
Ответ №3:
В некоторых ситуациях внутренний хэш может усложнить задачу злоумышленнику, но не обязательно. Например, если вы используете MD5 для обеих хэш-функций, то коллизия для внутреннего хэша также будет подразумевать коллизию для внешнего хэша, учитывая повторяющуюся структуру MD5.
Таким образом, добавление внутренней хэш-функции не обязательно повысит устойчивость к коллизиям и прообразам. С чисто теоретической точки зрения это может фактически снизить сопротивление, хотя это довольно маловероятно, особенно если хэш-функции безопасны (но если функции безопасны, то построение бессмысленно). На более практическом уровне это двойное хеширование увеличивает вычислительную нагрузку (больше процессора и, возможно, больше кода — следовательно, больше использование кэша L1 — если две функции не совпадают). Поэтому мой совет был бы не делать этого. Вместо этого используйте единственную «считающуюся безопасной» хеш-функцию, такую как SHA-256. Хэш-функция не будет самым большим недостатком вашего приложения (или, точнее, если хэш-функция является самым большим недостатком вашего приложения, то вы бог программирования и / или Дональд Кнут).
В качестве иллюстрации, SSL / TLS использует MD5 и SHA-1 одновременно в попытке противостоять слабостям любой из двух функций. Но более новая версия TLS 1.2 переключается только на SHA-256.