«Безопасный» хеш - это хеш, который, как полагают, трудно «подделать» формальным, воспроизводимым способом без предварительного знания сообщения, использованного для создания хэша. Поскольку эта информация, как правило, является секретной, и, следовательно, необходимость хэширования является хорошим свойством функции хеширования, предназначенной для использования при аутентификации.
Хеш обычно считается «безопасным», если с учетом сообщения M, хеш-функции hash () и хеш-значения H, созданного хешем (M) с длиной в битах L, ни одно из следующего не может быть выполнено менее чем за O (2 л ) время:
- Учитывая hash () и H, производим M. (сопротивление прообразу)
- Учитывая hash () и M, создайте другой M 2 такой, что hash (M 2 ) == H. (слабое сопротивление столкновению)
- Учитывая hash (), выведите любые M 1 и M 2 такие, что hash (M 1 ) == hash (M 2 ). (сильное сопротивление столкновению)
Кроме того, «защищенный» хеш должен иметь длину хеша L, такую что 2 Lне является допустимым числом шагов для компьютера для выполнения данного текущего оборудования. Хэш 32-битного целого может иметь только 2,1 миллиарда значений; в то время как атака с прообразом (поиск сообщения, генерирующего определенный хэш H) займет некоторое время, для многих компьютеров это становится недопустимым, особенно для тех, которые находятся в руках правительственных учреждений, застрахованных от взлома кода. Кроме того, алгоритм, который создает и хранит случайные сообщения и их хэши, будет, по всей вероятности, иметь 50% вероятности найти дублирующийся хэш с каждым новым сообщением после попытки только 77 000 сообщений и иметь 75% -ную вероятность попадания в дублировать только после 110 000. Даже 64-битные хэши все еще имеют 50% -ную вероятность столкновения после попытки только около 5 миллиардов значений. Такова сила атаки на маленькие хеш-коды. В отличие отдесятичные числа (1,5 * 10 34 ).
Большинство продемонстрированных атак на криптографические хэши были атаками столкновений, и продемонстрировали способность генерировать конфликтующие сообщения менее чем за 2 л времени (большинство из них все еще были экспоненциально-временными, но уменьшение показателя в два раза является значительным снижением сложности, поскольку 256-битный хеш так же легко решить, как 128-битный, 128-битный так же легко решить, как 64-битный и т. д.).
В дополнение к небольшому размеру хэша, другие факторы, которые могут сделать хэш явно небезопасным:
Низкая работа - хеш, предназначенный для использования хеш-таблицей или для других целей типа «контрольной суммы», обычно разрабатывается как недорогой в вычислительном отношении. Это делает атаку грубой силой намного проще.
«Sticky State» - функция хеширования склонна к шаблонам ввода, где текущее хешированное значение всех входных данных до сих пор не изменяется при задании определенного дополнительного байта ввода. Наличие «закрепленного состояния» облегчает обнаружение коллизий, потому что, как только вы идентифицируете сообщение, которое создает хеш «застрявшего состояния», тривиально генерировать другие сообщения, которые имеют такой же хеш, добавляя входные байты, которые сохраняют хеш в «закрепленном состоянии». ».
Распространение - каждый входной байт сообщения должен быть распределен среди байтов значения хеш-функции одинаково сложным способом. Определенные хеш-функции создают предсказуемые изменения в определенных битах хеш-функции. Это снова делает создание столкновений тривиальным; учитывая сообщение, которое создает хеш, коллизии могут быть легко созданы путем введения в сообщение новых значений, которые влияют только на те биты, которые предсказуемо изменяются.