Самый быстрый способ вычислить хэш файла? - PullRequest
3 голосов
/ 19 ноября 2008

Множество файлов будет храниться в БД, и мне нужны хэши файлов, чтобы однозначно определить, что файл не был изменен. (В общем случае будет использоваться как часть персонального брандмауэра Windows)

Ответы [ 2 ]

19 голосов
/ 11 марта 2011

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

Существует успешная атака на алгоритм MD5, которая позволяет вам найти другое сообщение, которое выдает тот же хеш при относительно небольшой работе (по сравнению с грубой силой). Эта атака , используемая для , не имеет никакого реального отношения, например когда MD5 использовался для хэширования паролей или чего-то подобного. В то же время были обнаружены новые атаки, поэтому и MD5, и SHA-1 можно хэшировать / сталкивать со страшными скоростями, и взломать целые базы данных «правильно посоленных» и однохешевых пользовательских паролей с помощью этих «старых» хэшей только вполне осуществимо, но уже продемонстрировано.
Однако в конкретном приложении «убедитесь, что этот файл не был подделан» , атака такого типа всегда была проблемой, а не только в последнее время. MD5 вполне безопасно обнаружит небольшую ошибку или случайное изменение, но вредоносное ПО, пытающееся обойти вашу личную файловую систему, может довольно просто обойти всю вашу безопасность, обнаружив столкновение для зараженного двоичного файла, чтобы хеш соответствовал оригиналу.

Вы должны использовать SHA-256 для этого случая [ Обновление: в то же время, SHA-3 вышел, и хотя я лично не согласен с выбором NIST победителя (или непонятного) Критерии исключения некоторых очень хороших кандидатов второго тура), намного безопаснее выбор использовать SHA-3 (Keccak) или, в качестве альтернативы, одного из финалистов SHA-3. Все финалисты были тщательно разработаны опытными командами, были очень тщательно проанализированы, и до сих пор ни у кого не было реалистичной атаки или известной проблемы, которая могла бы привести к реалистичной атаке, и у них всех тоже есть «больше битов» ( что само по себе ничего не значит, но больше битов не повредит)].

Кроме того, не забывайте всегда сохранять длину файла в дополнение к хешу, это значительно усиливает даже плохой хеш при незначительной стоимости. Если можете, рассчитайте два разных хеша. намного проще для атакующего найти какое-то сообщение, которое вызывает коллизию на одном хэше, чем найти сообщение, которое вызывает коллизию и которое имеет точно одинаковой длины или даже сообщения, которое сталкивается с двумя разными хешами и имеет одинаковую длину.
Поскольку пропускная способность (как диска, так и памяти) является неотъемлемым фактором при вычислении хеша, даже возможно, что вычисление одного хеша или двух хешей одновременно выполняется с сопоставимой скоростью.
Я наблюдал такой эффект при вычислении CRC и шифровании тех же блоков блочным шифром впоследствии. Независимо от того, был ли рассчитан CRC, разница в общем времени выполнения составляла менее 1%, поэтому это была в основном бесплатная операция.

Если вы считаете, что у вас есть веская причина не использовать хорошо известный стандартный хэш (ограничения производительности?), Вы можете создать свой собственный безопасный хеш. Используя конструкцию Merkle – Damgård (или, в последнее время, HAIFA), вы можете превратить любой защищенный блочный шифр в безопасную хеш-функцию. Например, зашифруйте каждый входной блок с помощью AES с помощью фиксированного ключа и передайте его в следующий блок перед его шифрованием. Вывод после последнего блока - ваше хеш-значение.

Хотя «создавать свои собственные», как правило, не очень хорошая идея, в этом случае действительно могут быть веские причины, поскольку AES работает быстро и поддерживается аппаратно в самых последних процессорах. На моей машине AES работает со скоростью примерно 130 МБ / с. На i7 (с аппаратной поддержкой) в интернете его скорость составляет около 570 МБ / с.

Что касается ограничения ввода / вывода, то раскрутка - это правильно, диск вполне может быть ограничивающим фактором, хотя это не обязательно. Карта памяти - ваш друг, особенно в вашем конкретном случае.

Если вы проверяете файлы, которые претендуют на права на брандмауэре, то это будут исполняемые файлы, которые были загружены в ОЗУ (как это может отличаться, они выполняются в конце концов!). Таким образом, отображение страниц, которые уже находятся в ОЗУ, будет просто добавлением записи в таблицу страниц, более или менее запретной. И даже если данные не находятся в ОЗУ, производительность (и простота) отображения памяти просто потрясающая, в эти дни я редко использую что-либо еще, когда скорость имеет значение.

4 голосов
/ 19 ноября 2008

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

В общем случае вам нужно просмотреть каждый бит файла, чтобы включить его в хеш, и производительность, вероятно, будет ограничена вводом / выводом. Это последовательный просмотр всех данных в файле, обновление состояния любого алгоритма хеширования, который вы используете для каждого нового байта. На современном процессоре последний будет быстрее первого. Этот довольно старый анализ показывает около 45 МБ / с на процессоре Pentium 90 МГц.

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