Означает ли идентичный криптографический хеш или контрольную сумму для двух файлов одинаковые?


57

У меня есть 2 документа Excel, и я хочу проверить, совпадают ли они, кроме имени файла.

Например, файлы называются fileone.xlsи filetwo.xls. Помимо имен файлов, их содержимое считается идентичным, но это то, что я хочу проверить.

Я искал способы проверить это и не устанавливая кучу плагинов. Там не кажется прямой путь.

Я попытался сгенерировать MD5-хэши для обоих файлов. Если хэши идентичны, означает ли это, что содержимое файла одинаково 1: 1?


8
Криптохэши, а иногда даже обычные хэши могут быть полезны для сравнения файлов в разных системах или для поиска среди большого количества файлов, но если два файла находятся в одной системе, вы можете легко сравнить их с cmpUnix или fc(сравнить файлы) в Windows.
dave_thompson_085

10
shattered.io - SHA1 является «более сильным» алгоритмом хеширования, чем md5, и все же shattered.io/static/shattered-1.pdf и shattered.io/static/shattered-2.pdf имеют одинаковое значение хеш-функции, но при этом они совершенно разные.
пенополистирол летать

30
Примечание: сначала проверьте их размеры. Если они имеют разные размеры, не открывайте файлы, они разные.
Эмилио М Бумачар

42
Упрощенная версия: хеш MD5 достаточно хорош для защиты от несчастного случая , но недостаточно для предотвращения злонамеренных действий . Достаточно ли это для вас хорошо, вы должны решить, исходя из ваших обстоятельств.
Евро Мицелли

9
diff -s file1 file2если он говорит, что они идентичны, они идентичны (он фактически сравнивает файлы по байтам, поэтому исключаются даже коллизии хешей). Контрольные суммы используются, когда у вас есть только один хеш и элемент, который считается идентичным отправителю этого хеша.
Бакуриу

Ответы:


92

Если хэши идентичны, означает ли это, что содержимое файла одинаково 1: 1?

Все файлы представляют собой набор байтов (значения 0-255). Если два файла MD5-хэшей совпадают, оба этих набора байтов, скорее всего, будут абсолютно одинаковыми (одинаковый порядок, одинаковые значения).

Существует очень небольшая вероятность того, что два файла могут генерировать один и тот же MD5, который является 128-битным хешем. Вероятность:

Вероятность случайного столкновения всего двух хэшей составляет 1/2 128, что составляет 1 на 340 ундециллионов 282 дециллионов 366 ниллионов 920 октиллионов 938 септиллионов 463 квинтиллионов 463 квинтиллионов 374 квадриллионов 607 триллионов 431 миллиардов 768 миллионов 211 тысяч 456. (из ответа на StackOverflow ).

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

Криптография зависит от этого (это один из двух способов сравнения, не зная, что это такое).

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

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

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


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

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


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

29
Бонус: если вы экспортировали в CSV, вы можете использовать уважаемую diffили аналогичную утилиту, чтобы фактически подтвердить, что файлы идентичны, а не просто иметь один и тот же хеш.
Монти Хардер

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

2
@ Тим, что ты говоришь? Он сказал: экспортируйте их в CSV и используйте diff -sдля проверки идентичности CSV. На самом деле вы можете diff -sдаже файлы Excel: если diffони говорят, что они идентичны, вам не нужно идти в сравнение CSV.
Бакуриу

2
@Bakuriu Очевидно, что мой комментарий был очень плохо сформулирован - я имел в виду, что экспорт в CSV потеряет много информации - в частности, формулы, диаграммы, условное и стандартное форматирование.
Тим

37

На практике да, идентичный криптографический хеш означает, что файлы одинаковы, если файлы не были созданы злоумышленником или другим злонамеренным объектом. Шансы случайных столкновений с любой хорошо спроектированной криптографической хеш-функцией настолько малы, что на практике они незначительны и в отсутствии активного злоумышленника.

В целом, однако, нет, мы не можем сказать, что два произвольных файла с одинаковым хешем однозначно означают, что они идентичны.

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

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

Давайте возьмем текущую рабочую лошадку, SHA-256, в качестве примера. Он выводит хэш 256 бит или 32 байта. Если у вас есть два файла, каждый из которых имеет длину ровно 32 байта, но разные, они должны (при условии отсутствия ошибок в алгоритме) хешировать разные значения, независимо от содержимого файлов; в математических терминах, хэш - функция отображения 2 на 256 входное пространство на 2 256 выходного пространства, которое должно быть можно обойтись без столкновений. Однако, если у вас есть два файла, каждый из которых имеет длину 33 байта, должна существовать некоторая комбинация входных данных, которые дают одинаковое 32-байтовое выходное хэш-значение для обоих файлов, потому что теперь мы отображаем пространство ввода 2 264 на 2 256выходное пространство; здесь мы можем легко увидеть, что в среднем должно быть 2 8 входов для каждого отдельного выхода. Продолжайте в том же духе, и для 64-байтовых файлов должно быть 2 256 входов на каждый выход!

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

Некоторые алгоритмы лучше других противостоят атакующим. MD5 обычно считается полностью сломанным в наши дни, но, в последний раз я смотрел, он все еще демонстрировал довольно хорошее сопротивление первому прообразу . SHA-1 также эффективно разрушается; атаки прообраз были продемонстрированы, но требуют особых условий, хотя нет оснований полагать, что так будет до бесконечности; как говорится, атаки всегда становятся лучше, они никогда не становятся хуже. SHA-256/384/512 в настоящее время все еще считается безопасным для большинства целей. Тем не менее , если вы просто заинтересованы в том , чтобы, если два , не со злым умыслом, действительныйфайлы одинаковы, тогда любого из них должно быть достаточно, поскольку входное пространство уже достаточно ограничено, чтобы вас больше всего интересовали случайные столкновения. Если у вас есть основания полагать, что файлы были созданы злонамеренно, то вам по крайней мере необходимо использовать криптографическую хеш-функцию, которая в настоящее время считается безопасной и которая устанавливает нижнюю планку в SHA-256.

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

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


2
Если хэши совпадают, то либо файлы являются результатом преднамеренного столкновения, либо они не совпадают, и тогда они гарантированно будут одинаковыми. Вероятность случайного столкновения чисто теоретическая. Утверждение, что «если хэши совпадают, то они, скорее всего, будут выглядеть одинаково», вводит в заблуждение: если существует злонамеренная работа, и это ситуация столкновения, то они вряд ли будут одинаковыми, а в противном случае вероятность фактически равна нулю, это не так. не какое-то маловероятное событие, от которого нужно защищаться.
Жиль "ТАК - перестань быть злым"

9
@ Жиль: наоборот. Формулировка Майкла совершенно правильная, а «гарантированный» вводит в заблуждение (или, ну, на самом деле, неверно). Вероятность того, что два файла с одинаковыми хэш-кодами не совпадают (несмотря на вредоносную модификацию), чрезвычайно мала, и на практике им можно пренебречь. Это, однако, не ноль . Как правило, есть вероятность, что по какой-либо причине разные входные данные приведут к одному и тому же хешу, и, возможно, даже с вероятностью, намного превышающей 2 ^ -128 (криптографические алгоритмы являются черным искусством, алгоритм может быть некорректным, неуловимым, неизвестным способом и мы не можем быть уверены на 100%).
Деймон

5
@ Жиль " фактически ноль " все еще не равен нулю , что означает, что все еще существует некоторая (по общему признанию, мала) вероятность того, что два разных набора данных приведут к одному и тому же хешу. Вы не можете спорить с этим.
Attie

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

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

10

Это игра с вероятностью ... хэши могут представлять конечное число значений.

Если мы рассмотрим гипотетический (и очень слабый) 8-битный алгоритм хеширования, то он может представлять 256 различных значений. Когда вы начнете запускать файлы по алгоритму, вы начнете получать хэши ... но вскоре вы начнете видеть " коллизии хешей ". Это означает, что два разных файла были введены в алгоритм, и он вывел то же значение хеш-функции, что и его выходные данные. Здесь ясно, что хеш недостаточно силен, и мы не можем утверждать, что « файлы с совпадающими хешами имеют одинаковое содержимое ».

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

При этом мы никогда не сможем достичь 100% уверенности - мы никогда не сможем с уверенностью утверждать , что два файла с одинаковым хешем действительно имеют одинаковое содержимое.

В большинстве / многих ситуациях это нормально, и сравнение хэшей « достаточно хорошо », но это зависит от вашей модели угрозы.

В конечном итоге, если вам необходимо повысить уровень достоверности, я бы порекомендовал вам сделать следующее:

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

Если вам нужно быть на 100% уверенным, то непременно начните с хэша, но если хэши совпадают, следуйте за байтовым сравнением двух файлов.


Кроме того, как отмечают другие ... сложность документов, создаваемых такими приложениями, как Word и Excel, означает, что текст, цифры, видимый макет могут быть одинаковыми, но данные, хранящиеся в файле, могут отличаться.

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


6
MD5 больше не считается адекватным, это очень верно криптографически, но для проверки уникальности (при отсутствии злого умысла, например, если вы управляете вводом) это красиво и быстро (и 128 бит должно быть достаточно)
Крис Х

4
« Проведите побитовое сравнение двух файлов. » Если вы собираетесь сравнивать файлы, вы можете сначала сделать это ... нет смысла читать все файлы, чтобы вычислить их хэши только для того, чтобы перечитать оба файла, чтобы сравнить их!
TripeHound

3
@TripeHound Это зависит от того, являются ли файлы локальными или нет ... если у вас уже есть один хеш, и вы вводите новый файл в систему, если новый файл все равно нуждается в хэше, сохраненном в базе данных, и т. Д ... Сделайте звонок, который соответствует вашей ситуации.
Атти

5
Нет, это не игра вероятностей. Вы недооцениваете, насколько маловероятно случайное столкновение. Это просто не произойдет. Немного перевернуть во время сравнения более вероятно. С другой стороны, в некоторых сценариях может произойти преднамеренное столкновение, и это вовсе не игра с вероятностью.
Жиль "ТАК - перестань быть злым"

3
@mbrig: 32-битный хэш будет иметь значительный риск случайного несоответствия. Однако переход к 128 или 256 битам имеет огромное значение. При 128 битах миллиард обезьян, каждый из которых набирает миллиард подлинно случайных документов, имел бы около 0,3% вероятности создания двух документов с одинаковым хешем. При 256 битах, даже если миллиарды обезьян могли бы печатать миллиард случайных документов приличного размера в секунду в течение миллиарда лет, вероятность того, что любой из этих миллиардов документов с совпадающими по совпадению значениями хеш-функции будет исчезающе мала.
суперкат

6

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

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

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

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

Если у вас есть инструменты Unix / Linux, то вы можете использовать cmpдля сравнения двух файлов. Для сравнения двух файлов на одном компьютере контрольные суммы только усложняют ситуацию.


Если два файла имеют одинаковый хэш MD5, и оба они не были специально созданы, то они идентичны. Это неверно. Существует бесконечное количество возможных сообщений, но есть только 2 ^ 64 возможных 64-битных хэшей. Он называется «принципом« квадратного отверстия »» : « принцип « квадратного отверстия »гласит, что если nпредметы помещаются в mконтейнеры n > m, то, по крайней мере, один контейнер должен содержать более одного элемента». Если вы создадите более 2 ^ 64 сообщений, у вас будут коллизии без какого-либо «особого крафта». И вы могли бы только с 2.
Эндрю Хенле

@AndrewHenle, MD5 - это не 64 бита, а 128. Если генерирование случайного столкновения приводит нас к временным шкалам смерти от вселенной, это «возможно» только для чрезвычайно академического (а следовательно, бесполезного) определения.
Чарльз Даффи

@CharlesDuffy Вы предполагаете, что хэш распределяется случайным образом. Это не.
Эндрю Хенле

Быть эквивалентным случайному распределению является частью определения того, что представляет собой хороший криптографический хеш - у вас есть много циклов микширования по определенной причине. Конечно, существуют слабые алгоритмы хэширования, но фокусирование на этих слабостях приводит нас к ранее заявленным предостережениям о намеренных атаках. (Или вы говорите, что MD5, как было показано, имеет только 64 бита, которые являются фактически случайными? Я признаю, что я не следил, так что это правдоподобно - ссылка, пожалуйста?)
Чарльз Даффи

@ AndrewHenle Я не утверждаю, что столкновение математически невозможно, что было бы неправильно, но здесь не имеет значения. Я утверждаю, что этого не произошло, и это правда. Ваш комментарий неверен таким образом, что полностью меняет сделку. Есть 2 ^ 128 возможных хэшей MD5, а не 2 ^ 64. Это означает, что вам нужно сгенерировать 2 ^ 128 хешей, чтобы быть уверенным, что возникнет коллизия. На самом деле, согласно парадоксу дня рождения, 2 ^ 64 даст вам макроскопический шанс столкновения между сгенерированными вами хешами (не с ранее сгенерированным хешем). Но это спорный вопрос, так как мы знаем, как создать столкновение.
Жиль "ТАК - перестань быть злым"

6

Краткий ответ. Предполагается, что криптографический хеш поможет вам быть достаточно уверенным в том, что файлы с совпадающими хешами совпадают. Если специально не созданы, шансы двух слегка отличающихся файлов с одинаковыми значениями хеша смехотворно малы. Но когда дело доходит до сравнения и проверки файлов, которые могут быть намеренно подделаны, MD5 - плохой выбор. (Используйте другую хеш-функцию, например SHA3 или BLAKE2.)

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

Десять лет назад я решил, что должен держаться как можно дальше от MD5. (Конечно, до вчерашнего дня я вспомнил неправильную причину этого; десять лет - это много, понимаете, я вспомнил свои прошлые записки, чтобы вспомнить, почему и отредактировал этот ответ.) Видите ли, в 1996 году MD5 был найден для быть подверженным столкновительным атакам. 9 лет спустя исследователи смогли создать пары документов PostScript и (ой!) Сертификатов X.509 с одинаковым хешем! MD5 был явно сломан. (Megaupload.com также использовал MD5, и вокруг коллизий хешей было много ханж-панки, которые доставляли мне проблемы в то время.)

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

У оригинального плаката, однако, есть еще меньше причин использовать MD5, потому что:

  1. Пока один сравнивает только два файла, побайтное сравнение на самом деле быстрее, чем генерирование собственных хешей MD5. Для сравнения трех или более файлов ... ну, теперь у вас есть законное основание.
  2. В ОП указаны «способы проверки этого и без установки нескольких плагинов». Команда Get-FileHash в Windows PowerShell может создавать хэши SHA1, SHA256, SHA384, SHA512 и MD5. На современных компьютерах с аппаратной поддержкой хэш-функций SHA их генерация выполняется быстрее.

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

2
@ KamilMaciorowski В теории, да, я могу. Моя пользовательская хеш-функция может просто сгенерировать копию самого большого файла. Но мне не интересно обсуждать это дальше; правда в том, что вы проголосовали против причины, которая сводится к придиркам, просто чтобы доказать, что вы умнее, и это обернулось для вас. Теперь вы не можете вернуть голос.

Я согласен с @KamilMaciorowski ... Это вероятностная игра ... с использованием одного хеша, вы можете быть " достаточно уверены ", что файлы с совпадающими хешами одинаковы, но 100% -ной гарантии нет. Использование более совершенных алгоритмов или использование нескольких алгоритмов может повысить вашу уверенность - даже сравнение размеров файлов может помочь ... но вы никогда не сможете быть уверены на 100% без проверки побайтно.
Атти

1
@ Атти Ха! Это то, что я изначально имел в виду. Благодарю. 🙏 Только я не знаком с такими шикарными фразами, как «ты можешь быть достаточно уверенным». Сожалею. 😜 Тем не менее, именно поэтому у нас есть кнопка редактирования. Лично я никогда не откажусь от хорошего ответа только потому, что одно слово в нем неверно. Я редактирую это.

1
По поводу "подмены хорошего ответа": пожалуйста, обратите внимание, что сначала я убедился, что это не опечатка, и вы действительно это имеете в виду; затем проголосовал, и в то же время я дал вам обратную связь, раскрыл мою причину в надежде, что ваш ответ станет лучше. Так и было, так что моего отрицательного голоса больше нет. По сути, я сказал вам, что я считаю неправильным в вашем ответе, Атти помог уточнить, вы улучшили ответ. С моей точки зрения, мы все справились с этой ситуацией должным образом, и вся история оказалась очень хорошей. Спасибо.
Камиль Мачоровский

5

У меня есть 2 документа Excel, и я хочу проверить, совпадают ли они, кроме имени файла.

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

Чтобы вычислить хэши, вы должны прочитать все содержимое обоих файлов.

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

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


При использовании двух файлов на одном физическом диске использование хеш-функции, которая может поддерживать скорость ввода-вывода для каждого файла в отдельности, может быть немного быстрее, чем сравнение файлов, поскольку не нужно переключаться между чтением двух файлов. Тем не менее, хэши действительно блестят, когда пытаются выполнить сравнение, включающее много файлов, которые слишком велики, чтобы поместиться в памяти. Даже если вы просто хотите выяснить, все ли они совпадают, сравнивая файл 1 с файлом 2, затем файл 1 с файлом 3, затем файл 1 с файлом 4 и т. Д., Может потребоваться почти вдвое медленнее, чем вычисление всех их хэшей.
суперкат

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

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

«Как только вы найдете разницу, вы узнаете, что файлы не идентичны» - не обязательно. XLSX-файлы - это ZIP-файлы, которые потенциально могут хранить контент в другом порядке, но при этом иметь тот же контент. Но даже если вы распакуете их и сравните каждый отдельный файл, файл XLSX содержит документы XML, которые могут иметь, например, разные окончания строк, не влияя на содержимое.
Томас Уэллер

5

Хеши, такие как MD5 или SHA, имеют фиксированную длину, скажем, это 300 буквенно-цифровых символов (на самом деле они короче и не используют весь набор буквенно-цифровых символов).

Допустим, файлы состоят из буквенно-цифровых символов и имеют размер до 2 ГБ.

Вы можете легко увидеть, что существует намного больше файлов (размером до 2 ГБ), чем возможных значений хеш-функции. Принцип Pigeonhole гласит, что некоторые (разные) файлы должны иметь одинаковые значения хеш-функции.

Кроме того, как показано в shattered.io 1, вы можете иметь два разных файла: shattered.io/static/shattered-1.pdf и shattered.io/static/shattered-2.pdf, которые имеют одинаковое значение хэш-функции SHA-1, будучи совершенно разные.

1 SHA1 - более сильный алгоритм хеширования, чем md5


Вероятность случайных столкновений слишком мала, чтобы принять во внимание. Риск преднамеренного столкновения существует и для MD5, и он хуже, чем для SHA-1, что здесь не очень важно.
Жиль "ТАК - перестань быть злым"

4

NO. Различные значения гарантируют, что файлы разные. Одни и те же значения не гарантируют, что файлы одинаковы. Относительно легко найти примеры с использованием CRC16.

На балансе вероятности с современными схемами хеширования они одинаковы.


1
Вопрос о MD5, у которого нет риска случайных столкновений. Это имеет риск преднамеренных столкновений, но это не вопрос вероятностей.
Жиль "ТАК - перестань быть злым"

1
Кроме того, речь идет о таблицах Excel с разными именами. Насколько большими они могут быть, чтобы сравнение байтов не могло быть опцией? Две схемы хеширования вместе обеспечат определенность.
mckenzm

2
@ Жиль Все хеш-коды имеют риск случайных столкновений по определению. Единственный выход из этого - использовать весь файл в качестве хеш-кода. Ваш комментарий не имеет смысла.
user207421

3

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



2

Ответ на этот OP был дан, но может быть полезным из резюме.

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

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

У вас есть такой сценарий, когда вы хотите быстро проверить, имеют ли два каталога на вашем ПК или файловом сервере одинаковое содержимое, являются ли какие-либо файлы в каталоге точными дубликатами и т. Д., И вы уверены, что файлы не имеют был изменен / незаконно изменен, и вы доверяете своему приложению / утилите хеширования для получения правильных результатов.

Если вы находитесь в ситуации, когда один из файлов - или предварительно вычисленный хэш - мог быть манипулирован или спроектирован, чтобы ввести вас в заблуждение, то вам нужен более сильный (неразбитый) хеш и / или другие средства защиты. Например, если вы загружаете файл и проверяете его действительность, проверяя хеш, то злоумышленник может создать неверный файл с правильным хешем или атаковать веб-сайт, чтобы разместить неправильный хеш, когда вы ищете «правильный». " (ожидаемое значение. Это сводится к более широким проблемам безопасности.


2

В командной строке Windows вы можете использовать compутилиту, чтобы определить, совпадают ли два файла. Например:

comp fileone.xls filetwo.xls

1

Если хэши идентичны, означает ли это, что содержимое файла одинаково 1: 1?

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


Иначе не было бы смысла их вычислять. Если вы нарушили законы математики и изобрели функцию сжатия без потерь, которая может сжимать случайные данные, нарушая принцип «квадратного отверстия», было бы очень полезно использовать его! Было бы очень удобно , если 128-битный хэш был однозначно представляет все содержимое файла. Даже если бы не было функции декомпрессии, чтобы превратить хэш обратно в файл, было бы неплохо иметь математически невозможный хеш без столкновений, например, чтобы ускорить поиск дуплексных данных в ненадежных данных, таких как образы виртуальных машин.
Питер Кордес

«Если хэши разные, это означает, что содержимое отличается». Не обязательно. XLSX-файлы являются ZIP-файлами, и один и тот же контент может храниться в другом порядке файлов.
Томас Веллер

1

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


После того, как вы выбрали хеш-функцию и придерживаетесь ее, все эти комбинации следует учитывать:

          |    identical   |   different    |
          |   hash values  |  hash values   |
----------+----------------+----------------+
identical |   can happen,  | cannot happen, |
  files   |     common     |   impossible   |
----------+----------------+----------------+
different |   can happen,  |   can happen,  |
  files   |      rare*     |     common     |
----------+----------------+----------------+

* rare, unless whoever generates (at least one of) the files
  purposely aims at this scenario

Сценарий, в котором идентичные файлы генерируют разные значения хеша, является единственным, что строго невозможно.


Всегда есть две причины :

  • Если файлы идентичны, то значения хеша точно идентичны .
  • Если значения хеш-функции различны, то файлы точно различаются .

Два аргумента, которые не являются строгими :

  • Если файлы разные, то хеш-значения, вероятно, разные.
  • Если значения хеша идентичны, то файлы, вероятно, идентичны.

0

Для ваших целей, да, идентичные хеши означают идентичные файлы.

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

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


-1

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


Это не будет работать из-за дополнительных данных, хранящихся в офисных файлах. Например, вам нужно поместить курсор в одну и ту же ячейку перед сохранением, сохранить в точное время и т. Д. Но даже в этом случае XLSX-файлы являются внутренними zip-файлами, поэтому, если этот алгоритм хранит отдельные файлы в другом порядке (для любых целей), файл идентичен, но хеш не совпадает
Томас Веллер

-2

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

Файлы могут быть идентичны. В моем коде могут быть ошибки (один из которых, на самом деле, случился на практике, сравнивал два длинных (256 байт) хешей не с memcmp, а с strcmp: сравнение вернет «то же самое», если первый байт в каждом хэше равен нулю, и вероятность это 1 в 65536. Возможно, произошла аппаратная ошибка (космический луч попал в ячейку памяти и переключил ее), или у вас может быть редкий случай двух разных файлов с одинаковым хешем (коллизия хеша).

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.