В информатике коллизия хэшей или столкновение хэшей [1] происходит, когда два различных фрагмента данных в хэш-таблице имеют одно и то же значение хэша. Значение хэша в этом случае выводится из хэш-функции , которая принимает входные данные и возвращает фиксированную длину битов. [2]
Хотя алгоритмы хеширования, особенно криптографические алгоритмы хеширования, были созданы с намерением быть устойчивыми к коллизиям , они все еще могут иногда отображать различные данные в один и тот же хеш (в силу принципа ящика ). Злонамеренные пользователи могут воспользоваться этим, чтобы имитировать, получать доступ или изменять данные. [3]
Из-за возможных негативных применений коллизий хэшей в управлении данными и компьютерной безопасности (в частности, криптографических хэш-функций ), предотвращение коллизий стало важной темой в компьютерной безопасности.
Коллизии хэшей могут быть неизбежны в зависимости от количества объектов в наборе и от того, достаточно ли длинна строка битов, с которой они сопоставлены. Когда есть набор из n объектов, если n больше, чем | R |, который в этом случае является диапазоном значения хэша, вероятность того, что возникнет коллизия хэшей, равна 1, что означает, что она гарантированно произойдет. [4]
Другая причина, по которой в какой-то момент времени вероятны коллизии хэшей, проистекает из идеи парадокса дней рождения в математике. Эта задача рассматривает вероятность того, что у набора из двух случайно выбранных людей будет одинаковый день рождения из n числа людей. [5] Эта идея привела к тому, что было названо атакой на день рождения . Предпосылка этой атаки заключается в том, что трудно найти день рождения, который точно совпадает с вашим днем рождения или определенным днем рождения, но вероятность найти набор из любых двух людей с совпадающими днями рождения значительно увеличивает вероятность. Злоумышленники могут использовать этот подход, чтобы упростить себе поиск значений хэшей, которые конфликтуют с любым другим значением хэшей, — вместо поиска определенного значения. [6]
Влияние коллизий зависит от приложения. Когда хэш-функции и отпечатки пальцев используются для идентификации схожих данных, таких как гомологичные последовательности ДНК или схожие аудиофайлы, функции разрабатываются таким образом, чтобы максимизировать вероятность коллизии между различными, но схожими данными, используя такие методы, как локально-чувствительное хэширование . [7] Контрольные суммы , с другой стороны, разрабатываются для минимизации вероятности коллизий между схожими входами, без учета коллизий между очень разными входами. [8] Случаи, когда злоумышленники пытаются создать или найти коллизии хэшей, известны как атаки коллизий. [9]
На практике приложения, связанные с безопасностью, используют криптографические алгоритмы хеширования, которые разработаны так, чтобы быть достаточно длинными, чтобы случайные совпадения были маловероятными, достаточно быстрыми, чтобы их можно было использовать где угодно, и достаточно безопасными, чтобы было чрезвычайно сложно обнаружить коллизии. [8]
В хэш-таблицах, поскольку хэш-коллизии неизбежны, хэш-таблицы имеют механизмы для их обработки, известные как разрешения коллизий. Две наиболее распространенные стратегии — открытая адресация и раздельное цепочкование . Разрешение коллизий с учетом кэша — еще одна стратегия, которая обсуждалась в прошлом для строковых хэш-таблиц.
Ячейкам в хэш-таблице в этом методе присваивается одно из трех состояний — занято, пусто или удалено. Если происходит коллизия хэша, таблица будет проверена, чтобы переместить запись в альтернативную ячейку, которая указана как пустая. Существуют различные типы проверки, которые имеют место, когда происходит коллизия хэша, и этот метод реализован. Некоторые типы проверки — это линейное зондирование , двойное хэширование и квадратичное зондирование . [10] Открытая адресация также известна как закрытое хэширование. [11]
Эта стратегия позволяет «присоединить» более одной записи к ячейкам хэш-таблицы. Если две записи направляются в одну и ту же ячейку, обе попадут в эту ячейку как связанный список. Это эффективно предотвращает возникновение коллизии хэшей, поскольку записи с одинаковыми значениями хэшей могут попадать в одну и ту же ячейку, но у этого есть свои недостатки. Отслеживание такого количества списков затруднительно и может привести к тому, что любой используемый инструмент станет очень медленным. [10] Раздельное связывание также известно как открытое хэширование. [12]
Хотя он использовался гораздо реже, чем два предыдущих, в 2005 году Аскитис и Зобель (2005) предложили метод разрешения коллизий с учетом кэша . [13] Это идея, похожая на отдельные методы цепочек, хотя технически она не включает в себя цепочечные списки. В этом случае вместо цепочечных списков хеш-значения представлены в непрерывном списке элементов. Это лучше подходит для строковых хеш-таблиц, а использование для числовых значений пока неизвестно. [10]
Гораздо больше, чем алгоритмы шифрования, односторонние хэш-функции являются рабочими лошадками современной криптографии.