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


139

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

Будь-які думки?


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

2
Ви, ймовірно, вважаєте це питання: stackoverflow.com/questions/862346/… корисним.
shartooth

Скільки файлів потрібно ідентифікувати? Він виводить 128 біт, тому якщо ви намагаєтесь ідентифікувати кілька тисяч файлів, це добре. Але якщо ви намагаєтесь ідентифікувати набагато більше, ніж це, ви можете натрапити на зіткнення / парадокс дня народження.
Марцін

Вони будуть файлами зображень, jpg, png та gif. І так, я думаю, що обмеження буде декількома тисячами ... Але скільки файлів, як ви думаєте, приблизно спричинить мені проблеми?
Ранхіру Джуд Курай

Відповіді:


89

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


2
@none: Перше ваше питання дивіться тут . Боюся, я не розумію інших питань.
Марсело Кантос

9
@ 0xA3: Ні ви, ні я не знаєте, на які файли йдеться в ОП, або на скільки шкоди може призвести компроміс. Це може бути колекція фотографій для малюка для всіх, що ми знаємо. Моя мета - навести факти; те, що хтось інший робить з ними, це їхня справа. Також врахуйте, що Брюс Шнейер рекомендує записати свій пароль; не все потрібно зберігати у Форт-Нокс. Деякі речі будуть добре триматися під квітковим горщиком.
Марсело Кантос

3
@Marcelo Cantos, я думаю, що тут бракує диференціації або розпакування терміна "безпека". Очевидно, люди припускають "безпеку" для будь-якого використання контрольної суми, але номенклатура Marcelo, ймовірно, означає "в лабораторії".
hpavc

5
Я категорично не згоден. Інше значення хеша говорить про те, що файли різні. Але для рівного хеш-значення: ви не можете сказати «велика ймовірність, що обидва однакові», якщо хеш однаковий: ви можете порівняти лише байт-байт. Хеш на багато порядків менший, ніж кількість різних значень для всього файлу, тому існує багато, багато, безліч можливих зіткнень для кожного значення хеша. Тільки якщо у випадку копіювання відомого файлу (з відомим хешем) ідентичне хеш-значення "ймовірно означає", 2-е було скопійовано правильно (навіть тоді це не на 100% вірно, але дуже ймовірно).
Олів'є Дулак

3
Гаразд, моя математика гасить. GUID має близько 122 біт ентропії, і тому ймовірність зіткнення в будь-якому місці в мільярді файлів становить приблизно 2 ^ (2 * 30 - 122) = 2 ^ -62. Незважаючи на те, що це набагато вище, ніж у мого початкового підрахунку, він все ще є незначним приблизно в одному з 4-квінтільйона.
Марсело Кантос

32

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

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


16
@Ranhiru. Ні. Хеш дає вам "підсумкове" значення, яке (для MD5) становить лише 16 байт. Щоб гарантувати, що файли однакові, вам потрібно зробити байт за допомогою байтової перевірки. Це вірно незалежно від того, який алгоритм хешу ви виберете, завжди є можливість зіткнення.
PaulG

6
@Ranhiru. Прочитайте цю відповідь, її найповнішу тут. Хешинг може бути використаний в якості першого кроку, що дає вам 99,99% впевненості в тому, що файли однакові, але якщо ви хочете бути абсолютно 100% впевненими, вам потрібно буде зробити байт шляхом перевірки байтів. Це справедливо, якщо ви використовуєте MD5, SHA або будь-який інший алгоритм.
PaulG

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

8
@Marcelo. Не підлягає логічному міркуванню, що випадкове зіткнення є менш вірогідним, ніж випадкове перевертання бітів (під час створення байту шляхом порівняння байтів). Ви все ще маєте такий самий шанс на біт фліп при створенні хешу (і, мабуть, більше, оскільки задіяно більше часу на обробку). @Thomas спочатку підняв точку, щоб припустити, що не існує гарантованого способу виявлення унікальності, хоча вплив бітових фліпів є дуже дискусійним. Найбільш песимістична оцінка - 1 фліп на ГБ / годину, і оперативна пам’ять ECC усунула б навіть це.
PaulG

2
"ймовірність випадкового зіткнення хешу насправді нижча, ніж ймовірність того, що порівняння не вдасться через збої в процесорі, генеровані нормальними випромінюваннями сонячних гамма-променів" [потрібна цитата]
endolith

20

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

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


2
Ця відповідь може бути трохи оманливою, якщо читач не надто знайомий із хешированием. У SHA немає нічого магічного, що запобігає хеш-зіткненням, вони просто більш стійкі до атак хеш-зіткнень . Якщо ви хочете бути більш ніж 99,999 ^ e% впевненими, що файли однакові, вам все одно знадобиться перевірка байтів на байт.
PaulG

7
Насправді порівняння байт-байт може бути невдалим із-за того, що космічний промінь трохи переверне (наприклад, перетворення а return 0;на а return 1;). Це малоймовірно, але ризик зіткнення з SHA-256 навіть менший, ніж цей. Математично ви не можете бути впевнені, що два файли, які мають хеш на одне значення, однакові, але ви не можете бути впевнені в цьому, порівнявши самі файли, якщо ви використовуєте комп'ютер для порівняння. Я маю на увазі те, що безглуздо виходити за рамки якихось 99,999 .... 9% визначеності, а SHA-256 вже забезпечує більше.
Томас Порнін

2
Що, ви не використовуєте пам'ять ECC? ;). Хороший коментар, дуже цікаві думки.
PaulG

1
Не забудьте шапку з олов'яної фольги! Більш серйозно, як ти знаєш ці фактоїди про зіткнення і чи це ти якось перевірив?
Джеймс П.

@ThomasPornin Космічні бітові фліпи також впливають на метод MD5, тож це ще гірше.
ендоліт

9

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

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

Ви можете читати за принципом « голуби» .


6

Я б не рекомендував це. Якщо програма працюватиме в багатокористувацькій системі, може бути користувач, який матиме два файли з тим самим хешем md5 (він може бути інженером і грати з такими файлами, або бути просто цікавим - вони легко завантажуються з http: / /www2.mat.dtu.dk/people/S.Thomsen/wangmd5/samples.html , я сам під час написання цієї відповіді завантажив два зразки). Інша справа, що деякі програми можуть зберігати такі копії з будь-якої причини (я не впевнений, чи є такі програми, але така можливість існує).

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


2

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


0

MD5 зламано, замість нього можна використовувати SHA1 (реалізовано на більшості мов)


Це абсолютно гарна відповідь. MD5 неприйнятний для випадків використання в галузі права та бухгалтерського обліку в Європі з травня 2018 року.
Берт Сіннема

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

@GregSchmit, можливо, тому, що ОП не піклувалася про криптографічну силу. Я зрозумів питання як "Я вже використовую MD5 у контексті, що не стосується безпеки, чи потрібно витрачати час на оновлення коду?" вид речі. І в цьому контексті відповідь, ймовірно, була помилковою, і SHA1 також був порушений.
березівський

0

Під час хешування коротких (<декількох K?) Рядків (або файлів) можна створити два хеш-клавіші md5, одну для фактичної рядки та другу для зворотного рядка, з'єднаної з короткою асиметричною струною. Приклад: md5 (зворотний (рядок || '1010')). Додавання додаткового рядка гарантує, що навіть файли, що складаються з серії однакових біт, генерують два різних ключі. Будь ласка, розумійте, що навіть у цій схемі існує теоретична ймовірність того, що два хеш-ключі будуть однаковими для неідентичних рядків, але ймовірність здається надзвичайно малою - щось у порядку квадрату ймовірності зіткнення одиночного md5 та економія часу може бути значним, коли кількість файлів зростає. Можна також розглянути більш детальні схеми створення другого рядка,

Щоб перевірити наявність зіткнень, можна запустити цей тест на унікальність хеш-ключів md5 для всіх bit_vectors у db:

виберіть md5 (bit_vector), count (*), bit_and (bit_vector) з db з
групою bit_vector по md5 (bit_vector), bit_vector має bit_and (bit_vector) <> bit_vector


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

0

Мені подобається вважати MD5 як показник ймовірності при зберіганні великої кількості файлових даних.

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

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