Подтвердить что ты не робот

MD5 vs CRC32: Какой из них лучше для общего использования?

Недавно я где-то читал, что хотя CRC32 и MD5 достаточно однородны и стабильны, CRC32 более эффективен, чем MD5. MD5 представляется очень часто используемым алгоритмом хэширования, но если CRC32 работает быстрее/больше памяти, то почему бы не использовать его?

4b9b3361

Ответ 1

MD5 - это алгоритм one-way-hash. Алгоритм "односторонний хэш" часто используется в криптографии, поскольку у них есть свойство (для каждого проекта), что трудно найти вход, создающий конкретное значение хэш-функции. В частности, трудно сделать два разных входа, которые дают один и тот же односторонний хэш. Они часто используются в качестве способа показать, что количество данных не было изменено намеренно с момента создания хеш-кода. Поскольку MD5 является алгоритмом one-way-hash, акцент делается на безопасности по скорости. К сожалению, MD5 сейчас считается небезопасным.

CRC32 предназначен для обнаружения случайных изменений данных и обычно используется в сетях и устройствах хранения. Цель этого алгоритма - не защищать от преднамеренных изменений, а скорее улавливать несчастные случаи, такие как сетевые ошибки и ошибки записи на диске и т.д. Акцент этого алгоритма - это больше на скорости, чем на безопасности.

Ответ 2

Из Статья в Википедии о MD5 (акцент мой):

MD5 - широко используемая криптографическая хеш-функция

Теперь CRC32:

CRC является кодом обнаружения ошибок

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

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

Ответ 3

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

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

Ответ 4

CRC используются для защиты от случайных ошибок, например, при передаче данных.

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

Ответ 5

Вы должны использовать MD5 длиной 128 бит. CRC32 имеет длину всего 32 бита, и его целью является обнаружение ошибок, а не хэш-вещей. Если вам нужна только 32-битная хеш-функция, вы можете выбрать 32 бита, которые возвращаются MD5 LSB/MSBs/What бы то ни было.

Ответ 6

Основная причина, по которой CRC32 (или CRC8 или CRC16) используется для любых целей, заключается в том, что она может быть недорого реализована в аппаратном обеспечении в качестве средства обнаружения "случайного" искажения данных. Даже в реализации программного обеспечения он может быть полезен как средство обнаружения случайного повреждения данных из-за аппаратных причин (таких как шумная линия связи или ненадежные флэш-носители). Он не защищен от несанкционированного доступа, и он обычно не подходит для проверки того, могут ли два произвольных файла быть одинаковыми: если каждый кусок данных в файле сразу следует за CRC32 этого фрагмента (некоторые форматы данных делают это), каждый кусок будет иметь тот же эффект на общем CRC файла, что и кусок всех нулевых байтов, независимо от того, какие данные были сохранены в этом фрагменте.

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

Ответ 7

Это зависит от ваших целей. Вот несколько примеров того, что можно сделать с CRC32 по сравнению с MD5:

Обнаружение дубликатов файлов

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

Независимо от того, какие у вас ключи, хеш CRC32 будет одним из 2 ^ 32 разных значений. Предполагая случайные файлы выборки, вероятность столкновения между хэшами двух данных файлов составляет 1/2 ^ 32. Вероятность столкновения между любым из N данных файлов равна (N - 1)/2 ^ 32.

Обнаружение вредоносного программного обеспечения

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

Защита паролей для аутентификации пользователя

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

Что хорошего в пароле, который вы не видите? Вам не нужно видеть его, чтобы подтвердить учетную запись пользователя. Вы просто берете информацию, которую они дают вам при входе в систему. Вы используете их имя пользователя, чтобы получить их соль. Затем вы комбинируете эту соль с учетными данными пользователя (пароль и, возможно, имя пользователя), чтобы получить новый хеш. Если он совпадает с тем, что в базе данных, то их вход успешен. Поскольку вы храните эти пароли, они должны быть ОЧЕНЬ безопасными. Я не упомянул векторы инициализации, итеративное хеширование, теорию случайности и т.д.

Криптографические хэши более дороги для вычисления, чем CRC. Кроме того, лучшие хэши, такие как sha256, более безопасны, но медленнее хешируются. Кстати, хэширование sha512 происходит быстрее, чем sha256.

Ответ 8

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

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

Если это мегабайты данных, например, linux iso, то вы можете потерять несколько мегабайт и все же в итоге получить тот же CRC. Не очень вероятно с MD5. По этой причине MD5 обычно используется для огромных передач. Он медленнее, но надежнее.

Итак, в принципе, если вы собираетесь сделать одну огромную передачу и проверить в конце, есть ли у вас правильный результат, используйте MD5. Если вы собираетесь передавать в небольших кусках, используйте CRC.

Ответ 9

На самом деле CRC32 не быстрее, чем MD5.

Пожалуйста, посмотрите на: https://3v4l.org/2MAUr

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

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