Согласно с это есть как минимум 6 «свойств», к достижению которых стремятся все криптографически безопасные хеш-функции:
- Детерминированный: одно и то же сообщение всегда приводит к одному и тому же хешу;
- Быстрый: быстро вычислить хеш-значение для любого данного сообщения;
- Односторонняя функция: невозможно сгенерировать сообщение из его хеш-значения, кроме как перепробовав все возможные сообщения;
- Лавинный эффект: небольшое изменение в сообщении должно изменить значение хеш-функции настолько сильно, что новое значение хеш-функции окажется некоррелированным со старым значением хеш-функции;
- Устойчивость к столкновениям: невозможно найти два разных сообщения с одинаковым значением хеш-функции.
- Устойчивость к предварительным атакам: атака с предварительным изображением на криптографические хэш-функции пытается найти сообщение, имеющее определенное хэш-значение. Криптографическая хеш-функция должна противостоять атакам на свой прообраз.
Насколько я могу себе представить, первых 3 довольно легко придерживаться (не реализовав криптографически безопасную функцию хеширования). Но как вы спроектируете что-то, что имеет последние 3?
- Лавинный эффект.
- Устойчивость к столкновениям.
- Устойчивость к атакам предварительного изображения.
Есть ли конкретные вещи, которые вы можете сделать при разработке хеш-функции, чтобы каким-то образом получить эти 3 свойства? Как это делают те, кто создает отмеченные наградами криптографические хэш-функции?
Если нет принципов, которые можно было бы применить, следующим лучшим вариантом было бы узнать, какие примеры следует изучить, чтобы получить представление о том, как им удалось придерживаться этих свойств. В таком случае, какие статьи или хэш-алгоритмы стоит изучить и на каких частях этих случаев следует сосредоточиться?