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

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

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

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

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

17 ответов

Решение

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

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

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

Вероятность случайного столкновения всего двух хэшей составляет 1/2128, что составляет 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.

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

The answer for this OP has been given but might benefit from a summary.

If you want to check whether two files are the same, a lot depends on whether or not the files and hashes are under your control.

If you generate the hashes yourself from the files, and you are pretty sure nobody else had opportunity/skill/motivation to deliberately try and make you reach the wrong conclusion, then almost any hash - even "known broken" hashes like MD5 and SHA1 are almost certain to be sufficient. But that, I mean you could generate files at high speed for millions of years and you'd still be unlikely to end up with any two files that are actually different but have the same hash. It's almost certainly safe.

This is the scenario you have, when you want to quickly check if two directories on your PC or file server have the same content, if any files in a directory are exact duplicates, etc, and you're pretty sure the files haven't been engineered/illicitly modified, and you trust your hashing app/utility to give correct results.

If you are in a scenario where one of the files - or a precalculated hash - might have been manipulated or engineered to fool you into a wrong conclusion, then you need a stronger (unbroken) hash, and/or other security. For example, if you download a file and check if it's valid by examining a hash, then an attacker might be able to engineer a bad file with the correct hash, or attack the website to place an incorrect hash when you look for the "right" (expected) value. This comes down to wider security issues.

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

comp fileone.xls filetwo.xls

Если хэши идентичны, означает ли это, что содержимое файла одинаково 1: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

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


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

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам