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

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

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

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

Редактировать - это похоже на хэш 512 бит против 128 бит. 128-битный хеш. 128-битный хеш. 128-битный хэш (4 хэша по 128 битов объединены)

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

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


person Rick James    schedule 13.09.2011    source источник
comment
Какой здесь конкретный вопрос? (Что вы думаете по этому поводу? Это не конкретный вопрос.)   -  person Oliver Charlesworth    schedule 14.09.2011
comment
Что точно вы сравниваете?   -  person Oliver Charlesworth    schedule 14.09.2011
comment
[@Oil Charlesworth] Конкретный вопрос заключается в том, какова вероятность одновременного столкновения 512-битных хеш-кодов с 4 128-битными конкатенированными хешами.   -  person Rick James    schedule 14.09.2011
comment
Итак, вы сравниваете поведение столкновения hash512(x) с поведением столкновения hash128_a(x) . hash128_b(x) . hash128_c(x) . hash128_d(x)? (где . обозначает конкатенацию)   -  person Oliver Charlesworth    schedule 14.09.2011
comment
Да, верно. :) В своем вопросе я уже упоминал о конкатенации 4 хэшей по 128 бит.   -  person Rick James    schedule 14.09.2011
comment
Из вашего комментария в ответе вы беспокоитесь о конфликтах в смысле hastables, таких как те, которые используются в структурах данных, или конфликтах в смысле хеш-защиты некоторых данных, чтобы узнать, изменил ли кто-то их?   -  person woliveirajr    schedule 15.09.2011
comment
@woliveirajr абсолютно прав. Я также добавил ссылку на другие вопросы, в которых есть все подробности использования хешей.   -  person Rick James    schedule 15.09.2011
comment
@Rick: было бы проще, если бы вы указали свою проблему с самого начала. Я удалю свой ответ здесь, так как ваш настоящий интерес не в конфликтах хешей, а в том, как лучше представить какой-либо URL, используя меньше места. Я отвечу об этом в нужном месте (исходный вопрос).   -  person woliveirajr    schedule 15.09.2011
comment
@woliveirajr ваш пост полезен, пожалуйста, не удаляйте его. И интерес заключается как в использовании меньшего пространства, так и в предотвращении столкновений. Поэтому у меня разные вопросы, связанные с разными интересами. Но я сослался на этот вопрос здесь, чтобы добавить перспективу вопроса. Здесь главный интерес - избежать столкновения.   -  person Rick James    schedule 15.09.2011
comment
Если все, что вы хотите сделать, это минимизировать коллизии, без злоумышленника, 128 бит уже достаточно. Столкновение здесь настолько невероятно маловероятно, что использование более длинного хэша - это просто пустая трата места.   -  person Nick Johnson    schedule 16.09.2011


Ответы (4)


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

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]; }

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

person Oliver Charlesworth    schedule 14.09.2011
comment
Точно, я ищу коллизионное поведение. Но мне интересно знать, насколько вероятно, что все 4 128-битных хэша будут одинаковыми для любого значения дважды, чем один 512-битный, чтобы появиться дважды. Я много искал, но не нашел никакой реальной информации, основанной на рассуждениях или экспериментах. - person Rick James; 14.09.2011
comment
@Rick: Как я уже сказал, это зависит от хэш-функций. - person Oliver Charlesworth; 14.09.2011

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

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

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

person Thomas Pornin    schedule 14.09.2011
comment
Вы указали очень веское довод в пользу того, что конкатенированный хэш будет не менее устойчивым к коллизиям, чем самая сильная из четырех хеш-функций. Не могли бы вы рассказать немного о том, как 4 хэша SHA-512 с некоторой операцией на выходе, затем сжатые до одного 512-битного хэша SHA-512, будут лучше, чем 4 128-битных хэша? - person Rick James; 14.09.2011
comment
Четыре усеченных SHA-512 из @Oli при объединении действительно являются SHA-512 (те же результаты для того же ввода). Считается, что SHA-512 предлагает лучшую безопасность, на которую вы можете надеяться с 512-битным выходом (то есть устойчивость к столкновениям до 2 ^ 256 усилий). Некоторые другие конкатенации не подойдут; подробности см. в статье Хох-Шамира (здесь задействована некоторая математика, но вопрос на самом деле исследовательский). - person Thomas Pornin; 14.09.2011
comment
Этот. Легко предположить, что использование нескольких различных хэшей повысит вашу безопасность, но это не так. Это довольно неочевидный и важный результат. - person Nick Johnson; 15.09.2011

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

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

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

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

person Kevin    schedule 13.09.2011
comment
Какова причина этого ответа? И почему, с вашей точки зрения, у 4 128 конкатенированных хэшей больше шансов столкнуться одновременно? При этом нужно учитывать, что выборка данных невелика .. - person Rick James; 14.09.2011
comment
Если в оптимальном 512-битном хеш-коде вдруг обнаруживаются уязвимости, которые приводят к коллизии за меньшее количество шагов, проблемы возникают со всем хешем. Если у вас 4 х 128 хешей, и у одного есть vuln. в нем вы получите хэш 3x 128 бит ... - person woliveirajr; 15.09.2011

Если вы сравниваете конкатенацию четырех различных «идеальных» 128-битных алгоритмов хеширования с одним идеальным 512-битным алгоритмом хеширования, то да, оба метода дадут вам одинаковую вероятность коллизии. Однако использование md5 упростит взлом хеша. Если бы злоумышленник, например, знал, что вы выполняете md5 + md5 с солью + md5 с другой солью ... тогда это было бы намного легче взломать, как атаку столкновения md5. См. здесь для получения дополнительной информации о хэш-функциях, которые подверглись известным атакам.

person Craig    schedule 13.09.2011
comment
Что ж, это не подвержено хакерам, потому что это хэши, которые делают индекс MySQL короче и быстрее ищут. - person Rick James; 14.09.2011
comment
@Rick Тогда почему вы вообще используете 512-битный хеш? Без противников 128 бит должно быть достаточно. - person Nick Johnson; 15.09.2011
comment
@Nick Я обновил вопрос, включив в него цель рассмотрения хешей. - person Rick James; 15.09.2011