CRC32 + Размер против MD5 / SHA1 - PullRequest
       35

CRC32 + Размер против MD5 / SHA1

5 голосов
/ 06 апреля 2011

У нас есть хранилище файлов, и хранилище однозначно определяет файл на основе размера, добавленного к crc32.

Я хотел знать, будет ли эта контрольная сумма (размер crc32 +) достаточной для идентификации файлов, или мы должны рассмотреть какую-нибудь другую технику хеширования, такую ​​как MD5 / SHA1?

Ответы [ 4 ]

2 голосов
/ 07 апреля 2011

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

Хеш-функция предназначена для предотвращения столкновений. С MD5 или SHA-1 вы не получите случайных столкновений. Если ваша установка связана с безопасностью (то есть где-то есть кто-то, кто может активно пытаться создавать коллизии), тогда вам нужна хэш-функция secure . MD5 больше не является безопасным (создание коллизий с MD5 легко), и SHA-1 несколько слаб в этом отношении (фактические коллизии не были рассчитаны, но метод для их создания известен, и, хотя и дорог, он намного дешевле, чем так и должно быть). Обычная рекомендация - использовать SHA-256 или SHA-512 (для безопасности достаточно SHA-256; SHA-512 может быть немного быстрее в больших 64-разрядных системах, но пропускная способность чтения файлов будет более ограниченной, чем скорость хеширования) .

Примечание: при использовании криптографической хеш-функции нет необходимости хранить и сравнивать длины файлов; хеш достаточен для устранения неоднозначности файлов.

В настройках, не связанных с безопасностью (то есть вы боитесь только случайных столкновений), тогда можно использовать MD4 . Он полностью «сломан» как криптографическая хеш-функция, но все же это очень хорошая контрольная сумма, и она действительно быстрая (на некоторых платформах на основе ARM она даже быстрее, чем CRC-32, для гораздо лучшей устойчивости к случайным действиям). столкновения). По сути, вы не должны использовать MD5: если у вас есть проблемы с безопасностью, то MD5 не должен использоваться (он сломан; используйте SHA-256); и если у вас нет проблемы с безопасностью, то MD4 быстрее, чем MD5.

2 голосов
/ 06 апреля 2011

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

Если у вас нет серьезных требований к безопасности, вы можете выбрать MD5, который должен быть быстрее. (помните, что MD5 уязвим для столкновений). Если вам нужно больше безопасности, лучше использовать SHA1 или даже SHA2.

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

Пространство, которое будет использоваться размером CRC32 +, дает вам достаточно места для большего CRC, который был бы намного лучшим выбором.Если вас не беспокоит злонамеренное столкновение, то в этом случае применяется ответ Томаса.

Вы не указали язык, но, например, в C ++ вы получили Boost CRC , который дает вам CRCразмер, который вы хотите (или вы можете позволить себе хранить).

0 голосов
/ 06 апреля 2011

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

...