Является ли использование двух разных хеш-функций хорошим способом проверки целостности файла? - PullRequest
5 голосов
/ 11 февраля 2009

У меня есть сайт, где пользователи могут загружать свои файлы; они хранятся на сервере, а их метаданные записываются в базу данных. Я реализую несколько простых проверок целостности, т. Е. "Содержимое этого файла теперь байтовое, идентично, когда он был загружен?"

Пример: для содержимого userfile.jpg хеш MD5 равен 39f9031a154dc7ba105eb4f76f1a0fd4, а хэш SHA-1 равен 878d8d667721e356bf6646bd2ec21fff50cdd4a9. Если содержимое этого файла изменяется, но имеет одинаковый хэш MD5 до и после, возможно ли, что хеш SHA-1 также останется прежним? (При хешировании иногда можно получить коллизию хеша - может это происходит с двумя разными алгоритмами хеширования одновременно?)

Или вычисление двух разных хешей для файла бессмысленно (и я должен попробовать другой механизм проверки целостности)?


Редактировать: Меня не очень беспокоит случайное повреждение, но я должен предотвратить то, что пользователи изменят файл незамеченным ( день рождения и друзья).

Я, вероятно, пойду с одним хешем, SHA-512 - проверки не случаются так часто, чтобы быть узким местом производительности и так или иначе ", как говорит Брюс Шнайер, уже есть достаточно быстрые, небезопасные системы. - @ MichaelGG в комментариях ".

Ответы [ 6 ]

7 голосов
/ 11 февраля 2009

MD5, вероятно, безопасен для того, что вы делаете, но нет причин продолжать использовать хеш с известными недостатками. На самом деле, нет никаких причин, по которым вам не следует использовать SHA256 или SHA512, если только у вас нет известных узких мест в производительности.

Редактировать: чтобы уточнить, нет причин использовать два алгоритма; просто используйте тот, который соответствует тому, что вам нужно. Если вы беспокоитесь о том, что с вами сталкиваются MD5 (например, это угроза безопасности?), Используйте алгоритм, который не так слаб, как SHA256.

Редактировать 2: Устранить, по-видимому, все еще распространенное недоразумение: обнаружение случайного столкновения по хешу не является вероятностью 1/2 ^ n. Это ближе к 1/2 ^ (п / 2). Таким образом, 128-битный хеш, вероятно, может столкнуться с 2 ^ 64 попытками. Смотрите день рождения атаки для деталей.

4 голосов
/ 11 февраля 2009

Проверка хеша MD5 сама по себе достаточна для большинства целей. Хотя, если это необходимо, проверка SHA1 не причинит вреда. Имейте в виду, что возможность поймать что-то, что вы могли бы пропустить, только с помощью проверки MD5 чрезвычайно далека.

Обратите внимание, что с точки зрения масштабируемости дополнительная проверка добавляет ненужную нагрузку на ваш сервер.

2 голосов
/ 11 февраля 2009

Для целостности файла (например, случайного / случайного повреждения) достаточно одного хэша. 128 бит = 2 -128 вероятность необнаруженной ошибки, которая для всех практических целей достаточно мала.

Для обеспечения криптографической целостности файла (например, гарантии того, что кто-то злонамеренно не подставил альтернативный файл), я думаю, что вы говорите о подходе с поясом и подтяжками.

MD5 считается «слабым» в том смысле, что можно создать два документа с одинаковым хешем с гораздо меньшим количеством процессорного времени, чем это потребуется для поиска методом «грубой силы» («сопротивление коллизии» в MD5). был сломан).

Но это не (насколько я знаю) "слабый" с точки зрения того, что если у вас есть произвольный документ X, кто-то другой может создать документ Y с таким же хешем с гораздо более легким временем, чем с помощью грубой силы поиск (MD5 все еще имеет «сопротивление прообразу»). (Различие подобно разнице между походом на вечеринку и поиском двух человек с одинаковым днем ​​рождения и поиском другого человека с таким же днем ​​рождения, как у вас.)

Даже если в этом отношении MD5 не работает, маловероятно, чтобы кто-то придумал алгоритм создания документов для соответствия произвольному хэшу MD5 и произвольному хешу SHA1.

Это звучит как напряжение между двумя принципами «не кладите все яйца в одну корзину» против «положите все яйца в одну корзину и следите за корзиной». Или как тратить деньги на два засова против одного засова, который вдвое дороже и стоит вдвое дороже. В идеале было бы лучше потратить процессорное время на вычисление одного безопасного 256-битного хэша вместо двух менее безопасных 128-битных хэшей с использованием различных алгоритмов. (да, я знаю, что SHA1 является 160-битным, это всего лишь иллюстрация) С большей вероятностью вы получите более высокую производительность для желаемого уровня безопасности, то есть , если 256-битный хэш не существует. я сломан Если он нарушен, вам может быть лучше использовать алгоритм с двумя алгоритмами, чтобы просто застраховать свои ставки.

Но опять же, если это просто целостность для защиты от ошибок, один хэш MD5 подойдет.

изменить: привести несколько полезных источников: 1 2 3 , "MD5 сегодня считается вредным" , RFC4270 , Последнее обновление NIST по конкурсу SHA-3 и " Зоопарк SHA-3 ".

1 голос
/ 11 февраля 2009

Поскольку два хэша рассчитываются по-разному, два файла с одинаковым хешем MD5 с большей вероятностью будут иметь одинаковый хэш SHA-1, чем два случайных файла. Если ваш шанс случайного столкновения с любым из хэшей равен (приблизительный) 2 ^ 128, ваш шанс случайного столкновения в обоих случаях будет 2 ^ 256.

По сути, вы переходите от крайне низкого к чрезвычайно, чрезвычайно низкому.

Это эквивалентно переходу от 128-битного к 256-битному шифрованию, чтобы избежать случайного угадывания вашего 128-битного ключа.

1 голос
/ 11 февраля 2009

В качестве приблизительной оценки, вероятность ложного срабатывания MD5 равна 1 / (2 ^ 128), вероятность ложного срабатывания SHA-1 равна 1 / (2 ^ 160), поэтому вероятность ложного срабатывания для обоих алгоритмов находится между 1 / (2 ^ 128) и 1 / (2 ^ 288), но вы можете быть уверены, что оно близко к 1 / (2 ^ 288), так как оба алгоритма были тщательно протестированы статистически.

По крайней мере, при использовании двух разных хешей вы очень хорошо защищены от преднамеренных атак на один из алгоритмов.

РЕДАКТИРОВАТЬ: После некоторого исследования, я наткнулся на это Википедия Примечание , что атаки на день рождения MD5 могут быть сделаны менее чем за 1 минуту, поэтому кажется, что лучше использовать другой алгоритм, как MD5 вместе с SHA-1 здесь , Атаки на день рождения для SHA-1 в настоящий момент занимают 2 ^ 69 операций .

1 голос
/ 11 февраля 2009

В общем случае, если хэши MD5 не совпадают, SHA1 (или любой другой подобный хеш) также не будет совпадать. Я не собираюсь говорить, что не бывает возможных случаев, когда это не могло бы произойти (потому что мы все знаем, что в обоих алгоритмах есть столкновения), но я бы сказал, что это, вероятно, никогда не произойдет в вашей ситуации.

Я думаю, что одного хеша достаточно; более одного хэша становится трудным для проверки (необходимость проверки одного достаточно плоха, в зависимости от доступных утилит для платформы) , и я серьезно сомневаюсь, что вы увидите такое удивительное повреждение файла, что привести к идеальному столкновению.

Примечание: Не обращайте внимания на то, что проверка - это боль; перечитав вопрос, я пересмотрел это - я принял первоначальное значение проверки хеша для пользователей, загружающих файл. Если, конечно, то, что имелось в виду , означает , то то, что я сказал, все еще применимо, я думаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...