Платформа .NET поставляется с 6 различными алгоритмами хеширования:
- MD5: 16 байт (время хеширования 500 МБ: 1462 мс)
- SHA-1: 20 байтов (1644 мс)
- SHA256: 32 байта (5618 мс)
- SHA384: 48 байтов (3839 мс)
- SHA512: 64 байта (3820 мс)
- RIPEMD: 20 байт (7066 мс)
Каждая из этих функций выполняется по-разному; MD5 - самый быстрый, а RIPEMD - самый медленный.
Преимущество MD5 в том, что он подходит для встроенного типа Guid; и это основа UUID типа 3 . Хеш SHA-1 является основой UUID типа 5. Что делает их действительно простыми в использовании для идентификации.
Однако MD5 уязвим для коллизионных атак , SHA-1 также уязвим, но в меньшей степени.
При каких условиях я должен использовать какой алгоритм хеширования?
Мне действительно любопытно получить ответы на следующие конкретные вопросы:
Разве нельзя верить MD5? В обычных ситуациях, когда вы используете алгоритм MD5 без злонамеренного намерения, и никакая третья сторона не имеет злонамеренного намерения, вы ожидаете ЛЮБЫХ коллизий (то есть два произвольных байта [] производят один и тот же хэш)
Насколько RIPEMD лучше SHA1? (если он лучше) его вычисление в 5 раз медленнее, но размер хэша такой же, как у SHA1.
Каковы шансы получить незащищенные коллизии при хешировании имен файлов (или других коротких строк)? (Например, 2 случайных имени файла с одинаковым хешем MD5) (с MD5 / SHA1 / SHA2xx) В общем, каковы шансы на отсутствие вредоносных коллизий?
Это тест, который я использовал:
static void TimeAction(string description, int iterations, Action func) {
var watch = new Stopwatch();
watch.Start();
for (int i = 0; i < iterations; i++) {
func();
}
watch.Stop();
Console.Write(description);
Console.WriteLine(" Time Elapsed {0} ms", watch.ElapsedMilliseconds);
}
static byte[] GetRandomBytes(int count) {
var bytes = new byte[count];
(new Random()).NextBytes(bytes);
return bytes;
}
static void Main(string[] args) {
var md5 = new MD5CryptoServiceProvider();
var sha1 = new SHA1CryptoServiceProvider();
var sha256 = new SHA256CryptoServiceProvider();
var sha384 = new SHA384CryptoServiceProvider();
var sha512 = new SHA512CryptoServiceProvider();
var ripemd160 = new RIPEMD160Managed();
var source = GetRandomBytes(1000 * 1024);
var algorithms = new Dictionary<string,HashAlgorithm>();
algorithms["md5"] = md5;
algorithms["sha1"] = sha1;
algorithms["sha256"] = sha256;
algorithms["sha384"] = sha384;
algorithms["sha512"] = sha512;
algorithms["ripemd160"] = ripemd160;
foreach (var pair in algorithms) {
Console.WriteLine("Hash Length for {0} is {1}",
pair.Key,
pair.Value.ComputeHash(source).Length);
}
foreach (var pair in algorithms) {
TimeAction(pair.Key + " calculation", 500, () =>
{
pair.Value.ComputeHash(source);
});
}
Console.ReadKey();
}
источник
Ответы:
В криптографии хэш-функции предоставляют три отдельные функции.
Эти свойства связаны, но независимы. Например, сопротивление столкновению подразумевает сопротивление второму прообразу, но не наоборот. Для любого конкретного приложения у вас будут разные требования, требующие одно или несколько из этих свойств. Хэш-функция для защиты паролей на сервере обычно требует только сопротивления прообразу, в то время как дайджесты сообщений требуют всех трех.
Было показано, что MD5 не устойчив к столкновениям, однако это не исключает его использования в приложениях, которые не требуют сопротивления столкновениям. Действительно, MD5 по-прежнему часто используется в приложениях, где предпочтительны меньший размер ключа и меньшая скорость. Тем не менее, из-за его недостатков исследователи рекомендуют использовать другие хеш-функции в новых сценариях.
У SHA1 есть недостаток, который позволяет обнаруживать коллизии за гораздо меньшее, чем 2 ^ 80 шагов, которые потребуются для безопасной хеш-функции его длины. Атака постоянно пересматривается и в настоящее время может быть проведена за ~ 2 ^ 63 шагов - едва ли в пределах текущей области вычислимости. По этой причине NIST отказывается от использования SHA1, заявляя, что семейство SHA2 должно использоваться после 2010 года.
SHA2 - это новое семейство хэш-функций, созданное после SHA1. В настоящее время нет известных атак на функции SHA2. SHA256, 384 и 512 являются частью семейства SHA2, только с использованием ключей разной длины.
RIPEMD Я не могу комментировать слишком много, за исключением того, что он не так часто используется, как семейства SHA, и поэтому не был так тщательно изучен криптографическими исследователями. Только по этой причине я бы рекомендовал использовать вместо него функции SHA. В той реализации, которую вы используете, это тоже кажется довольно медленным, что делает его менее полезным.
В заключение, не существует одной лучшей функции - все зависит от того, для чего она вам нужна. Помните о недостатках каждого из них, и вы сможете лучше всего выбрать правильную хеш-функцию для своего сценария.
источник
Все хеш-функции "сломаны"
Принцип « голубятни» гласит, что сколько бы вы ни старались, вы не сможете поместить более 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 не следует использовать там, где вам нужно защищаться от атак с предварительным изображением. ТО ЖЕ подходит для SHA1 .
Имейте в виду, что не все алгоритмы должны защищаться от атак с предварительным изображением или столкновений. Возьмите тривиальный случай первого прохода поиска дубликатов файлов на вашем HD.
Никто так и не обнаружил конфликтов SHA512. КОГДА-ЛИБО. Они очень старались. В этом отношении никто никогда не обнаруживал никаких конфликтов SHA256 или 384. .
RIPMED не получил такого же внимания, как SHAX и MD5. И SHA1, и RIPEMD уязвимы для атак по случаю дня рождения. Оба они медленнее, чем MD5 в .NET, и имеют неудобный размер в 20 байт. Бессмысленно использовать эти функции, забудьте о них.
Атаки коллизий SHA1 уменьшены до 2 ^ 52, это не будет слишком долгим, пока коллизии SHA1 не исчезнут.
Актуальную информацию о различных хеш-функциях можно найти в зоопарке хеш-функций .
Но подождите, это еще не все
Имея быстрый хэш - функция может быть проклятием. Например: очень частым использованием хеш-функций является хранение паролей. По сути, вы вычисляете хэш пароля в сочетании с известной случайной строкой (чтобы предотвратить атаки радуги) и сохраняете этот хеш в базе данных.
Проблема в том, что если злоумышленник получает дамп базы данных, он может довольно эффективно угадывать пароли с помощью грубой силы. Каждая попытка комбинации занимает всего долю миллисекунды, и он может перепробовать сотни тысяч паролей в секунду.
Чтобы обойти эту проблему, можно использовать алгоритм bcrypt , он разработан так, чтобы быть медленным, поэтому злоумышленник будет сильно замедлен при атаке системы с помощью bcrypt. Недавно scrypt сделал несколько заголовков и некоторые считают его более эффективным, чем bcrypt, но я не знаю о реализации .Net.
источник
Обновить:
Времена изменились, у нас есть победитель SHA3. Я бы рекомендовал использовать keccak (он же SHA3 ), победитель конкурса SHA3.
Оригинальный ответ:
В порядке от самого слабого к самому сильному я бы сказал:
Лично я бы использовал MD6, потому что нельзя быть слишком параноиком. Если скорость действительно важна, я бы посмотрел на Skein или SHA-256.
источник
В защиту MD5 не существует известного способа создать файл с произвольным хешем MD5. Первоначальный автор должен заранее спланировать рабочую коллизию. Таким образом, если получатель доверяет отправителю, MD5 в порядке. MD5 нарушается, если подписывающий является вредоносным, но не известно, что он уязвим для атак типа «злоумышленник в середине».
источник
Было бы неплохо взглянуть на BLAKE2 алгоритм .
Как описано, он быстрее, чем MD5, и, по крайней мере, так же безопасен, как SHA-3. Он также реализован несколькими программными приложениями , включая WinRar.
источник
Какой из них вы используете, действительно зависит от того, для чего вы его используете. Если вы просто хотите убедиться, что файлы не будут повреждены при передаче и не беспокоитесь о безопасности, выбирайте быстро и мало. Если вам нужны цифровые подписи для многомиллиардных федеральных соглашений о спасении, и вам нужно убедиться, что они не подделаны, постарайтесь подделать их и поторопитесь.
источник
Я хотел бы сообщить (до того, как md5 разорвется на части), что я все еще широко использую md5, несмотря на его подавляющую уязвимость для большого количества криптовалют.
Пока вы не заботитесь о защите от столкновений (вы все еще можете безопасно использовать md5 в hmac) и вам нужна скорость (иногда вам нужен более медленный хеш), вы все равно можете уверенно использовать md5.
источник
Я не эксперт в подобных вещах, но я не отстаю от сообщества безопасности, и многие люди считают, что хеш md5 сломан. Я бы сказал, что какой из них использовать, зависит от того, насколько конфиденциальны данные и конкретное приложение. Возможно, вам удастся обойтись чуть менее безопасным хешем, если ключ хороший и надежный.
источник
Вот мои предложения для вас:
См. Здесь документ, в котором подробно описан алгоритм создания коллизий md5 за 31 секунду с настольным компьютером Intel P4.
http://eprint.iacr.org/2006/105
источник