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

Когда CRC более подходит для использования, чем MD5/SHA1?

Когда целесообразно использовать CRC для обнаружения ошибок по сравнению с более современными хэширующими функциями, такими как MD5 или SHA1? Является ли первое проще реализовать на встроенных аппаратных средствах?

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Также смотрите это.

Ответ 3

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

Соответствующий вывод о CRC для хэшей:

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

UPDATE

Кажется, сайт не работает. интернет-архив имеет копию, хотя.

Ответ 4

Я запускал каждую строку этого PHP-кода в контуре 1.000.000. Результаты приведены в комментариях (#).

hash('crc32', 'The quick brown fox jumped over the lazy dog.');#  750ms   8 chars
hash('crc32b','The quick brown fox jumped over the lazy dog.');#  700ms   8 chars
hash('md5',   'The quick brown fox jumped over the lazy dog.');#  770ms  32 chars
hash('sha1',  'The quick brown fox jumped over the lazy dog.');#  880ms  40 chars
hash('sha256','The quick brown fox jumped over the lazy dog.');# 1490ms  64 chars
hash('sha384','The quick brown fox jumped over the lazy dog.');# 1830ms  96 chars
hash('sha512','The quick brown fox jumped over the lazy dog.');# 1870ms 128 chars

Мой вывод:

  • Используйте "crc32b", когда вам нужно http://en.wikipedia.org/wiki/Cyclic_redundancy_check и вы не заботитесь о безопасности.
  • Используйте "sha256" (или выше), если вам нужен дополнительный уровень безопасности.

  • Не используйте "md5" или "sha1", потому что они имеют:

    • некоторые проблемы с безопасностью, когда вы заботитесь о безопасности
    • длинная строка hash и медленнее, чем "crc32b", когда все, что вам нужно, это CRC

Ответ 5

Информацию о реализации, скорости и надежности CRC см. в Руководстве по алгоритмам обнаружения ошибок CRC. В нем есть все на CRC.

Если кто-то не попытается злонамеренно изменить ваши данные и скрыть изменение, то CRC достаточно. Просто используйте "Хороший" (стандартный) полином.

Ответ 6

Вы не говорите, что именно вы пытаетесь защитить.

CRC часто используется во встроенных системах в качестве проверки на случайное повреждение данных, а не на предотвращение модификации вредоносной системы. Примерами мест, где может быть полезен CRC, является проверка изображения EPROM во время инициализации системы для защиты от повреждения прошивки. Системный загрузчик будет вычислять CRC для кода приложения и сравнивать с сохраненным значением, прежде чем разрешить запуск кода. Это защищает от возможности случайного повреждения программы или неудачной загрузки.

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

Были комментарии, что хэш обеспечивает большую вероятность обнаружения коррупции, чем CRC с несколькими битовыми ошибками. Это верно, и решение о том, следует ли использовать 16 или 32-битный CRC, будет зависеть от последствий безопасности испорченного блока данных и может ли вы оправдать вероятность 1 в 2 ^ 16 или 2 ^ 32 неверно объявлен блок данных.

Многие устройства имеют встроенный генератор CRC для стандартных алгоритмов. Серия MSP430F5X из Техаса имеет аппаратную реализацию стандарта CRC-CCITT.

Ответ 7

Все зависит от ваших требований и ожиданий.

Вот краткие различия между этими алгоритмами хеширования :

CRC (CRC-8/16/32/64)

  • не криптографический алгоритм хеширования (он использует линейную функцию, основанную на проверках циклического избыточного кода)
  • может выдавать 9, 17, 33 или 65 бит
  • не предназначен для использования в криптографических целях, поскольку не дает никаких криптографических гарантий,
  • непригоден для использования в цифровых подписях, потому что он легко обратим 2006,
  • не должен использоваться в целях шифрования,
  • разные строки могут генерировать коллизия,
  • изобретен в 1961 году и используется в Ethernet и многих других стандартах,

MD5

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

SHA-1

  • криптографический алгоритм хеширования,
  • создает 160-битное (20-байтовое) хеш-значение, известное как дайджест сообщения
  • это криптографический хеш, и с 2005 года он больше не считается безопасным,
  • может быть использован для целей шифрования,
  • найден пример столкновения sha1
  • впервые опубликовано в 1993 году (как SHA-0), затем в 1995 году как SHA-1,
  • серия: SHA-0, SHA-1, SHA-2, SHA-3,

    Таким образом, использование SHA-1 больше не считается безопасным против хорошо финансируемых противников, потому что в 2005 году криптоаналитики обнаружили атаки на SHA-1, что говорит о том, что он может быть недостаточно безопасным для постоянного использования schneier. NIST США рекомендует федеральным агентствам прекратить использование SHA1-1 для приложений, требующих сопротивления столкновению, и использовать SHA-2 после 2010 года NIST.

Поэтому, если вы ищете простое и быстрое решение для проверки целостности файлов (на предмет повреждения) или для каких-то простых целей кэширования с точки зрения производительности, вы можете рассмотреть CRC-32, для хеширования вы можете использовать MD5, однако, если вы разрабатываете профессиональное приложение (которое должно быть безопасным и непротиворечивым), чтобы избежать вероятности столкновения, используйте SHA-2 и выше (например, SHA-3).

Производительность

Несколько простых тестов в PHP:

# Testing static text.

$ time php -r 'for ($i=0;$i<1000000;$i++) crc32("foo");'
real    0m0.845s
user    0m0.830s
sys     0m0.008s

$ time php -r 'for ($i=0;$i<1000000;$i++) md5("foo");'
real    0m1.103s
user    0m1.089s
sys     0m0.009s

$ time php -r 'for ($i=0;$i<1000000;$i++) sha1("foo");'
real    0m1.132s
user    0m1.116s
sys   0m0.010s

# Testing random number. 

$ time php -r 'for ($i=0;$i<1000000;$i++) crc32(rand(0,$i));'
real    0m1.754s
user    0m1.735s
sys     0m0.012s\

$ time php -r 'for ($i=0;$i<1000000;$i++) md5(rand(0,$i));'
real    0m2.065s
user    0m2.042s
sys     0m0.015s

$ time php -r 'for ($i=0;$i<1000000;$i++) sha1(rand(0,$i));'
real    0m2.050s
user    0m2.021s
sys     0m0.015s

Связанный:

Ответ 8

CRC32 работает быстрее, а хэш - всего 32 бита.

Используйте его, когда вам просто нужна быстрая и световая контрольная сумма. CRC используется в ethernet.

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

Ответ 9

Используйте только CRC, если ресурсы вычислений очень плотные (например, некоторые среды встраивания), или вам нужно хранить/переносить многие выходные значения, а пространство/пропускная способность является жесткой (поскольку CRC обычно являются 32-разрядными, а MD5-вывод - 128-битным, SHA1 160 бит и другие варианты SHA до 512 бит).

Никогда не используйте CRC для проверок безопасности, поскольку CRC очень легко "подделать".

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

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

Ответ 10

Я недавно столкнулся с использованием CRC, который был умным. Автор средства идентификации и удаления дубликатов jdupe (тот же автор популярного инструмента exif jhead) использует его во время первого прохода по файлам. CRC вычисляется на первых 32 КБ каждого файла, чтобы пометить файлы, которые кажутся одинаковыми, также файлы должны иметь одинаковый размер. Эти файлы добавляются в список файлов, по которым необходимо выполнить полное двоичное сравнение. Ускоряет проверку больших медиа файлов.

Ответ 11

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

Ответ 12

Начнем с основ.

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

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

Когда вы хотите реализовать целостность сообщения - то есть сообщение не было подделано при передаче - невозможность предсказать коллизии является важным свойством. 32-битный хэш может описывать 4 миллиарда различных сообщений или файлов, используя 4 миллиарда различных уникальных хэшей. Если у вас есть 4 миллиарда и 1 файл, вы гарантированно получите 1 коллизия. Битпейс 1 ТБ имеет возможность для миллиардов столкновений. Если я злоумышленник и могу предсказать, каким будет этот 32-битный хеш, я могу создать зараженный файл, который сталкивается с целевым файлом; с таким же хешем

Кроме того, если я выполняю передачу со скоростью 10 Мбит/с, вероятность того, что пакет будет поврежден как раз в обход обхода crc32 и продолжения по пути к месту назначения и выполнения, очень мала. Допустим, на 10 Мбит/с я получаю 10 ошибок\секунду. Если я увеличу скорость до 1 Гбит/с, теперь я получаю 1000 ошибок в секунду. Если я увеличиваю до 1 exabit в секунду, то у меня уровень ошибок в 1,000,000,000 ошибок в секунду. Скажем, у нас частота столкновений 1/1 000 000 ошибок передачи. Значение 1 на миллион ошибок передачи приводит к тому, что поврежденные данные проходят через незамеченным. При скорости 10 Мбит/с я получаю данные об ошибках, которые отправляются каждые 100 000 секунд или примерно раз в день. На скорости 1 Гбит/с это происходит раз в 5 минут. С частотой 1 раз в секунду мы разговариваем несколько раз в секунду.

Если вы откроете Wireshark, вы увидите, что ваш типичный заголовок Ethernet имеет CRC32, ваш IP-заголовок имеет CRC32, а ваш TCP-заголовок имеет CRC32, и это в дополнение к тому, что могут делать протоколы более высокого уровня; например IPSEC может использовать MD5 или SHA для проверки целостности в дополнение к вышеуказанному. Существует несколько уровней проверки ошибок в типичных сетевых коммуникациях, и они ВСЕГДА бездельничают со скоростью менее 10 Мбит/с.

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

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

Для проверки файлов Md5 начинает использоваться многими поставщиками, потому что вы можете быстро создавать мультигигабайтные или многотерабайтные файлы и размещать их поверх обычного использования ОС и поддержки CRC32. Не удивляйтесь, если в течение следующего десятилетия файловые системы начнут использовать MD5 для проверки ошибок.

Ответ 13

Код CRC проще и быстрее.

Для чего вам нужно?