извините за длинный пост, у меня есть вопрос об общих криптографических алгоритмах хеширования, таких как семейство SHA, MD5 и т. Д.
В общем, такой алгоритм хеширования не может быть инъективным, поскольку фактический создаваемый дайджест обычно имеет фиксированную длину (например, 160 битов в SHA-1 и т. Д.), Тогда как пространство возможных сообщений, подлежащих дайджесту, практически бесконечно.
Однако, если мы сгенерируем дайджест сообщения, который не более, чем сгенерированный дайджест, каковы свойства обычно используемых алгоритмов хеширования? Могут ли они быть инъективными в этом ограниченном пространстве сообщений? Существуют ли алгоритмы, которые, как известно, создают коллизии даже для сообщений, длина битов которых меньше, чем длина битов создаваемого дайджеста?
Я на самом деле ищу алгоритм, который имеет это свойство, т.е. который, по крайней мере в принципе, может генерировать коллизирующие хэши даже для коротких входных сообщений.
Справочная информация: у нас есть плагин для браузера, который для каждого посещенного веб-сайта отправляет запрос на сервер, спрашивающий, принадлежит ли веб-сайт одному из наших известных партнеров. Но, конечно, мы не хотим шпионить за нашими пользователями. Итак, чтобы затруднить создание какой-либо истории просмотра, мы на самом деле не отправляем посещенный URL, а хеш-дайджест (в настоящее время SHA-1) какой-то очищенной версии. На стороне сервера у нас есть таблица хешей известных URI, которая сопоставляется с полученным хешем. Здесь мы можем жить с определенной степенью неопределенности, поскольку считаем, что мы не можем отслеживать наших пользователей как функции, а не как ошибки.
По понятным причинам эта схема довольно нечеткая и допускает ложные срабатывания, а также несоответствующие URI, которые должны иметь.
Итак, сейчас мы рассматриваем возможность изменения генерации отпечатка пальца на что-то, что имеет большую структуру, например, вместо хеширования полного (очищенного) URI, мы могли бы вместо этого:
- разделить имя хоста на компоненты в "." и хеши эти индивидуально
- проверить путь к компонентам в "." и хеши эти индивидуально
Объедините полученные хеши в значение отпечатка пальца. Пример: хэширование "www.apple.com/de/shop" с использованием этой схемы (и использование Adler 32 в качестве хэша) может привести к "46989670.104268307.41353536 / 19857610/73204162".
Однако, поскольку такой отпечаток имеет большую структуру (в частности, по сравнению с простым дайджестом SHA-1), мы могли бы случайно снова довольно легко вычислить фактический URI, посещенный пользователем (например, путем использование предварительно вычисленной таблицы значений хеш-функции для «общих» значений compont, таких как «www»).
Так что сейчас я ищу алгоритм хеширования / дайджеста, который имеет высокую частоту коллизий (серьезно рассматривается Adler 32) даже для коротких сообщений, так что вероятность уникальности хэша данного компонента низкая. Мы надеемся, что дополнительная структура, которую мы навязываем, предоставляет нам достаточно дополнительной информации, чтобы улучшить поведение сопоставления (то есть снизить частоту ложных срабатываний / ложных отрицаний).