Коллизии возникают при совпадении хеш-значений. Рассматриваются способы их обнаружения и алгоритмы предотвращения конфликтов.
Коллизия хеш-функции возникает, когда два различных входных значения, обозначим их как \( x \) и \( y \), дают одинаковое значение хеша:
\[ H(x)=H(y). \]
Это фундаментальное явление связано с ограничениями самой конструкции хеш-функций, которые принимают на вход данные переменной длины и возвращают фиксированную длину результата. Множество всех возможных входных данных превосходит множество всех возможных выходных значений. Следовательно, коллизии неизбежны для любой хеш-функции, принимающей вход переменной длины и возвращающей хеш постоянной длины (такой как MD5), поскольку хотя бы для одного значения хеш-функции соответствующее ему множество входных данных будет бесконечно — и любые два набора данных из этого множества образуют коллизию[1].
Для понимания механизма появления коллизий полезно рассмотреть простую функцию:
\[ H(x)=x\ {\bmod {\ }}19, \]
определённую на множестве целых чисел. Её область значений состоит из 19 элементов (кольца вычетов по модулю 19), а область определения — бесконечна[1]. Значение этой функции повторяется с периодом 19. Например, число 38 при вычислении дает хеш-сумму:
\[ H(38)=0. \]
Из-за периодичности функции все числа вида \( y + 19 \) будут иметь ту же хеш-сумму, что и \( y \). Так, числа 57 и 76 также отображаются в ноль:
\[ H(57)=0, \quad H(76)=0. \]
Пары чисел (38,57), (38,76) являются примерами коллизий, разных входов с одинаковым выходом[1]. Этот простой пример демонстрирует фундаментальную проблему: если значения вывода ограничены размером множества, а входы бесконечны, то коллизии не избежать.
В криптографических приложениях устойчивость к коллизиям является критическим параметром. Если злоумышленник может быстро найти пару различных сообщений с одинаковым хешем, это подрывает доверие к целостности данных и цифровой подписи[1]. Например, при использовании хеш-функции для создания цифровой подписи возможность генерации коллизий фактически означает возможность подделки подписи.
Криптостойкость определяется вычислительной сложностью нахождения таких коллизий. Идеальной считается ситуация, когда не существует способа отыскания коллизий более быстрого, чем полный перебор. Если существует алгоритм поиска коллизий существенно эффективнее полного перебора, то функция перестает считаться надежной и не должна использоваться для защиты секретной информации[1].
Для признания хеш-функции криптографически стойкой она должна удовлетворять трём ключевым свойствам:
Необратимость: Практически невозможно по заданному значению хеша \( m \) найти блок данных \( X \), такой что \(H(X)=m.\)
Стойкость к коллизиям первого рода: Для данного сообщения \( M \) практически невозможно подобрать другое сообщение \( N \), такое что \(H(N)=H(M).\)
Стойкость к коллизиям второго рода: Практически невозможно подобрать пару сообщений \( (M, M') \), имеющих одинаковый хеш.
Эти требования обеспечивают невозможность преднамеренного создания другого сообщения с тем же хешем или нахождения двух различных сообщений с одинаковым значением функции[1].
Одним из эффективных способов усложнения поиска коллизий является добавление «соли», уникальной случайной последовательности символов к исходным данным перед вычислением хеша. Этот метод широко применяется при хранении паролей в UNIX-системах[1]. «Соль» увеличивает пространство вариаций каждого пароля и предотвращает массовую атаку на группу паролей одновременно, однако «соль» не усложняет атаку на каждый пароль в отдельности.
Конкатенация результатов двух различных хеш-функций также рассматривается как способ повышения стойкости:
\[ C(x)=y(x)\|z(x), \]
где символ \(\|\) обозначает конкатенацию двух хешей от функций \( y(x) \) и \( z(x) \)[1].
Однако исследования показывают, что если одна из функций слабая и уязвима к поиску коллизий, то вторая не сможет усилить результирующий хеш. Таким образом, конкатенация не гарантирует существенного усиления противостояния атакам на коллизии[1].
Наиболее универсальным методом поиска коллизий считается атака «дней рождения». Для хеш-функции разрядностью в \( n \) бит среднее число операций для обнаружения пары с одинаковым значением составляет приблизительно \(2^{n/2}.\).
Исходя из этого критерия считается криптостойкой функция с вычислительной сложностью нахождения коллизий близкой к \(2^{n/2}.\).
Для стандартных современных функций длина выхода выбирается достаточно большой, чтобы атака «дней рождения» оставалась вычислительно непрактичной[1].
Атака удлинением сообщения использует конструкцию некоторых типов хеш-функций вида \(H(x\|y)=H(H(x)\|y),\) где операция конкатенации обозначается символом \(\|.\).
Данная атака позволяет при известном значении \( H(x) \) вычислить значение для расширенного сообщения без знания исходного сообщения \( x \)[1].
Она демонстрирует важность выбора правильного алгоритма построения функции и необходимость дополнительных механизмов защиты помимо базовой стойкости к коллизиям первого и второго рода.
Алгоритм Рабина–Карпа показывает влияние частых коллизий на эффективность алгоритмов поиска подстрок: среднее время работы составляет \( O(n+m) \), где происходит эффективный пересчёт хэшей строк; однако в худшем случае при частых совпадениях значений (коллизиях): \( O(n\cdot m) \)[3].
В языках программирования такие явления как коллизии реализуются через специальные механизмы разрешения конфликтов в структурах данных типа словарей (dict). Например Python применяет быструю битовую операцию для разрешения столкновений ключей в таблицах[4].
Коллизии являются неотъемлемой частью работы любых практических хеш-функций из-за ограниченности пространства вывода по сравнению с бесконечностью пространства входа. В криптографии борьба сосредоточена на усложнении нахождения таких совпадений до уровня полного перебора или выше.
Использование дополнительных техник вроде «соли», продуманного построения функций и комплексных методов проверки целостности позволяют снизить риски злоупотреблений на основе обнаруженных коллизий.
При проектировании систем хранения данных или защиты информации необходимо учитывать компромисс между скоростью вычисления и уровнем безопасности против атак с использованием поиска совпадений.
[1] https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BB%D0%BB%D0%B8%D0%B7...
[2] https://www.binance.com/ru/academy/articles/what-is-hashing
[3] https://repetitor.1c.ru/informatics/algoritm-rabina-karpa/
[4] https://habr.com/ru/articles/965170/
[5] https://vk.com/@fpmi_students-speckursy-i-fakultativy-dlya-student...
Создаётся краткое изложение…