Чи однаковий криптографічний хеш або контрольна сума для двох файлів означає, що вони однакові?


57

У мене є 2 відмінні документи, і я хочу перевірити, чи вони однакові, крім імені файлу.

Наприклад, файли називаються fileone.xlsі filetwo.xls. Окрім назв файлів, їх вміст вважається однаковим, але це те, що я хочу перевірити.

Я шукав способи переглянути це і не встановлювати купу плагінів. Немає прямого прямого шляху.

Я спробував генерувати хеші MD5 для обох файлів. Якщо хеші однакові, чи означає це, що вміст файлу 1: 1 однаковий?


8
криптовалюти, а іноді навіть звичайні хеші можуть бути корисними для порівняння файлів у різних системах або пошуку серед великої кількості файлів, але якщо два файли є в одній системі, ви можете просто порівняти їх з cmpUnix або fc(порівняння файлів) у Windows.
dave_thompson_085

10
shattered.io - SHA1 - "сильніший" алгоритм хешування, ніж md5 і все ще shattered.io/static/shattered-1.pdf та shattered.io/static/shattered-2.pdf мають однакове хеш-значення, будучи абсолютно іншим.
стиропор летить

30
Бічна примітка: спочатку перевірте їх розміри. Якщо вони мають різні розміри, не перешкоджайте відкриванню файлів, вони різні.
Еміліо М Бумачар

42
Спрощена версія: хеш MD5 досить хороший для захисту від аварії , він недостатньо хороший для запобігання зловмисності . Чи достатньо це для вас, ви повинні вирішити, виходячи з ваших обставин.
Євро Міцеллі

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

Відповіді:


93

Якщо хеші однакові, чи означає це, що вміст файлу 1: 1 однаковий?

Усі файли - це набір байтів (значення 0-255). Якщо два файли хешей MD5 відповідають, обидва ці колекції байтів є надзвичайно ймовірними абсолютно однаковими (однаковий порядок, однакові значення).

Є дуже маленький шанс, що два файли можуть генерувати той самий MD5, що є 128-бітним хешем. Ймовірність така:

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

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

Від цього залежить криптографія (це один спосіб порівняння двох речей, не знаючи, що це за речі.)

Близько 2005 року було виявлено методи взяти хеш MD5 та створити дані, які відповідають тому, що хеш створюють два документи, які мали однаковий хеш MD5 ( атака зіткнення ). Дивіться коментар @ user2357112 нижче. Це означає, що зловмисник може створити два виконувані файли, наприклад, які мають однаковий MD5, і якщо ви залежаєте від MD5, щоб визначити, якому слід довіряти, вас обдурять.

Таким чином, MD5 не слід використовувати для криптографії або захисту. Дуже погано публікувати MD5 на сайті завантаження, щоб забезпечити, наприклад, цілісність завантаження. Залежно від хеша MD5, ви не створили себе, щоб перевірити вміст файлу чи даних - це те, чого ви хочете уникати.

Якщо ви генеруєте свій власний, ви знаєте, що не шкодите собі (сподіваємось). Отже, для вашого використання це нормально, але якщо ви хочете, щоб хтось інший міг його відтворити, і ви хочете публічно опублікувати хеш MD5, слід використовувати кращий хеш.


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

Якщо ви хочете порівняти дані у файлі, експортуйте їх у CSV спочатку з тими ж рядками та стовпцями, щоб викреслити все форматування, а потім хеш або порівняти CSV.


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

29
Бонус: якщо ви експортували в CSV, ви можете використовувати поважну diffабо подібну утиліту, щоб фактично підтвердити, що файли є байт-за-байтом ідентичними, а не просто мають однаковий хеш.
Monty Harder

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

2
@Tim що ти кажеш? Він сказав: експортуйте їх у CSV та використовуйте, diff -sщоб перевірити, чи CSV однаковий. Насправді ви diff -sнавіть можете користуватися файлами excel: якщо diffвони говорять, що вони однакові, вам не потрібно йти на порівняння CSV.
Бакуріу

2
@Bakuriu Ясно, що мій коментар був дуже погано сформульований - я мав на увазі, що експорт до CSV втратить багато інформації - зокрема формули, діаграми, умовне та стандартне форматування.
Тім

37

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

Загалом, однак, ні, ми не можемо сказати, що два довільних файли, що мають один і той же хеш, безумовно означають, що вони однакові.

Те, як працює криптографічна хеш-функція, - це взяти вхід довільної довжини та вивести значення фіксованої довжини, обчислене з входу. Деякі хеш-функції мають декілька вихідних довжин на вибір, але вихід все ще певною мірою має значення фіксованої довжини. Це значення буде до декількох десятків байт; алгоритми хешування з найдовшим вихідним значенням у загальному використанні сьогодні мають 512-бітний вихід, а 512-бітний вихід 64 байти.

Якщо вхід до хеш-функції довший, ніж вихід хеш-функції, слід усунути деяку точність, щоб вхід підходив до виводу. Отже, повинно існувати кілька входів довжин, більших за довжину виводу, які генерують однаковий вихід.

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

Криптографічні хеш-функції розроблені таким чином, що обчислювально важко скласти вхід, який дає певний вихід, або скласти два входи, що дають однаковий вихід. Це відоме як опір попередньої атаки або опір атаці зіткнення . Знайти ці зіткнення не неможливо ; це просто призначено бути справді, дійсно, справді, дуже важко. (Трохи особливий випадок нападу зіткнення - це день народження .)

Деякі алгоритми краще протистоять атакуючим. MD5, як правило, вважається повністю зламаним в ці дні, але останнє, що я подивився, він все ще мав досить гарну стійкість до першого зображення . SHA-1 також ефективно порушується; попередні атаки були продемонстровані, але вимагають конкретних умов, хоча немає підстав вважати, що так буде нескінченно; як говориться, напади завжди стають кращими, вони ніколи не стають гіршими. В даний час SHA-256/384/512 вважається безпечним для більшості цілей. Однак , якщо ви просто зацікавлені в тому, чи є дві неправомірно розроблені, дійсніФайли однакові, то будь-якого з них повинно бути достатньо, оскільки вхідний простір вже достатньо обмежений, щоб вас найбільше цікавили випадкові зіткнення. Якщо у вас є якісь підстави вважати, що файли були створені зловмисно, вам потрібно як мінімум використовувати криптографічну хеш-функцію, яка в даний час вважається безпечною, що ставить нижню смугу на SHA-256.

Перший малюнок - знайти вхід, який дає конкретне хеш-вихідне значення; другий малюнок - це знайти один вхід, який дає такий же вихід, як і інший, зазначений вхід; зіткнення полягає у знаходженні двох входів, які дають однаковий вихід, без огляду на те, що це таке, а іноді і без огляду на те, що є входами.

Все, що сказано, важливо пам’ятати, що файли можуть мати дуже різні подання даних і все одно відображати абсолютно однакові. Таким чином, вони можуть бути однаковими, навіть якщо їхні криптографічні хеші не збігаються, але якщо хеші збігаються, вони з великою ймовірністю виявляться однаковими.


2
Якщо хеші відповідають, то або файли є результатом навмисного зіткнення, або їх немає, і тоді вони гарантовано будуть однаковими. Ймовірність випадкового зіткнення суто теоретична. Сказати, що "якщо хеші збігаються, то вони з великою ймовірністю виявляться однаковими" вводить в оману: якщо на злобі є зло, і це зіткнення, то вони, ймовірно, не будуть однаковими, інакше ймовірність фактично дорівнює нулю, не так - це якась низька ймовірність події, яку потрібно захистити.
Жил "ТАК - перестань бути злим"

9
@Gilles: Навпаки. Формулювання Майкла абсолютно правильне, а "гарантоване" вводить в оману (або, ну, фактично неправильно). Ймовірність невідповідності двох файлів з однаковими хешами (незважаючи на шкідливу модифікацію) надзвичайно низька, і їх можна знехтувати на практиці. Однак це не нуль . Існує правило , є шанс, що з якоїсь - то причини різні входи будуть виробляти той же хеш, і , можливо , навіть з імовірністю значно вище , ніж 2 ^ -128 (криптографічні алгоритми чорного мистецтва, algortihm може бути зіпсований в тонкому, невідомим чином і ми не можемо бути на 100% впевнені).
Деймон

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

5
@Attie: Ймовірність того, що два непов’язаних файлу хешируются на одне значення, настільки нижче, ніж ймовірність багатьох інших речей, які можуть піти не так (наприклад, випадкові бітові помилки, що пошкоджують файли на диску), що не варто охоронятись від випадкових збігів. Охороняти проти навмисно розроблених матчів, можливо, варто, але випадкові поєдинки є настільки малоймовірними, що будь-які зусилля, витрачені на охорону проти них, можливо, будуть витрачені краще в іншому місці.
supercat

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

10

Це гра з вірогідністю ... хеші здатні представляти кінцеву кількість значень.

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

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

Це означає, що ми ніколи не можемо досягти 100% впевненості - ми ніколи не можемо впевнено стверджувати , що два файли з одним і тим же хешем справді мають однаковий вміст.

У більшості / багатьох ситуаціях це добре, а порівняння хешей " досить добре ", але це залежить від вашої моделі загрози.

Зрештою, якщо вам потрібно підвищити рівень визначеності, я рекомендую вам зробити наступне:

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

Якщо вам потрібно бути 100% впевненим, тоді все-таки почніть з хешу, але якщо хеші відповідають, слідкуйте за цим порівнянням двох файлів за байтом.


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

Excel в цьому особливо поганий - просто відкривши електронну таблицю, економлячи її ( нічого не зробивши ), можна створити новий файл з різним вмістом.


6
MD5 вже не вважається адекватним , дуже правдивим криптографічно, але для перевірки унікальності (за відсутності злоби, наприклад, якщо ви керуєте входом), це приємно і швидко (а 128 біт має бути багато)
Кріс Н

4
" слідкуйте за цим порівнянням двох байтів за байтом. " Якщо ви збираєтеся робити порівняння файлів, ви можете також зробити це спочатку ... немає сенсу читати всі файли для обчислення їх хеши лише перечитати обидва файли для порівняння!
TripeHound

3
@TripeHound Залежить, чи файли є локальними, чи ні ... якщо у вас вже є хеш-файл одного і вводите новий файл у систему, якщо новий файл потребує хешу, який зберігається в базі даних і т. Д. ... Зробіть дзвінок відповідно до вашої ситуації.
Attie

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

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

6

Якщо два файли мають один і той же хеш MD5, і обидва вони не були спеціально створені, вони однакові. Наскільки важко створювати файли з тим же хешем MD5, залежить від формату файлу, я не знаю, наскільки це легко з файлами Excel.

Тож якщо у вас є власні файли, які просто лежать і хочете знайти копії, MD5 є безпечним. Якщо ви написали один із файлів, а інший файл має сумнівне походження, MD5 все ще є безпечним (єдиний спосіб отримати різні файли з однаковою контрольною сумою MD5 - це створити обидва файли). Якщо хтось, якому ви не довіряєте, надсилає вам бюджетну пропозицію, а пізніше надсилає інший файл, на який вони стверджують, той самий, то MD5 може бути недостатньо.

Щоб уникнути будь-якого ризику, використовуйте SHA-256 або SHA-512 замість MD5. Якщо два файли мають однаковий хеш SHA-256, вони однакові. Те саме стосується SHA-512. (Існує теоретична можливість того, що вони можуть бути різними, але ймовірність того, що це трапиться випадково, набагато менша, ніж ймовірність того, що ваш комп'ютер трохи переверне під час перевірки, ніж це просто не має значення. Що стосується того, що хтось свідомо виготовляв два файли з той же хеш, ніхто не знає, як це зробити для SHA-256 або SHA-512.)

Якщо два файли Excel мають різні хеші, то вони різні, але неможливо дізнатися, наскільки вони відрізняються. Вони могли мати однакові дані, але різного форматування, або вони могли просто відрізнятися за властивостями, або вони могли бути збережені різними версіями. Насправді, якщо Excel є чимось схожим на Word, то просто збереження файлу оновлює його метадані. Якщо ви хочете лише порівнювати числові та текстові дані та ігнорувати форматування та властивості, ви можете експортувати електронні таблиці в CSV для їх порівняння.

Якщо у вас є інструменти Unix / Linux, ви можете використовувати cmpдля порівняння двох файлів. Для порівняння двох файлів на одній машині контрольні суми лише ускладнюють справи.


Якщо два файли мають один і той же хеш MD5, і обидва вони не були спеціально створені, вони однакові. Це неправильно. Існує нескінченність можливих повідомлень, але є лише 2 ^ 64 можливих 64-бітних хеша. Його називають "принципом голубої дупки" : "принцип голубого отвору стверджує, що якщо nпредмети поміщаються в mконтейнери n > m, то принаймні один контейнер повинен містити більше одного елемента". Якщо ви створите більше 2 ^ 64 повідомлень, у вас виникнуть зіткнення без будь-яких "спеціальних крафт". І ви могли б тільки з 2
Ендрю Henle

@AndrewHenle, MD5 - це не 64 біти, це 128. Якщо генерування випадкового зіткнення перетворить нас у часові шкали теплової смерті-всесвіту, "це можливо" лише для надзвичайно академічного (отже, марного) визначення цього.
Чарльз Даффі

@CharlesDuffy Ви припускаєте, що хеш розподіляється випадковим чином. Це не.
Ендрю Генле

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

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

6

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

Довга відповідь: Ідеальна хеш-функція - це така, яка створює майже унікальний криптографічний хеш для кожного унікального даних. Іншими словами, ми точно знаємо, що у цьому Всесвіті є два файли, хеш-значення яких стикаються, шанс цих двох файлів, природно, зібратися разом є смішно невеликим.

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

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

Однак оригінальний плакат має ще менше причин використовувати MD5, оскільки:

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

6
Ви можете створити власну криптографічну хеш-функцію будь-якої вибраної вами довжини, правда; але тоді він має фіксовану довжину, і принцип голубого отвору все одно застосовується. Загальна відповідь: "Порівнюючи лише їх хеші, ви не можете бути впевнені, що два файли однакові".
Каміль Маціоровський

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

Я погоджуюся з @KamilMaciorowski ... Це гра з вірогідністю ... використовуючи один хеш, ви можете бути " досить впевнені ", що файли з відповідними хешами однакові, але немає 100% гарантії. Використання кращих алгоритмів або використання декількох алгоритмів може покращити вашу впевненість - навіть порівняння розмірів файлів може допомогти ... але ви ніколи не можете бути 100% впевненими, не перевіряючи байт-байт.
Attie

1
@Attie Huh! Саме це я мав на увазі спочатку. Дякую. 🙏 Тільки я не знайомий з шикарними фразами на кшталт "ти можеш бути досить впевненим". Вибачте. 😜 Все ж, тому у нас є кнопка редагування. Я особисто ніколи не бідував хорошої відповіді лише тому, що одне слово в ньому неправильне. Я редагую це.

1
Щодо "зіткнення гарної відповіді": будь ласка, зверніть увагу, я спершу переконався, що це не помилка друку, і ви справді це маєте на увазі; потім прихильно і одночасно я дав вам відгуки, розкрив мою причину, сподіваючись, що ваша відповідь стане кращою. Так і було, тому мого нижнього поступу більше немає. В основному я сказав вам, що, на мою думку, було не так у вашій відповіді, Атті допомогли уточнити, ви покращили відповідь. З моєї точки зору, ми всі вирішили цю ситуацію належним чином, і вся історія вийшла дуже вдалою. Дякую.
Каміль Маціоровський

5

У мене є 2 відмінні документи, і я хочу перевірити, чи вони однакові, крім імені файлу.

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

Щоб обчислити хеші, ви повинні прочитати весь вміст обох файлів.

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

І перш ніж робити будь-який, ви можете просто порівняти розміри двох файлів. якщо розміри різняться, то вміст не може бути однаковим.


При використанні двох файлів на одному фізичному диску, використання хеш-функції, яка може йти в ногу зі швидкістю вводу / виводу для кожного файлу окремо, може бути дещо швидшою, ніж порівняння файлів, оскільки не потрібно буде перемикатися між читанням двох файлів. Хоча місця хешей справді блищать, це коли намагаються порівняти багато файлів, які занадто великі, щоб вміститись у пам'яті. Навіть якщо ви просто хочете дізнатися, чи всі вони відповідають, порівнюючи файл 1 з файлом 2, потім файл 1 з файлом 3, потім файл 1 з файлом 4 і т.д., може бути майже вдвічі повільнішим, ніж обчислення всіх їх хешів.
суперкарт

@supercat Якщо файли читаються шматками, більшими за Мб, то перемикання між файлами не буде помітно. І якщо робочий потік передбачає порівняння купи файлів для пошуку дублікатів, хеш може бути також обчислений, як кожен файл записаний - оскільки це робити, то це можна зробити майже безкоштовно.
Ендрю Генле

Якщо у вас є достатньо місця для буферизації великих фрагментів файлів, час перемикання не повинен бути проблемою, але в іншому випадку вони можуть бути. Що стосується обчислення хесів під час написання файлів, це може бути нормально, якщо можна гарантувати, що файли не можуть бути змінені без зміни або принаймні недійсних збережених хешей. Якщо хтось намагається уникнути резервного резервного копіювання файлів, перегляд лише збережених хеш-значень може призвести до резервного копіювання випадково пошкодженого файлу, але не вимагає резервного копіювання непошкоджених файлів, яким пошкоджений файл повинен відповідати, але не відповідає .
supercat

"Щойно ви знайдете різницю, знаєте, що файли не однакові" - не обов'язково. Файли XLSX - це ZIP-файли, які потенційно можуть зберігати вміст у різному порядку, все ще зберігаючи той самий вміст. Але навіть якщо розпакувати їх і порівняти кожен окремий файл, файл XLSX містить документи XML, які можуть мати, наприклад, різні закінчення рядків, не впливаючи на вміст.
Томас Веллер

5

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

Скажімо, що файли створені буквено-цифровими символами та розміром до 2 Гб.

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

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

1 SHA1 - "сильніший" алгоритм хешування, ніж md5


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

4

НЕМАЄ. Різні значення гарантують, що файли різні. Ті ж значення не є гарантією, що файли однакові. Порівняно легко знайти приклади за допомогою CRC16.

За співвідношенням ймовірностей із сучасними хеширующими схемами вони однакові.


1
Питання стосується MD5, який не загрожує випадковими зіткненнями. У нього є ризик навмисних зіткнень, але це не питання ймовірності.
Жил "ТАК - перестань бути злим"

1
Йдеться також про таблиці Excel з різними іменами, наскільки вони можуть бути великими, що байт для порівняння байтів не може бути варіантом? Дві схеми хешуваннявання разом забезпечували б впевненість.
mckenzm

2
@Gilles Усі хеш- коди мають загрозу випадкових зіткнень. Єдиний вихід з цього - використовувати весь файл як хеш-код. Ваш коментар не має сенсу.
користувач207421

3

Однак ваше питання є зворотним - припустимо, що хеш означає, що вони мають однакові дані (що не гарантується на 100%, але достатньо добре протягом життя порівнювати файли щосекунди, щоб не зіткнутися зіткненням). Це не обов'язково випливає, що наявність однакових даних означає, що вони матимуть однаковий хеш. Отже, ні - ви не можете порівнювати дані у файлі excel з даними в іншому файлі excel шляхом хешування файлу, оскільки існує багато способів, за якими два файли можуть відрізнятися, не змінюючи базові дані. Один очевидний спосіб - дані зберігаються як XML, кожна комірка має свій власний XML-вузол. Якщо ці вузли зберігаються в різних порядках, то дані однакові, але файл відрізняється.



2

Відповідь на цю ОП була надана, але вона може отримати корисну інформацію.

Якщо ви хочете перевірити, чи однакові два файли, багато що залежить від того, чи є файли та хеші під вашим контролем.

Якщо ви генеруєте хеші з файлів, і ви впевнені, що ніхто інший не мав можливості / вміння / мотивації навмисно спробувати і зробити так, щоб ви зробили неправильний висновок, то майже будь-який хеш - навіть "відомі зламані" хеші, такі як MD5 і SHA1 майже певне є достатнім. Але це, я маю на увазі, що ви могли генерувати файли з високою швидкістю протягом мільйонів років, і ви все одно навряд чи отримаєте два файли, які насправді різні, але мають однаковий хеш. Це майже напевно безпечно.

Цей сценарій у вас є, коли ви хочете швидко перевірити, чи два каталоги на вашому ПК або файловому сервері мають однаковий вміст, чи якісь файли в каталозі є точними дублікатами тощо, і ви впевнені, що файли не мають був розроблений / незаконно модифікований, і ви довіряєте своїй програмі / утиліті хешування для отримання правильних результатів.

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


2

У командному рядку Windows можна за допомогою compутиліти визначити, чи два файли точно однакові. Наприклад:

comp fileone.xls filetwo.xls

1

Якщо хеші однакові, чи означає це, що вміст файлу 1: 1 однаковий?

Ні . Якщо хеші різні, то це означає , що зміст різні. Рівні хеш-коди не передбачають однакового змісту. Хеш-код - це зменшення великого домену до меншого діапазону, за визначенням: сенс полягає в тому, що hascodes над неоднаковим вмістом може бути рівним. Інакше не було б сенсу їх обчислювати.


Інакше не було б сенсу їх обчислювати. Якщо ви порушили закони математики і винайшли функцію стиснення без втрат, яка може стискати випадкові дані, порушуючи принцип голубої свердловини, було б дуже корисно її використовувати! Було б дуже зручно , якщо 128-бітний хеш був однозначно являє весь вміст файлу. Навіть якби не було функції декомпресії, щоб повернути хеш у файл, непогано було б мати хеш-математичний хеш без зіткнення, наприклад, щоб прискорити пошук дублювання в недовірених даних, як у зображеннях VM.
Пітер Кордес

"Якщо хеші різні, це означає, що вміст відрізняється." Не обов'язково. Файли XLSX - це ZIP-файли, і можливо, щоб той самий вміст зберігався в іншому порядку.
Томас Веллер

1

Ця відповідь призначена для зручної карти сценаріїв, які можуть статися чи не можуть, і міркувань, які ви можете застосувати. Зверніться до інших відповідей, щоб дізнатися, чому хеш-функції працюють таким чином.


Після того як ви виберете хеш-функцію та дотримуєтесь її, усі ці комбінації слід врахувати:

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

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

Сценарій, в якому однакові файли генерують різні хеш-значення, є єдиним, що категорично неможливо.


Два міркування, які завжди застосовуються:

  • Якщо файли ідентичні , то хеш - значення збігаються точно .
  • Якщо значення хешу різні, то файли точно відрізняються .

Два міркування, які не є суворими :

  • Якщо файли різні, то значення хешу, ймовірно, різні.
  • Якщо значення хешу однакові, файли, ймовірно, ідентичні.

0

Так, ідентичний хеш означає ідентичні файли.

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

Тому використовуйте більш сильний алгоритм хешування, якщо ви плануєте порівнювати велику кількість документів Excel або якщо ви думаєте, що хтось може захотіти маніпулювати порівнянням. SHA1 кращий, ніж MD5. SHA256 знову краще і повинен дати вам повну впевненість у вашому конкретному використанні.


-1

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


Це не спрацює через додаткові дані, що зберігаються в офісних файлах. Перед тим, як зберегти, потрібно поставити курсор в одну клітинку, зберегти в точний час тощо. Але навіть тоді файли XLSX - це поштові файли всередині, тож якщо цей алгоритм зберігає окремі файли в іншому порядку (з будь-якою метою), файл ідентичний , але хеш НЕ
Томас Weller

-2

Давайте розглянемо це на практичному шляху. Замість того, щоб сказати "хеші ідентичні", я скажу "Я написав комп'ютерну програму, яка обчислює хеші двох файлів і виводить, чи вони однакові чи ні", і я запускаю програму з двома файлами, і вона говорить "однаковий". Є кілька причин, чому це може зробити так:

Файли можуть бути ідентичними. У моєму коді можуть бути помилки (той, який насправді траплявся на практиці, порівнював два довгих хеша (256 байт) не з memcmp, а з strcmp: порівняння повернеться "тим самим", якщо перший байт у кожному хеші дорівнює нулю, і шанс для це 1 на 65536. Може статися апаратний збій (космічний промінь потрапляє на комірку пам'яті та перемикає її) Або у вас є рідкісний випадок двох різних файлів з однаковим хешем (хеш-зіткнення).

Я б сказав, що для неідентичних файлів, найвірогіднішою причиною є помилка програміста, тоді приходить космічний промінь, який змінив булеву змінну в результаті порівняння хесів з "false" на "true", і набагато пізніше настає збіг хеш-зіткнення.

Існують корпоративні системи резервного копіювання, які уникають резервного копіювання однакових файлів у 10 000 користувачів шляхом хешування кожного файлу та перевірки наявності файлу з ідентичним хешем, який вже зберігається на сервері. Тож у разі зіткнення файл не буде резервного копіювання, що може призвести до втрати даних. Хтось підрахував, що набагато ймовірніше, що метеорит потрапить на ваш сервер і знищить усі резервні копії, ніж втратити файл, оскільки його контрольна сума відповідає іншому файлу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.