Як я можу ефективно генерувати та перевіряти контрольні суми файлів?


12

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

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


Як зазначається у відповідях, важливо відрізняти типи загрози, яку ви пом'якшуєте, та контрольну суму відповідно. Попередня відповідь про переповнення стека бібліотеки та інформації, яку я внесла, може зацікавити, хоча це здебільшого HDFS.
Енді Джексон

Відповіді:


13

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

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

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

Крім того, не забудьте врахувати BER своїх дисків. Зрештою, вони є простими пластинками, що обертаються іржею. Пристрій рівня споживача має рівень помилок 1 неправильно прочитаний біт на кожні 10 ^ 14 біт прочитаного, що працює на 1 біт з кожні 11 терабайт, які ви читаєте. Якщо у вас є набір даних 11 терабайт і ви обчислюєте хеш кожного файлу в ньому, ви неправильно обчислили одну з цих контрольних сум і назавжди пошкодили один блок одного з файлів у наборі даних. Однак ZFS знає хеш кожного блоку, який він записав на кожен диск у вашому пулі, і тому знає, який блок був загублений. Потім він може використовувати надмірність (парність, дзеркала або додаткові копії) у вашому пулі, щоб переписати дані в цей блок із правильними значеннями.

Бен підкреслює хороші моменти в коментарях. ZFS не виставляє жодного з хеш-значень, які він обчислює користувачеві, тому дані, що вводять або залишають систему ZFS, повинні супроводжуватися хешами. Мені подобається, як Internet Archive робить це з файлом xml, який супроводжує кожен елемент в архіві. Дивіться https://ia801605.us.archive.org/13/items/fakebook_the-firehouse-jazz-band-fake-book/fakebook_the-firehouse-jazz-band-fake-book_files.xml як приклад.


1
Ти побив мене до цього. Я також збирався запропонувати систему на основі хешу. Хеш кожного файлу, хеш файл хешами (+ хеш дир) для хешу каталогу каталогів і т. Д. Знищення - це CPU / IO проти ймовірності помилок. Контрольна сума / CRC дешева, але ймовірність помилок зростає зі шкалою. Тож робимо звичайні хеші, але вони починаються зі значно меншою ймовірністю помилки.
Diamond Z

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

1
Так, це хороший момент. У моєму останньому скрабі було виправлено 2 кілобайти даних, які стали поганими. Ось чотири блоки, розкидані на п’ять дисків! Чим довше ви переходите до читання певного фрагмента даних, тим вище ймовірність того, що ви накопичите достатньо помилок в одному файлі, що він не зможе відновити його.

1
Запуск md5sum користувальницького простору понад 150 ГБ даних на моєму домашньому ПК зайняв близько 40 хвилин настінний час, суто пов'язаний з входом / виводом. Масштабуючи це в 100 разів, ми перевіряємо 15 ТБ за відтінком менше трьох днів на споживчому обладнання. Я, безумовно, вважаю це можливим навіть у великому архіві, з правильно підібраним інтервалом.
CVn

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

6

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

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

Таким чином ваші дані швидше збережуться.


Це, безумовно, має сенс. Мені просто цікаво, які стратегії існують для обчислювально дорогого подвигу створення та перевірки сотень тисяч контрольних сум.

4

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

Інструмент BagIt (вони існують у кількох мовах програмування) розміщує ваші файли у певній структурі каталогу та робить контрольну суму / хешування для вас. Це все.

PS: Звичайно, інструменти BagIt також можуть перевіряти сумки щодо включених контрольних сум / хешів, а також ви можете додати в мета сумки деякі метадані. Але це так складно, як виходять сумки.


1

Ця відповідь є комбінацією відповіді @ lechlukasz та @ db48x , а також включає деякі моменти, висловлені в коментарях, а також деякі мої власні думки.

Простий шлях вперед - це комбінована файлова система та підхід окремо-метаданих.

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

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

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

З сучасним обладнанням і тим, що практично для зберігання великої кількості даних (спінінг жорстких дисків на відміну від твердотільних дисків / SSD), навіть складні алгоритми хешування, такі як SHA1, будуть значною мірою пов'язані з входом / виводом - тобто швидкість при якій хешировані дані будуть функціонувати швидкістю зчитування системи зберігання, а не здатністю процесора комп'ютера обчислювати хеш. Я здійснив експеримент із запуском хеширувального простору MD5 у користувальницькому просторі на приблизно 150 ГБ даних про те, що в 2012 році був споживчим ПК середнього рівня, і він закінчився після того, як диск працював в основному без перерви близько 40 хвилин. Масштабуючи ці цифри в 100 разів, ви отримаєте хеші MD5 колекції 15 ТБ приблизно за три дні на цьому ж апараті. Додаючи швидкість передачі читання (що може бути легко досягнуто, наприклад,Наприклад, RAID 0 - це смугастий без надмірності, зазвичай використовується для досягнення більш високої продуктивності читання / запису, можливо, у поєднанні з RAID 1, що утворює RAID 10 ), час на завершення може бути зменшений для тієї ж кількості даних.

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


1

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

Існує програма Linux під назвою TripWire, яка широко використовується для моніторингу виконуваних файлів системи, щоб перевірити, що вони не були змінені після атаки. Цей проект, очевидно, зараз занедбаний, але є новий під назвою AIDE (Advanced Intrusion Detection Environment), рекомендований на ServerFault:

/server/62539/tripwire-and-alternatives

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

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


0

Національний архів Австралії розробив [Checksum Checker] ( http://checksumchecker.sourceforge.net/ ), який є у вільному доступі під GPLv3.

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

Інше програмне забезпечення в їх цифровому сховищі [DPR] ( http://dpr.sourceforge.net/ ) генерує початкову контрольну суму (а також виконує всі інші операції з обробки)

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