Ви перенесли архів сайту на інший диск: назва й розмір виглядають правильно, але чи залишився вміст тим самим? Перевірка SHA-256 допомагає порівняти байти двох файлів без розпакування та запуску їхнього вмісту. У навчальній вправі візьмемо маленькі текстові файли, отримаємо збіг, а потім навмисно змінимо копію. Так буде видно не тільки успішний результат, а й те, чи перевірка справді виявляє відмінність.
Мета обмежена цілісністю під час копіювання. Збіг контрольних сум не доводить, що резервна копія містить потрібну базу даних, що застосунок відновиться або що джерело заслуговує довіри. Ми не працюватимемо з реальними клієнтськими архівами, не підключатимемо сервер і нічого не завантажуватимемо у сторонні сервіси. Приклад є локальною вправою, а не звітом про перевірений бекап AriZone.
Виберіть еталон до обчислення суми
Для порівняння потрібні дві конкретні версії: завершений оригінал і його копія після передавання. Якщо файл ще записується, результат може стосуватися проміжного вмісту. Дочекайтеся завершення експорту й копіювання та переконайтеся, що обидва файли більше не змінюються. Не використовуйте активний файл бази даних як заміну узгодженого експорту: однакові байти та придатний для відновлення знімок — різні вимоги.
Для вправи створіть новий тестовий каталог поза публічною директорією сайту. Збережіть у ньому original-demo.txt із довільним вигаданим реченням і зробіть точну копію copy-demo.txt засобами файлового менеджера. Не відкривайте й не перезберігайте копію перед першим порівнянням: редактор може змінити кодування або завершення рядків. Назви умовні; якщо оберете інші, замініть їх також у команді запуску.
Потрібен налаштований Python 3, термінал і право читати обидва файли. Зовнішні пакети та адміністративні права не потрібні. Використайте вже доступний інтерпретатор; не змінюйте системний Python чи права доступу до робочих архівів заради цієї вправи. Якщо матеріал містить персональні дані, працюйте лише в дозволеному закритому сховищі й не публікуйте вміст або повні приватні шляхи у зверненнях до підтримки.
Прочитайте файли як байти й зіставте результат
У тому самому каталозі створіть новий файл compare-copy.py з наведеним кодом. Модуль hashlib належить до стандартної бібліотеки; використані sha256, update та hexdigest описані в офіційній документації Python. Програма читає файли блоками, тому не намагається завантажити весь архів у пам’ять. Вона не розпаковує, не виконує й не перезаписує жоден із двох вхідних файлів.
import hashlib
import sys
def digest(path):
result = hashlib.sha256()
with open(path, "rb") as source:
for block in iter(lambda: source.read(65536), b""):
result.update(block)
return result.hexdigest()
if len(sys.argv) != 3:
raise SystemExit("Usage: compare-copy.py ORIGINAL COPY")
try:
original = digest(sys.argv[1])
copied = digest(sys.argv[2])
except OSError:
raise SystemExit("READ_ERROR")
print("original:", original)
print("copy: ", copied)
print("MATCH" if original == copied else "MISMATCH")
raise SystemExit(0 if original == copied else 1)
Режим rb важливий: порівнюються саме байти, без декодування тексту й нормалізації переносів рядків. Навіть якщо два документи однаково виглядають у редакторі, їхнє кодування або службові символи можуть відрізнятися. Натомість назва файлу та час його зміни не входять у це обчислення. Не сприймайте збіг суми як перевірку файлових прав, власника чи правильного місця зберігання.
У терміналі перейдіть до каталогу з усіма трьома файлами та виконайте команду нижче. Перший аргумент — еталон, другий — копія; для шляхів із пробілами використовуйте лапки навколо кожного шляху. Команда лише читає ці файли. На великих архівах читання створює навантаження на диск, тому не плануйте масовий запуск на продуктивному сервері одночасно з важкими робочими операціями.
python3 compare-copy.py original-demo.txt copy-demo.txt
Для точної копії очікуються однакові шістнадцяткові рядки й повідомлення MATCH; код завершення буде нульовим. За відмінності з’явиться MISMATCH і код один. Якщо файл відсутній, це каталог або немає доступу, програма зупиниться з READ_ERROR: це помилка читання, а не доказ пошкодження копії. Не змінюйте права навмання; перевірте шлях, тип об’єкта та дозволений вам доступ.
Доведіть, що перевірка помічає зміну
Після першого успіху відкрийте лише навчальний copy-demo.txt, додайте один символ і збережіть файл. Повторіть ту саму команду: тепер очікується MISMATCH. Оригінал залиште недоторканим. Для повернення до початкового тесту створіть нову точну копію оригіналу у своєму тестовому каталозі, погодившись на заміну лише цього навчального файла. Не повторюйте таку вправу зі справжнім архівом, який є єдиною резервною версією.
Окремо перевірте два порожні навчальні файли: вони теж дадуть MATCH. Саме тому успішне порівняння не доводить повноти резервної копії. Запишіть для кожної спроби назви тестових файлів, дію, очікування та фактичний результат. Якщо перевіряєте багато копій, не підставляйте ту саму адресу двічі: порівняння файла із самим собою не підтверджує успішне передавання.
Не пояснюйте кожний MISMATCH атакою. Спочатку звірте, чи обрано однаковий експорт, чи не було повторного пакування архіву та чи закінчилося завантаження. Перепаковані архіви можуть містити ті самі документи, але мати інші байти контейнера. Наш спосіб перевіряє точність копіювання готового файла, а не логічну однаковість двох незалежно створених резервних наборів.
Якщо оригіналу локально немає, потрібна контрольна сума, отримана від довіреного джерела окремим перевіреним способом. Наведена програма порівнює два файли й не реалізує перевірку підписів або такого маніфесту. Завантажений поруч із невідомим архівом текст із хешем сам по собі не підтверджує авторство. Не підміняйте перевірку походження простим повторним обчисленням тієї самої суми.
Висновок: контрольна сума корисна як вузька перевірка незмінності готового файла. Після неї окремо перевіряють склад копії та тестове відновлення за своїм планом. Для ширшого процесу дивіться матеріал про резервну копію WordPress. Якщо незрозуміло, на якому етапі копії втрачають цілісність, AriZone може допомогти розділити створення, передавання й контроль та підготувати безпечну послідовність перевірок.
Залиште коментар