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

15837
sam

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

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

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

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

57
криптохэши, а иногда даже обычные хэши могут быть полезны для сравнения файлов в разных системах или для поиска среди большого количества файлов, но если два файла находятся в одной системе, вы можете легко сравнить их с `cmp` в Unix или` fc` ( Сравнение файлов) в Windows. dave_thompson_085 5 лет назад 8
https://shattered.io/ - SHA1 является «более сильным» алгоритмом хеширования, чем md5, и до сих пор https://shattered.io/static/shattered-1.pdf и https://shattered.io/static/shattered-2 .pdf имеют одно и то же значение хеш-функции, но совершенно разные. styrofoam fly 5 лет назад 10
Примечание: сначала проверьте их размеры. Если они имеют разные размеры, не открывайте файлы, они разные. Emilio M Bumachar 5 лет назад 29
Упрощенная версия: хеш MD5 достаточно хорош для защиты от * аварии *, но недостаточно для предотвращения повторных * злонамеренных действий *. Достаточно ли это для вас хорошо, вы должны решить, исходя из ваших обстоятельств. Euro Micelli 5 лет назад 42
`diff -s file1 file2`, если он говорит, что они идентичны, они идентичны (он фактически сравнивает файлы побайтно, поэтому исключаются даже коллизии хешей). Контрольные суммы используются, когда у вас есть только один хеш и элемент, который считается идентичным отправителю этого хеша. Bakuriu 5 лет назад 8
@EmilioMBumachar зависит от определения «разные». Контент байтов может быть разным, но не семантическим. Пример, если вы просто добавляете пробелы после окончательного текста. Или в некотором структурированном формате, если у вас есть отступы, которые могут быть любой длины без отображаемого содержимого. Patrick Mevzek 5 лет назад 0
Принцип голубиных отверстий stendarr 5 лет назад 4
Сравнение двух файлов требует меньше вычислений, чем их хеширование. Хэши полезны, когда у вас есть большое количество файлов и вы хотите проверить, идентичны ли какие-либо пары. Acccumulation 5 лет назад 6
TL; DR: возможно. Nonny Moose 5 лет назад 2
@Bakuriu Или `cmp -s`, что, вероятно, более эффективно. Konrad Rudolph 5 лет назад 0
Что вы имеете в виду, когда их содержание идентично? Если у меня есть два файла, оба с одинаковыми значениями ячеек, но шрифты разные, они идентичны? Если у меня есть два файла, в которых значение и стиль каждой ячейки одинаковы, но файл хранит их в разных порядках, они одинаковые? David Rice 5 лет назад 2
Не забывайте, что некоторые операционные системы могут хранить более одного потока данных в файле. NTFS имеет альтернативные потоки, * nix имеет расширенные пользовательские атрибуты posix, у старого MacOS была ветвь ресурсов. Поэтому, если вы боитесь, что кто-то добавит скрытую информацию в файл, недостаточно хэшировать основной поток данных. b0fh 5 лет назад 2
@ Аккумуляция сравнения двух файлов по сети требует гораздо меньшей пропускной способности с хэшем. Eric Duminil 5 лет назад 0

17 ответов на вопрос

93
LawrenceC

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

Файлы Excel и другие офисные документы также могут иметь разные хэши, потому что они были открыты и повторно сохранены без каких-либо изменений, поскольку метаданные в файле имеют новое значение, сохраненное в нем для последней сохраненной даты и времени. BeowulfNode42 5 лет назад 105
Бонус: если вы экспортировали в CSV, вы можете использовать уважаемую утилиту 'diff` или аналогичную утилиту, чтобы фактически подтвердить, что файлы идентичны побайтно, а не просто иметь один и тот же хеш. Monty Harder 5 лет назад 29
Взятие хеша и создание данных, соответствующих хешу, является атакой с прообразом. Я полагаю, что MD5 в настоящее время уязвим к атакам столкновений, но я не думаю, что атаки с прообразом или вторым прообразом в настоящее время жизнеспособны. user2357112 5 лет назад 18
@ Тим, что ты говоришь? Он сказал: экспортируйте их в CSV и используйте `diff -s`, чтобы проверить идентичность CSV. Фактически вы можете `diff -s` даже в файлах Excel: если` diff` говорит, что они идентичны, вам не нужно идти к сравнению CSV. Bakuriu 5 лет назад 2
@Bakuriu Очевидно, что мой комментарий был очень плохо сформулирован - я имел в виду, что экспорт в CSV потеряет много информации - в частности, формулы, диаграммы, условное и стандартное форматирование. Tim 5 лет назад 2
Как вы пишете о небезопасности MD5, не предлагая лучший хеш, как SHA256 ... Mehrdad 5 лет назад 2
Честно говоря, речь идет о сравнении, а не о безопасности. LawrenceC 5 лет назад 1
Вы могли бы подчеркнуть больше, что логично, что несколько больших двоичных объектов данных совместно используют один и тот же хэш. Это не зависит от алгоритма хеширования и сложности создания коллизий: просто существует гораздо больше вариаций данных (а именно, бесконечное количество), чем хешей данного размера (например, 2 ^ 128 для 128-битного хэша). Отношение data -> hash является истинной функцией (которая, возможно, но не обязательно сюръективна). Отношение хэш -> данные не является функцией. Peter A. Schneider 5 лет назад 0
@MontyHarder Нет необходимости в экспорте в CSV, вы можете напрямую `diff` файлы Excel. На самом деле, я настоятельно рекомендую делать именно это (или, скорее, использовать `cmp`, что гораздо эффективнее в случае несовпадения файлов). Konrad Rudolph 5 лет назад 0
@KonradRudolph, но эти два файла могут быть идентичны во всех значимых отношениях и все же иметь некоторые различия метаданных, которые заставляют 'diff` сообщать, что они являются различными двоичными файлами. Весь смысл экспорта в CSV состоял в том, чтобы устранить эту возможность. Monty Harder 5 лет назад 1
@LawrenceC, постоянна ли вероятность столкновения двух хешей? Я думаю, что это будет зависеть от размера данных, чем больше данных, тем больше вероятность. не так ли? JITHIN JOSE 5 лет назад 0
@MontyHarder, но вы можете заставить 'diff` сообщить вам *, где * файлы Excel отличаются. Если это просто мусор метаданных в начале или конце файла, вы можете смело предположить, что содержимое и формулы электронной таблицы в остальном разумно идентичны. Doktor J 5 лет назад 0
Если это поможет, Excel (и другие файлы Office, чьи расширения имен файлов все 4-символьные `. ??? x`) - это просто деревья XML, хранящиеся в формате ZIP. Вы можете переименовать `myletter.docx` или` mycharts.xlsx` в `mywhwhat.zip`, а затем разверните файл, чтобы увидеть, как устроен формат. Так что, если вы планируете «разнести» два таких файла, вы должны использовать счетчик количества пропущенных, ведущих к смещению, соответствующий данным ZIP, вместе со всеми остальными предостережениями, которые идут вместе с файлами сравнения. Ti Strga 5 лет назад 1
В промышленных приложениях, где мы должны быть совершенно уверены, что файлы данных или приложений совпадают с ожидаемыми, мы сравниваем хеш и размер файла с ожидаемыми значениями. Я не знаю, добавляет ли сравнение размеров файлов уровень безопасности, но это стандартная практика. Jason 5 лет назад 1
@TiStrga: правильно. И помните, что файлы XML могут различаться по пробелам, порядку атрибутов, префиксам пространств имен, кодировке и т. Д., Но при этом они могут быть одинаковыми. Thomas Weller 5 лет назад 1
Если вы хотите проверить диапазон ячеек, вы можете накапливать хэш дерева, но вы должны быть заинтересованы. mckenzm 5 лет назад 0
37
a CVn

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

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

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

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

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

Если хэши совпадают, то либо файлы являются результатом преднамеренного столкновения, либо они не совпадают, и тогда они _guaranteed_ будут одинаковыми. Вероятность случайного столкновения чисто теоретическая. Утверждение, что «если хэши совпадают, то, скорее всего, они выглядят одинаково», вводит в заблуждение: если злонамеренно происходит, и это конфликтная ситуация, то они вряд ли будут одинаковыми, а в противном случае вероятность фактически равна нулю, это не так. не какое-то маловероятное событие, от которого нужно защищаться. Gilles 5 лет назад 2
@ Жиль: наоборот. Формулировка Майкла совершенно правильная, а «гарантированный» вводит в заблуждение (или, ну, на самом деле, неверно). Вероятность того, что два файла с одинаковыми хэш-кодами не совпадают (несмотря на вредоносную модификацию), чрезвычайно мала и на практике им можно пренебречь. Это, однако, не ноль. Как правило, существует вероятность того, что по какой-либо причине различные входные данные _will_ производят один и тот же хэш, и, возможно, даже с вероятностью, намного превышающей 2 ^ -128 (криптографические алгоритмы являются черным искусством, алгоритм может быть некорректным, неуловимым, неизвестным способом и мы не можем быть уверены на 100%). Damon 5 лет назад 9
Я слегка подправил ответ, чтобы попытаться ответить на комментарии выше. a CVn 5 лет назад 0
@ Жиль "_effectively zero_" по-прежнему ** _ не ноль _ **, что означает, что все еще существует некоторая (по общему признанию, мала) вероятность того, что два разных набора данных приведут к одному и тому же хешу. Вы не можете спорить с этим. Attie 5 лет назад 5
«мы не можем этого сказать» - мы можем сказать это с большей уверенностью, чем почти все мирские убеждения, что любой из нас верит в мир. Сказать, что это правда - совершенно законное использование этого слова; или ничего нет. smls 5 лет назад 1
@Attie: Вероятность того, что два несвязанных файла хэшируют к одному и тому же значению, намного ниже вероятности многих других вещей, которые могут пойти не так (например, случайные битовые ошибки, повреждающие файлы на диске), поэтому не стоит защищаться от совпадений. Защита от намеренно спроектированных матчей может быть целесообразной, но случайные матчи настолько маловероятны, что любое усилие, потраченное на их защиту, вероятно, может быть потрачено лучше в другом месте. supercat 5 лет назад 5
@ Damon Вероятность случайного столкновения MD5 слишком мала, чтобы иметь значение. Было бы бессмысленно принимать это во внимание, не принимая во внимание более вероятные события, такие как вероятность ошибки ОЗУ, приводящей к тому, что компьютер сообщает о неверном результате. Случайное столкновение гарантированно не произойдет, потому что оно не произойдет. Если бы было ложно, что идентичные хеши гарантируют, что нет случайных коллизий, то существует контрпример. Gilles 5 лет назад 0
@ Жиль не так. Вы не можете на одном дыхании сказать мне, что есть вероятность, какой бы небольшой ** вы ни оценили **, что случайное столкновение может произойти, тогда в следующем получателе столкновения не может произойти. Заявление об этом вводит в заблуждение, поскольку подразумевает свойство алгоритма хеширования, которое, как уже известно, полностью ложно. iheanyi 5 лет назад 3
@ Жиль: Я хорошо знаю, что эта вероятность настолько низка, что ее можно игнорировать. Однако _ "не имеет значения" _ и _ "не существует" _ - это не одно и то же. Возможно столкновение, и действительно, столкновения гарантированы (с крайне низкой вероятностью). Утверждение, что что-то гарантировано не произойдет, означает не меньше, чем это невозможно (с абсолютной уверенностью). Это действительно то, что означает «гарантированный», но это не так. Damon 5 лет назад 1
В качестве не совсем правильной аналогии (поскольку между этими двумя случаями существует порядка 10 порядков), вы можете заявить, что вы _гарантированы_ не выиграть в лотерею. Если это гарантировано, тогда почему люди играют в лотерею? Потому что, вы знаете, каждую вторую неделю или около того, какой-то дурак побеждает. Подумайте об этом: кто больше, дурак, дурак, который разбогател, выиграв то, что нельзя выиграть, или дурак, который был достаточно умен, чтобы не играть? Шансы могут быть смехотворными, неоправданно маловероятными - но пока есть способ, _guaranteed_ - неправильное слово. Damon 5 лет назад 0
@ Damon Где эта аналогия не удается, так это то, что между этими двумя случаями много порядков. Выиграть в лотерею очень маловероятно, но все же более вероятно, что, скажем, попадет под метеорит. И это все же гораздо более вероятно, чем обнаружение столкновения MD5 (IIRC там есть человек, который был поражен метеоритом, поэтому это не может быть таким маловероятным). Gilles 5 лет назад 0
Поиск двух входных данных, которые дают одинаковый хэш, является атакой столкновением, а не второй атакой с прообразом. Вторая прообразная атака берет один вход и находит второй вход, который дает тот же хэш; атака столкновением намного легче, потому что вам не нужно соответствовать конкретной цели. user2357112 5 лет назад 0
Если длины файлов одинаковы, и файлы имеют одинаковые хеш-коды для * более чем одного хеш-кода * (конечно, с использованием разных алгоритмов хеширования), то вероятность того, что файлы идентичны, еще выше. David R Tribble 5 лет назад 0
@ Damon: каждую неделю или две кто-то выигрывает в лотерею, но это не тот случай, когда каждую неделю или две кто-то случайным образом генерирует столкновение MD5. Это зависит только от того, говорит ли Майкл об абстрактной математической хеш-функции (в этом случае мы можем говорить о вероятности), или о реальных реальных хеш-сравнениях на реальных компьютерах (в этом случае не имеет смысла настаивать на вероятности случайное столкновение хешей, но * не * настаивают на вероятности ложного совпадения из-за гораздо более вероятной аппаратной ошибки при вычислении хешей). Steve Jessop 5 лет назад 0
Тем не менее, я согласен, что «незначительное» - лучший способ выразить то, что предлагает Жиль. Если кто-то слишком глуп, чтобы знать, что означают слова «незначительный» и / или «вероятность», или думает о том, что на самом деле делать на практике *, то вернитесь к тому, чтобы сказать им, что если хэши совпадают, то два случая, которые следует учитывать, - это то, что файлы одинаковы или что это намеренно сгенерированное столкновение. Нет смысла добавлять «или случайное столкновение MD5; или космический луч попал в вашу память; или в sshlib была ранее необнаруженная ошибка», хотя технически они все кандидаты. Steve Jessop 5 лет назад 0
@ user2357112 Исправлено. a CVn 5 лет назад 0
10
Attie

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

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

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

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

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

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

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

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


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

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

* MD5 больше не считается адекватным * очень криптографически верно, но для проверки уникальности (при отсутствии злого умысла, например, если вы управляете вводом) это хорошо и быстро (и 128 бит должно быть достаточно) Chris H 5 лет назад 6
«конфликт хэшей с одинаковыми размерами файлов менее вероятен». - На самом деле, коллизии, созданные для MD5, обычно имеют одинаковый размер файла. Paŭlo Ebermann 5 лет назад 0
"_последуйте за байтовым сравнением двух файлов ._" Если вы собираетесь делать сравнение файлов, вы можете также сделать это сначала ... нет смысла читать все файлы для вычисления их хэши только для того, чтобы перечитать оба файла, чтобы сравнить их! TripeHound 5 лет назад 4
@TripeHound Это зависит от того, являются ли файлы локальными или нет ... если у вас уже есть один хеш и вы вводите новый файл в систему, если новый файл все равно нуждается в хэше, сохраненном в базе данных, и т. Д ... Сделайте звонок, который соответствует вашей ситуации. Attie 5 лет назад 3
@ PaŭloEbermann Я бы ошибался - спасибо и исправил. Attie 5 лет назад 0
@ Крис Честное слово, спасибо - я обновил свой ответ. Attie 5 лет назад 0
Нет, это не игра вероятностей. Вы недооцениваете, насколько маловероятно случайное столкновение. Это просто не произойдет. Немного перевернуть во время сравнения более вероятно. С другой стороны, в некоторых сценариях может произойти преднамеренное столкновение, и это вовсе не игра с вероятностью. Gilles 5 лет назад 5
@ Жиль, нет, как говорит Атти, это буквально вероятностная игра, основанная на том, сколько битов в хэше и сколько файлов вы ожидаете работать. 32-битный хэш, вероятно, будет работать нормально (исключая злонамеренность) для среднего пользователя настольного компьютера (CRC32 по-прежнему популярен для некоторых видов загружаемых видеофайлов), но не для файловой системы больших данных масштаба Google. mbrig 5 лет назад 2
@mbrig: 32-битный хэш будет иметь значительный риск случайного несоответствия. Однако переход к 128 или 256 битам имеет огромное значение. При 128 битах миллиард обезьян, каждый из которых набирает миллиард подлинно случайных документов, имел бы около 0,3% вероятности создания двух документов с одинаковым хешем. При 256 битах, даже если миллиарды обезьян могли бы печатать миллиард случайных документов приличного размера в секунду в течение миллиарда лет, вероятность того, что любой из этих миллиардов документов с совпадающими по совпадению значениями хеш-функции будет исчезающе мала. supercat 5 лет назад 3
@mbrig С CRC это отчасти вероятностная игра. С криптографическим хэшем, даже взломанным, вероятность не имеет значения: вы никогда не выиграете эту игру. И наоборот, независимо от того, что такое хэш, вам нужно выяснить, являются ли преднамеренные коллизии проблемой, а это вовсе не вероятность. Gilles 5 лет назад 0
@Gilles: Единственное, что сделало бы его более вероятностной игрой с CRC, чем какой-либо другой хэш, это то, что CRC обычно короче. В противном случае CRC часто будет менее вероятностной игрой, поскольку определенные факторы могут создавать корреляции. В качестве простого примера, если Acme Spreadsheet обеспечивает целостность файла, сохраняя 32-битный CRC с каждым файлом, другие инструменты для вычисления CRC файлов могут сообщить, что все файлы Acme Spreadsheet имеют CRC, равный нулю, поскольку добавленная CRC будет шаблоном битов, которые при добавлении к предыдущему контенту сделали бы CRC объединенного файла нулевым. supercat 5 лет назад 1
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 их генерация выполняется быстрее.
Вы можете создать свою собственную криптографическую хеш-функцию любой длины, которую вы выберете, правда; но тогда он имеет * фиксированную * длину, и в любом случае применяется принцип «голубиного отверстия». Общий ответ: «сравнивая только их хэши, вы не можете быть уверены, что эти два файла идентичны». Kamil Maciorowski 5 лет назад 6
@ KamilMaciorowski В теории, да, я могу. Моя пользовательская хеш-функция может просто сгенерировать копию самого большого файла. Но мне не интересно обсуждать это дальше; правда в том, что вы проголосовали против причины, которая сводится к придиркам только для того, чтобы доказать, что вы умнее, и это имело неприятные последствия для вас. Теперь вы не можете вернуть голос. 5 лет назад 2
Я согласен с @KamilMaciorowski ... Это вероятностная игра ... с использованием одного хэша, вы можете быть "_reasonly уверены_", что файлы с совпадающими хэшами одинаковы, но нет 100% гарантии. Использование более совершенных алгоритмов или использование нескольких алгоритмов может повысить вашу уверенность - даже сравнение размеров файлов может помочь ... но вы никогда не сможете быть на 100% уверены, не проверяя побайтный байт. Attie 5 лет назад 0
@ Атти Ха! Это то, что я изначально имел в виду. Благодарю. Только я не знаком с шикарными фразами типа «ты можешь быть достаточно уверен в себе». Сожалею. Тем не менее, именно поэтому у нас есть кнопка редактирования. Лично я никогда не откажусь от хорошего ответа только потому, что одно слово в нем неверно. Я редактирую это. 5 лет назад 1
По поводу "подмены хорошего ответа": пожалуйста, обратите внимание, что сначала я убедился, что это не опечатка, и вы действительно это имеете в виду; затем проголосовал, и в то же время я дал вам обратную связь, раскрыл мою причину в надежде, что ваш ответ станет лучше. Так и было, так что моего отрицательного голоса больше нет. По сути, я сказал вам, что я считаю неправильным в вашем ответе, Атти помог уточнить, вы улучшили ответ. С моей точки зрения, мы все справились с этой ситуацией должным образом, и вся история оказалась очень хорошей. Спасибо. Kamil Maciorowski 5 лет назад 1
@KamilMaciorowski Очень хорошо; Я принимаю это как акт доброй воли. 5 лет назад 0
6
Gilles

Если два файла имеют одинаковый хэш 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-битных хэшей. Он называется ["принцип голубя") (https://en.wikipedia.org/wiki/Pigeonhole_principle): "принцип голубя гласит, что если элементы` n` помещаются в контейнеры `m`, то при` n> m` тогда хотя бы один контейнер должен содержать более одного предмета ". Если вы создадите более 2 ^ 64 сообщений, у вас будут коллизии без какого-либо «специального крафта». И вы * можете * только с 2. Andrew Henle 5 лет назад 0
@AndrewHenle, MD5 - это не 64 бита, а 128. Если генерирование случайного столкновения приводит нас к шкале времени смерти от вселенной, это «возможно» только для чрезвычайно академического (а следовательно, бесполезного) определения. Charles Duffy 5 лет назад 0
@CharlesDuffy Вы предполагаете, что хэш распределяется случайным образом. Это не. Andrew Henle 5 лет назад 0
Быть эквивалентным случайному распределению является частью определения того, что представляет собой хороший криптографический хеш - у вас есть много циклов микширования по определенной причине. Конечно, существуют слабые алгоритмы хэширования, но фокусирование на этих слабостях приводит нас к ранее заявленным предостережениям о намеренных атаках. (Или вы говорите, что MD5, как было показано, имеет только 64 бита, которые являются фактически случайными? Я признаю, что не следил, так что это правдоподобно - ссылка, пожалуйста?) Charles Duffy 5 лет назад 0
@ AndrewHenle Я не утверждаю, что столкновение математически невозможно, что было бы неправильно, но здесь не имеет значения. Я утверждаю, что этого не произошло, и это правда. Ваш комментарий неверен в том смысле, что полностью меняет сделку. Есть 2 ^ 128 возможных хэшей MD5, а не 2 ^ 64. Это означает, что вам нужно сгенерировать 2 ^ 128 хешей, чтобы быть уверенным, что возникнет коллизия. На самом деле, согласно парадоксу дня рождения, 2 ^ 64 даст вам макроскопический шанс столкновения между сгенерированными вами хешами (не с ранее сгенерированным хешем). Но это спорный вопрос, так как мы знаем, как создать столкновение. Gilles 5 лет назад 0
* Если два файла имеют одинаковый хэш MD5, и оба они не были специально обработаны, то они идентичны. * Это утверждение, в котором утверждается, что ** единственный ** способ получить коллизию - это "специально обработать" один , Это не правильно. Столкновения возможны, как бы маловероятно. * Я утверждаю, что этого не произошло, и это правда. * Опять же, вы не правы. Столкновения могут произойти. Я был свидетелем одного. Andrew Henle 5 лет назад 0
@CharlesDuffy * Или вы говорите, что MD5, как было показано, имеет только 64 бита, которые являются фактически случайными? * Я изменил 128 на 64, чтобы соответствовать пределу поста - это было настолько узко. Принцип остается тем же, хотя. Andrew Henle 5 лет назад 0
@AndrewHenle Если вы были свидетелем _accidental_ столкновения MD5, пожалуйста, опубликуйте его. Ты был бы первым. «Я изменил 128 на 64, чтобы соответствовать пределу поста - это было так жестко. Принцип остается тем же самым. ”Вы что? Нет, 2 ^ 128 на столько порядков больше, чем 2 ^ 64, что имеет качественное значение. Это разница между «запустить компьютер на некоторое время» и «не на всю жизнь». Gilles 5 лет назад 0
5
styrofoam fly

Хеши, такие как 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, что здесь не очень важно. Gilles 5 лет назад 0
5
Andrew Henle

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

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

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

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

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

При использовании двух файлов на одном физическом диске использование хеш-функции, которая может поддерживать скорость ввода-вывода для каждого файла в отдельности, может быть немного быстрее, чем сравнение файлов, так как не будет необходимости переключаться между чтением двух файлов. Тем не менее, хэши действительно блестят, когда пытаются выполнить сравнение, включающее много файлов, которые слишком велики, чтобы поместиться в памяти. Даже если вы просто хотите выяснить, все ли они совпадают, сравнивая файл 1 с файлом 2, затем файл 1 с файлом 3, затем файл 1 с файлом 4 и т. Д., Может потребоваться почти вдвое медленнее, чем вычисление всех их хэшей. supercat 5 лет назад 0
@supercat Если файлы читаются порциями размером более МБ или около того, переключение между файлами не будет заметно. И если рабочий процесс предполагает сравнение группы файлов для поиска дубликатов, хэш может быть вычислен так же, как записан каждый файл - так как это можно сделать практически бесплатно. Andrew Henle 5 лет назад 0
Если у вас достаточно места для буферизации больших порций файлов, время переключения не должно быть проблемой, но в противном случае они могут быть. Что касается вычисления хэшей при записи файлов, это может быть хорошо, если можно гарантировать, что файлы не могут быть изменены без изменения или, по крайней мере, аннулирования сохраненных хэшей. Если кто-то пытается избежать резервного копирования файлов с избыточностью, просмотр только сохраненных значений хеш-функции может привести к тому, что он создаст резервную копию случайно поврежденного файла, но не будет создавать резервные копии не поврежденных файлов, которым поврежденный файл * должен * соответствовать *, но * не «т *. supercat 5 лет назад 0
«Как только вы найдете разницу, вы узнаете, что файлы не идентичны» - не обязательно. XLSX-файлы - это ZIP-файлы, которые потенциально могут хранить контент в другом порядке, но при этом иметь тот же контент. Но даже если вы распакуете их и сравните каждый отдельный файл, файл XLSX содержит документы XML, которые могут иметь, например, разные окончания строк, не влияя на содержимое. Thomas Weller 5 лет назад 0
4
mckenzm

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

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

Вопрос о MD5, у которого нет риска случайных столкновений. Это имеет риск преднамеренных столкновений, но это не вопрос вероятностей. Gilles 5 лет назад 1
Кроме того, речь идет о таблицах Excel с разными именами. Насколько они могут быть большими, чтобы сравнение байтов не могло быть опцией? Две схемы хеширования вместе обеспечат определенность. mckenzm 5 лет назад 1
@ Жиль * Все * хэш-коды по определению имеют риск случайных столкновений. Единственный выход из этого - использовать весь файл в качестве хеш-кода. Ваш комментарий не имеет смысла. user207421 5 лет назад 2
3
David Rice

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

3
Giulio Muscarello

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

Ответ только на ссылку, но интересный. Thomas Weller 5 лет назад 0

Похожие вопросы