57

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

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

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

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

17 ответов17

93

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

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

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

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

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

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

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

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

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


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

Если вы хотите сравнить данные в файле, сначала экспортируйте их в CSV с теми же строками и столбцами, чтобы удалить все форматирование, а затем хэшировать или сравнивать 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.

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

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

10

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

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

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

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

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

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

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

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


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

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

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

Если два файла имеют одинаковый хэш 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 для сравнения двух файлов. Для сравнения двух файлов на одном компьютере контрольные суммы только усложняют ситуацию.

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

5

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

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

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

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

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

4

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

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

3

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

3

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

2

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

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

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

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

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

2

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

comp fileone.xls filetwo.xls
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

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


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

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

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

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

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

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

0

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

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

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

-1

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

-2

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .