Допустим, мы используем HashMap
для хранения некоторых пользовательских данных в веб-приложении. Предположим, что пользователи могут каким-либо образом выбрать (часть) ключа - возможно, ключ - это имя пользователя или имя файла загруженного файла или что-то в этом роде.
Если мы не используем криптографически безопасную хеш-функцию, это означает, что злоумышленник может создать несколько входов, которые все отображаются на один и тот же выход . Конечно, хэш-карта имеет дело с коллизиями, потому что они происходят естественно.
Но когда происходит неестественно много столкновений, реализация хэш-карты может делать странные вещи. Например, поиск некоторых ключей может иметь время выполнения O (n) . Или хэш-карта может подумать, что она должна расти из-за всех столкновений; но увеличение не решит проблему, поэтому хэш-карта увеличивается до тех пор, пока не будет использована вся память . В любом случае это плохо. Хеш-карты просто предполагают, что статистически столкновения происходят редко.
Конечно, это не атака «кражи пользовательских данных» - по крайней мере, не напрямую. Но если одна часть системы слаба, злоумышленникам будет легче найти другие слабости.
Криптографически безопасная хеш-функция предотвращает эту атаку, поскольку злоумышленник не может создать несколько ключей, которые соответствуют одному и тому же значению (по крайней мере, не опробовав все ключи).
не имеет значения в 99% (может быть, даже в 99,99%) времени для хеш-таблиц.
Да, , вероятно, . Но это трудно сбалансировать. Я предполагаю, что мы все согласимся с тем, что, если 20% пользователей будут иметь проблемы с безопасностью в своем приложении из-за небезопасной хэш-функции (в то время как 80% не заботятся), все равно будет хорошей идеей использовать подход «по умолчанию безопасный». Как насчет 5% / 95%? Как насчет 1% / 99%? Трудно сказать, где находится порог, верно?
Об этом уже было много дискуссий. Да, большинство людей замечают только медлительность хэш-карты. Возможно, ситуация, которую я описал выше, невероятно редка, и по умолчанию не стоит замедлять код всех других пользователей. Но это было решено, хэш-функция по умолчанию не изменится, и, к счастью, вы можете выбрать свою собственную хеш-функцию.