У меня есть 2 документа Excel, и я хочу проверить, совпадают ли они, кроме имени файла.
Например, файлы называются fileone.xls
и filetwo.xls
. Помимо имен файлов, их содержимое считается идентичным, но это то, что я хочу проверить.
Я искал способы проверить это и не устанавливая кучу плагинов. Там не кажется прямой путь.
Я попытался сгенерировать MD5-хэши для обоих файлов. Если хэши идентичны, означает ли это, что содержимое файла одинаково 1: 1?
cmp
Unix илиfc
(сравнить файлы) в Windows.diff -s file1 file2
если он говорит, что они идентичны, они идентичны (он фактически сравнивает файлы по байтам, поэтому исключаются даже коллизии хешей). Контрольные суммы используются, когда у вас есть только один хеш и элемент, который считается идентичным отправителю этого хеша.Ответы:
Все файлы представляют собой набор байтов (значения 0-255). Если два файла MD5-хэшей совпадают, оба этих набора байтов, скорее всего, будут абсолютно одинаковыми (одинаковый порядок, одинаковые значения).
Существует очень небольшая вероятность того, что два файла могут генерировать один и тот же MD5, который является 128-битным хешем. Вероятность:
Хэши предназначены для работы «только в одном направлении» - то есть вы берете коллекцию байтов и получаете хэш, но вы не можете взять хэш и вернуть коллекцию байтов.
Криптография зависит от этого (это один из двух способов сравнения, не зная, что это такое).
Примерно в 2005 году были обнаружены методы для
получения хеша MD5 и создания данных, соответствующих этому хешу, длясоздания двух документов с одинаковым хешем MD5 ( атака коллизий ). Смотрите @ user2357112 комментарий ниже. Это означает, что злоумышленник может создать два исполняемых файла, например, с одним и тем же MD5, и, если вы решите, кому доверять, вы будете обмануты.Таким образом, MD5 не должен использоваться для криптографии или безопасности. Например, плохо публиковать MD5 на сайте загрузки, чтобы обеспечить целостность загрузки. В зависимости от хеша MD5 вы сами не создавали для проверки того, что файл или содержимое данных - это то, чего вы хотите избежать.
Если вы создаете свой собственный, вы знаете, что не злите себя (надеюсь). Так что для вашего использования это нормально, но если вы хотите, чтобы кто-то еще мог его воспроизвести, и вы хотите опубликовать хеш MD5, следует использовать более качественный хеш.
Обратите внимание, что два файла Excel могут содержать одинаковые значения в одних и тех же строках и столбцах, но при этом общий поток файла может полностью отличаться из-за разного форматирования, стилей, настроек и т. Д.
Если вы хотите сравнить данные в файле, сначала экспортируйте их в CSV с теми же строками и столбцами, чтобы убрать все форматирование, а затем хэшировать или сравнивать CSV.
источник
diff
или аналогичную утилиту, чтобы фактически подтвердить, что файлы идентичны, а не просто иметь один и тот же хеш.diff -s
для проверки идентичности CSV. На самом деле вы можетеdiff -s
даже файлы Excel: еслиdiff
они говорят, что они идентичны, вам не нужно идти в сравнение 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% уверенности - мы никогда не сможем с уверенностью утверждать , что два файла с одинаковым хешем действительно имеют одинаковое содержимое.
В большинстве / многих ситуациях это нормально, и сравнение хэшей « достаточно хорошо », но это зависит от вашей модели угрозы.
В конечном итоге, если вам необходимо повысить уровень достоверности, я бы порекомендовал вам сделать следующее:
Если вам нужно быть на 100% уверенным, то непременно начните с хэша, но если хэши совпадают, следуйте за байтовым сравнением двух файлов.
Кроме того, как отмечают другие ... сложность документов, создаваемых такими приложениями, как Word и Excel, означает, что текст, цифры, видимый макет могут быть одинаковыми, но данные, хранящиеся в файле, могут отличаться.
Excel особенно плох в этом - простое открытие электронной таблицы с сохранением ( ничего не сделав ) может создать новый файл с другим содержимым.
источник
Если два файла имеют одинаковый хэш 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
для сравнения двух файлов. Для сравнения двух файлов на одном компьютере контрольные суммы только усложняют ситуацию.источник
n
предметы помещаются вm
контейнерыn > m
, то, по крайней мере, один контейнер должен содержать более одного элемента». Если вы создадите более 2 ^ 64 сообщений, у вас будут коллизии без какого-либо «особого крафта». И вы могли бы только с 2.Краткий ответ. Предполагается, что криптографический хеш поможет вам быть достаточно уверенным в том, что файлы с совпадающими хешами совпадают. Если специально не созданы, шансы двух слегка отличающихся файлов с одинаковыми значениями хеша смехотворно малы. Но когда дело доходит до сравнения и проверки файлов, которые могут быть намеренно подделаны, MD5 - плохой выбор. (Используйте другую хеш-функцию, например SHA3 или BLAKE2.)
Длинный ответ: Идеальная хеш-функция - это та, которая создает почти уникальный криптографический хеш для каждого уникального фрагмента данных. Другими словами, мы определенно знаем, что в этом юниверсе есть два файла, чьи значения хэшей конфликтуют, вероятность того, что эти два файла естественно объединятся, смехотворно мала.
Десять лет назад я решил, что должен держаться как можно дальше от MD5. (Конечно, до вчерашнего дня я вспомнил неправильную причину этого; десять лет - это много, понимаете, я вспомнил свои прошлые записки, чтобы вспомнить, почему и отредактировал этот ответ.) Видите ли, в 1996 году MD5 был найден для быть подверженным столкновительным атакам. 9 лет спустя исследователи смогли создать пары документов PostScript и (ой!) Сертификатов X.509 с одинаковым хешем! MD5 был явно сломан. (Megaupload.com также использовал MD5, и вокруг коллизий хешей было много ханж-панки, которые доставляли мне проблемы в то время.)
Итак, я пришел к выводу, что, хотя MD5 был (и остается) надежным для сравнения доброкачественных файлов, его нужно полностью прекратить. Я полагал, что зависимость от него может превратиться в снисходительность и ложную уверенность: как только вы начнете сравнивать файлы, используя их хеши MD5, однажды вы забудете точный отпечаток безопасности и сравните два файла, которые намеренно созданы для того, чтобы иметь одинаковый хеш. Кроме того, процессоры и криптопроцессоры вряд ли добавят в него поддержку.
У оригинального плаката, однако, есть еще меньше причин использовать MD5, потому что:
источник
С практической точки зрения, непосредственное сравнение файлов, чтобы выяснить, отличаются ли они, будет быстрее, чем вычисление хеша для каждого файла, а затем сравнение этого хеша.
Чтобы вычислить хэши, вы должны прочитать все содержимое обоих файлов.
Чтобы определить, идентичны ли они с помощью прямого сравнения, вам просто нужно прочитать содержимое обоих файлов, пока они не совпадут. Как только вы обнаружите разницу, вы узнаете, что файлы не идентичны, и вам не нужно больше читать данные ни из одного файла.
И прежде чем сделать это, вы можете просто сравнить размеры двух файлов. если размеры отличаются, то содержимое не может быть одинаковым.
источник
Хеши, такие как 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
источник
NO. Различные значения гарантируют, что файлы разные. Одни и те же значения не гарантируют, что файлы одинаковы. Относительно легко найти примеры с использованием CRC16.
На балансе вероятности с современными схемами хеширования они одинаковы.
источник
Однако ваш вопрос задом наперед - давайте предположим, что хеш означает, что они имеют одинаковые данные (что не гарантируется на 100%, но вполне достаточно для сравнения файлов каждую секунду, чтобы не столкнуться с коллизией). Из этого не обязательно следует, что наличие одинаковых данных означает, что они будут иметь одинаковый хэш. Так что нет - вы не можете сравнить данные в файле Excel с данными в другом файле Excel, хэшируя файл, потому что существует множество способов, которыми два файла могут отличаться без различия базовых данных. Один очевидный способ - данные хранятся в формате XML, каждая ячейка имеет свой собственный узел XML. Если эти узлы хранятся в разных порядках, то данные совпадают, но файл отличается.
источник
Чтобы добавить к другим ответам, вот много примеров пар файлов с одинаковым хешем MD5 и разным содержимым.
источник
Ответ на этот OP был дан, но может быть полезным из резюме.
Если вы хотите проверить, являются ли два файла одинаковыми, многое зависит от того, находятся ли файлы и хэши под вашим контролем.
Если вы сами генерируете хэши из файлов и уверены, что никто не имел возможности / навыка / мотивации умышленно попытаться заставить вас прийти к неверному выводу, тогда почти любой хеш - даже «известные битые» хеши, такие как MD5 и SHA1, почти наверняка будет достаточно. Но это, я имею в виду вы можете создавать файлы с высокой скоростью в течение миллионов лет , и вы по- прежнему вряд ли в конечном итоге с двумя файлами, которые на самом деле разные , но имеют один и тот же хэш. Это почти наверняка безопасно.
У вас есть такой сценарий, когда вы хотите быстро проверить, имеют ли два каталога на вашем ПК или файловом сервере одинаковое содержимое, являются ли какие-либо файлы в каталоге точными дубликатами и т. Д., И вы уверены, что файлы не имеют был изменен / незаконно изменен, и вы доверяете своему приложению / утилите хеширования для получения правильных результатов.
Если вы находитесь в ситуации, когда один из файлов - или предварительно вычисленный хэш - мог быть манипулирован или спроектирован, чтобы ввести вас в заблуждение, то вам нужен более сильный (неразбитый) хеш и / или другие средства защиты. Например, если вы загружаете файл и проверяете его действительность, проверяя хеш, то злоумышленник может создать неверный файл с правильным хешем или атаковать веб-сайт, чтобы разместить неправильный хеш, когда вы ищете «правильный». " (ожидаемое значение. Это сводится к более широким проблемам безопасности.
источник
В командной строке Windows вы можете использовать
comp
утилиту, чтобы определить, совпадают ли два файла. Например:источник
Нет . Если хэш разные, это делает означает , что содержание различно. Равные хеш-коды не подразумевают равное содержание. По определению хеш-код - это сокращение большого домена до меньшего диапазона: это означает, что хак-коды по неравному содержанию могут быть равны. Иначе не было бы смысла их вычислять.
источник
Этот ответ предназначен для удобной карты сценариев, которые могут или не могут произойти, и обоснований, которые вы можете применить. Обратитесь к другим ответам, чтобы узнать, почему хэш-функции работают таким образом.
После того, как вы выбрали хеш-функцию и придерживаетесь ее, все эти комбинации следует учитывать:
Сценарий, в котором идентичные файлы генерируют разные значения хеша, является единственным, что строго невозможно.
Всегда есть две причины :
Два аргумента, которые не являются строгими :
источник
Для ваших целей, да, идентичные хеши означают идентичные файлы.
Как ясно из других ответов, можно создать 2 разных файла, которые приведут к одному и тому же хешу, и MD5 не особенно надежен в этом отношении.
Поэтому используйте более сильный алгоритм хеширования, если вы планируете сравнивать большое количество документов Excel или думаете, что кто-то может захотеть манипулировать сравнением. SHA1 лучше, чем MD5. SHA256 снова лучше и должен дать вам полную уверенность для вашего конкретного использования.
источник
Файлы, вероятно, идентичны, если их хеши идентичны. Вы можете повысить достоверность, изменив оба файла одинаковым образом (например, поместив одно и то же значение в одну и ту же неиспользуемую ячейку), а затем сравнив хеши модифицированных файлов. Трудно создать преднамеренное столкновение для файла, который изменен способом, неизвестным заранее.
источник
Давайте посмотрим на это на практике. Вместо того чтобы сказать «хэши идентичны», я скажу: «Я написал компьютерную программу, которая вычисляет хэши двух файлов и распечатывает, являются ли они одинаковыми или нет», и я запускаю программу с двумя файлами, и она говорит «идентичны». Есть несколько причин, почему это может сделать это:
Файлы могут быть идентичны. В моем коде могут быть ошибки (один из которых, на самом деле, случился на практике, сравнивал два длинных (256 байт) хешей не с memcmp, а с strcmp: сравнение вернет «то же самое», если первый байт в каждом хэше равен нулю, и вероятность это 1 в 65536. Возможно, произошла аппаратная ошибка (космический луч попал в ячейку памяти и переключил ее), или у вас может быть редкий случай двух разных файлов с одинаковым хешем (коллизия хеша).
Я бы сказал, что для неидентичных файлов, безусловно, наиболее вероятной причиной является ошибка программиста, затем идет космический луч, который изменил логическую переменную с результатом сравнения хешей с «ложного» на «истинный», и гораздо позже совпадение хеш-столкновения.
Существуют корпоративные системы резервного копирования, которые предотвращают резервное копирование идентичных файлов от 10 000 пользователей путем хеширования каждого файла и проверки файла с идентичным хешем, уже сохраненного на сервере. Таким образом, в случае столкновения файл не будет скопирован, что может привести к потере данных. Кто-то подсчитал, что гораздо более вероятно, что метеорит попадет на ваш сервер и уничтожит все резервные копии, чем потеряет файл, потому что его контрольная сумма совпадает с другим файлом.
источник