Все хеш-функции "сломаны"
Принцип голубиного отверстия гласит, что изо всех сил старайтесь не помещать более 2 голубей в 2 отверстия (если вы не порежете голубей). Точно так же вы не можете поместить 2 ^ 128 + 1 число в 2 ^ 128 слотов. Все хеш-функции приводят к хешу конечного размера, это означает, что вы всегда можете найти коллизию, если будете искать в последовательности «конечный размер» + 1. Это просто невозможно сделать. Не для MD5 и не для Skein .
MD5 / SHA1 / Sha2xx не имеют шансов столкновения
У всех хеш-функций есть коллизии, это факт жизни. Случайное столкновение с этими столкновениями эквивалентно выигрышу межгалактической лотереи . То есть, никто не выигрывает межгалактическую лотерею , это просто не то, как работает лотерея. Вы не встретите случайный хеш MD5 / SHA1 / SHA2XXX, НИКОГДА. Каждое слово в каждом словаре, на каждом языке хэширует свое значение. Каждое имя пути на каждой машине на всей планете имеет свой хеш MD5 / SHA1 / SHA2XXX. Откуда я это знаю, спросите вы. Ну, как я уже говорил, никто никогда не выигрывает межгалактическую лотерею.
Но ... MD5 сломан
Иногда тот факт, что его сломали, не имеет значения .
В существующем виде нет известных атак перед изображением или вторыми изображениями на MD5.
Так что же такого плохого в MD5, спросите вы? Третья сторона может сгенерировать 2 сообщения, одно из которых ЗЛО, а другое ХОРОШЕЕ, и оба хэшируют одно и то же значение. ( Столкновение атаки )
Тем не менее, текущая рекомендация RSA - не использовать MD5, если вам нужно сопротивление до изображения. Люди склонны проявлять осторожность, когда речь заходит об алгоритмах безопасности.
Так какую хеш-функцию я должен использовать в .NET?
- Используйте MD5, если вам нужна скорость / размер и вас не волнуют атаки на день рождения или атаки перед изображением.
Повторите это после меня, нет шансов на столкновение MD5 , вредоносные столкновения могут быть тщательно спроектированы. Несмотря на то, что на сегодняшний день не известно ни одной атаки с использованием образа на MD5, эксперты по безопасности утверждают, что MD5 не следует использовать там, где вам нужно защищаться от атак до изображения. ЖЕ идет для SHA1 .
Имейте в виду, что не все алгоритмы должны защищаться от атак до изображения или столкновения. Возьмите тривиальный случай первого прохода поиска дубликатов файлов на вашем HD.
- Используйте функцию на основе SHA2XX, если вам нужна криптографически безопасная хеш-функция.
Никто никогда не обнаруживал столкновения SHA512. КОГДА-ЛИБО. Они очень старались. В этом отношении никто никогда не обнаруживал столкновения SHA256 или 384. ,
- Не используйте SHA1 или RIPEMD, если это не для сценария взаимодействия.
RIPMED не получил столько же проверок, сколько получил SHAX и MD5. И SHA1, и RIPEMD уязвимы для атак на день рождения. Они оба медленнее, чем MD5 в .NET, и имеют неловкий размер в 20 байт. Бессмысленно использовать эти функции, забыть о них.
Атаки коллизий SHA1 уменьшены до 2 ^ 52, и они не будут слишком длинными, пока коллизии SHA1 не исчезнут в дикой природе.
Для получения актуальной информации о различных хеш-функциях посмотрите хеш-функцию zoo .
Но подождите еще
Наличие хэш-функции fast может быть проклятием. Например: очень распространенное использование хеш-функций - хранение паролей. По сути, вы вычисляете хэш пароля в сочетании с известной случайной строкой (для предотвращения радужных атак) и сохраняете этот хэш в базе данных.
Проблема в том, что если злоумышленник получит дамп базы данных, он может весьма эффективно угадать пароли с помощью грубой силы. Каждая комбинация, которую он пробует, занимает доли миллисекунды, и он может опробовать сотни тысяч паролей в секунду.
Чтобы обойти эту проблему, можно использовать алгоритм bcrypt , он спроектирован как медленный, поэтому атакующий будет сильно замедлен, если атакует систему с помощью bcrypt. Недавно scrypt сделал заголовок, и некоторые считают его более эффективным, чем bcrypt, но я не знаю о реализации .Net.