512-битный хеш против 4-х 128-х хэш-хэшей

110
14

Интересно, что я не нашел достаточной информации о любом испытании или эксперименте с шансами столкновения одиночного 512-битного хэша, такого как whirlpool, против конкатенации 4-х 128-х хэшей, таких как md5, sha1 и т.д.


Возможность появления 4-х 128-х хэшей кажутся менее вероятными, чем одиночный 512-битный хеш, когда данные, на которых выполняется хеширование, имеют значительно малый размер, просто на среднем 100 символов.


Но это просто очевидное предположение без основания, потому что я не проводил никаких испытаний. Что вы думаете об этом?


Изменить
512bit хэш против 128-битного хэша. 128-битный хеш. 128-битный хеш. 128-битный хэш (4 128-х хэш-хэш-код)


Edit2
Я хочу использовать хэш для этого индекса по URL-адресу или хешированию с учетом ОЗУ
и цель состоит в том, чтобы свести к минимуму вероятность столкновения, потому что я хочу установить столбец hash как уникальный вместо столбца URL.


Edit3
Обратите внимание, что цель этого вопроса - найти способ минимизировать вероятность столкновения. Сказав это, почему мне нужно больше сосредоточиться на минимизации возможности столкновения? Вот мое описание Edit2, которое приводит к поиску решения для использования меньше ОЗУ. Таким образом, интересы сводятся к минимуму столкновения и снижению использования ОЗУ. Но основным направлением этого вопроса является снижение вероятности столкновения.

спросил(а) 2021-01-19T16:00:52+03:00 6 месяцев назад
1
Решение
118

Похоже, вы хотите сравнить поведение столкновения:


hash512(x)

с поведением столкновения:


hash128_a(x) . hash128_b(x) . hash128_c(x) . hash128_d(x)

где "." обозначает конкатенацию, а hash128_a, hash128_b и т.д. - это четыре разных 128-битных алгоритма хеширования.

Ответ: он полностью зависит от свойств отдельных хешей.


Рассмотрим, например, что 128-битные хэш-функции могут быть реализованы как:


uint128_t hash128_a(T x)   { return hash512(x)[  0:127]; }
uint128_t hash128_b(T x) { return hash512(x)[128:255]; }
uint128_t hash128_c(T x) { return hash512(x)[256:383]; }
uint128_t hash128_d(T x) { return hash512(x)[384:511]; }

В этом случае производительность будет идентичной.

ответил(а) 2021-01-19T16:00:52+03:00 6 месяцев назад
100

Классическая статья для чтения по этому вопросу связана с Hoch и Shamir. Он основывается на предыдущих открытиях, особенно Joux. Нижняя строка следующая: если вы берете четыре хеш-функции с 128-битным выходом, а четыре хэш-функции используют Merkle-Damgård, то найти столкновение для всего 512-битного вывода не сложнее, чем найти столкновение для одной из хеш-функций. MD5, SHA-1... используйте конструкцию MD.


С другой стороны, если некоторые из ваших хеш-функций используют определенную структуру, в частности, с более широким рабочим состоянием, конкатенация может дать более сильную функцию. См. Пример из @Oli: если все четыре функции SHA-512 с некоторой операцией на выходе, то конкатенированная хэш-функция может быть простой SHA-512.

Единственная уверенность в конкатенации четырех хэш-функций заключается в том, что результат будет не менее стойким к столкновению, чем самая сильная из четырех хеш-функций. Это использовалось в SSL/TLS, которое до версии 1.1 внутренне использует одновременно MD5 и SHA-1 в попытке противостоять разрывам на.

ответил(а) 2021-01-19T16:00:52+03:00 6 месяцев назад
90

512 бит - 512 бит. Единственное различие заключается в различии в несовершенствах в хешах. Лучший общий хеш - 512, используя наилучший доступный алгоритм.


Изменить, чтобы добавить пояснения, потому что он слишком длинный для комментария:


Идеальный хеш равномерно распределяет контент на x бит. Если у вас 4 (полностью независимых) х-бит хэша, который равномерно отображает файл на 4x бит; 4-х битный хэш по-прежнему равномерно отображает один и тот же файл на 4-х бит. 4x бит - 4x бит; до тех пор, пока он совершенно однородный, не имеет значения, исходит ли оно из одной (4x) хэш-функции или 4 (x). Тем не менее, никакой хеш не может быть полностью идеальным, поэтому вы хотите получить наиболее равномерное доступное распределение, и если вы используете 4 разных функции, только 1 может быть самым близким к оптимальному, так что у вас есть x оптимальных битов и 3x субоптимальных, тогда как один алгоритм может охватывать все 4x-пространство с наиболее оптимальным распределением.


Я полагаю, что вполне возможно, что достаточно большие алгоритмы могут иметь подмножества бит, которые будут более равномерно распределены, чем один 512, и могут быть объединены для получения большей однородности, но похоже, что это было бы большим дополнительным исследованием и реализацией для небольшой потенциальной выгоды.

ответил(а) 2021-01-19T16:00:52+03:00 6 месяцев назад
78

Если вы сравниваете объединение четырех разных "идеальных" 128-битных алгоритмов хэширования с одним идеальным алгоритмом хэширования 512 бит, тогда да, оба метода позволят вам получить ту же вероятность столкновения. Используя md5, было бы легче взломать хэш. Если злоумышленник, например, знал, что вы делаете md5 + md5 w/salt + md5 с другой солью... тогда это было бы гораздо легче взломать как атаку столкновения md5. Посмотрите здесь для получения дополнительной информации о хэш-функциях, которые имели известные атаки.

ответил(а) 2021-01-19T16:00:52+03:00 6 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема