Реализация HashAlgorithm - PullRequest
2 голосов
/ 13 января 2011

Мне нужна хеш-функция для проверки версий файлов (в основном, проверка того, совпадает ли файл на стороне клиента с файлом на стороне сервера).

Моя проблема в том, что в библиотеке .net есть полдюжины реализаций HashAlgorithm, и я немного растерялся.

  • System.Security.Cryptography.KeyedHashAlgorithm
  • System.Security.Cryptography.MD5
  • System.Security.Cryptography.RIPEMD160
  • System.Security.Cryptography.SHA1
  • System.Security.Cryptography.SHA256
  • System.Security.Cryptography.SHA384
  • System.Security.Cryptography.SHA512

Я ищу быстрый алгоритм с относительно коротким размером вывода. Безопасность здесь не имеет значения.

Спасибо!

Ответы [ 4 ]

4 голосов
/ 13 января 2011

Поскольку это не проблема безопасности, MD5, вероятно, будет служить вашим целям. Это довольно стандартно для хэширования содержимого файла.

2 голосов
/ 13 января 2011

Из всего вышесказанного, MD5 является самым простым и быстрым.

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

1 голос
/ 14 января 2011

Для производительности, мера.Все хеш-функции «быстрые» - для некоторого понятия скорости.Среди тех, кого вы перечислили, MD5 - самый быстрый, но это не значит, что другие не «достаточно быстрые».Самым медленным должен быть SHA-512 с управляемой реализацией на 32-битной виртуальной машине (с 64-битной виртуальной машиной SHA-512 значительно ускоряется, а SHA-256 становится самым медленным);он по-прежнему должен обрабатывать данные объемом около 30 Мбайт в секунду на обычном ПК, что также не является слишком медленным.

В случае сомнений используйте SHA-256.Рассмотрим другое, только если вы продемонстрируете в реальном эксперименте, что скорость хэширования является узким местом для вашего приложения и , и вы можете показать, что у вас действительно нет проблем безопасности с криптографически сломанной хэш-функцией.Это правильный порядок вещей, потому что оценка производительности на намного проще , чем оценка безопасности, поэтому гораздо безопаснее в первую очередь стремиться к хорошей безопасности.Здесь, опять же, помимо выбора MD5 в качестве более быстрой функции, вы можете также представить импорт управляемой реализации MD4 (там есть одна ): MD4 еще более сломан, чем MD5, но также еще быстрее.И / или вы можете попробовать немного собственного кода (в реализациях хеш-функций собственный код обычно в 2–4 раза быстрее, чем управляемый код).

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

0 голосов
/ 13 января 2011

Ну, MD5 быстрый, но в наши дни это сильно не рекомендуется.

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

В противном случае посмотрите на алгоритмы SHA. SHA-1 используется много. Я не эксперт по криптографии, но я думаю, что другие имеют более длинные размеры блоков и, вероятно, немного медленнее. Некоторое прочтение различий можно найти по адресу: http://en.wikipedia.org/wiki/SHA-1 и ссылкам на эти страницы.

Обратите внимание, что эффективный способ сокращения хеша только для сравнения (например, чтобы проверить, являются ли файлы одинаковыми и не были изменены), состоит в том, чтобы взять подмножество символов из хеша. Просто убедитесь, что вы берете их из одних и тех же индексов каждый раз (например, символы 0-5; или символы 5,11, и 13, как вы поняли).

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