Верификация хешами: MD5, SHA и доказательство точности

Этот урок показывает, как хеши доказывают, что образ — точная копия оригинала и что он не менялся.

Верификация хешем — сравнение криптографических отпечатков оригинала и образа: если они совпали, копия достоверна.

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

Хеш-функция — это детерминированный алгоритм, превращающий вход любой длины (хоть терабайтный образ) в короткий отпечаток фиксированного размера (для SHA-256 — 256 бит, 64 hex-символа). Два ключевых свойства делают её пригодной для форензики: одинаковый вход всегда даёт одинаковый отпечаток, а изменение даже одного бита входа полностью меняет отпечаток (лавинный эффект). Для криптостойких функций вдобавок практически невозможно подобрать другой вход с тем же отпечатком — именно это превращает совпадение хешей в доказательство.

Процедура верификации

  1. Через write-blocker считают хеш оригинала.
  2. Снимают образ.
  3. Считают хеш образа.
  4. Сравнивают: совпали — фиксируют в заметках и цепочке хранения.

Эту же процедуру повторяют и потом — перед началом анализа и после него, — чтобы доказать, что в процессе работы образ не изменился. Получается цепочка контрольных точек: хеш при снятии, хеш при передаче другому эксперту, хеш перед заседанием. Любой разрыв в этой цепочке (несовпадение) — сигнал, что с уликой что-то произошло, и его придётся объяснять.

# Хеш образа
sha256sum evidence.img
# 9f2c4a... evidence.img

# Сверка по сохранённому хешу (файл с эталоном)
sha256sum -c evidence.img.sha256
# evidence.img: OK   <- значит, целостность подтверждена

Существуют и специализированные утилиты: hashdeep умеет рекурсивно хешировать множество файлов и сверять с базой — удобно для контроля целостности набора улик.

hashdeep особенно полезен, когда улик много: можно один раз посчитать хеши всей папки с артефактами, сохранить «слепок», а позже проверить, что ни один файл не подменили и не повредили. Он же помогает в задачах «известных файлов»: сверив хеши с базами (например, наборов известных системных или, наоборот, заведомо вредоносных файлов), аналитик быстро отсеивает неинтересное и фокусируется на подозрительном.

Демонстрация идеи на Python

import hashlib

def digest(data):
    return hashlib.sha256(data).hexdigest()

original = b"disk image bytes ..."
image_copy = b"disk image bytes ..."   # точная копия

print("original:", digest(original)[:12])
print("image:   ", digest(image_copy)[:12])
print("совпадают:", digest(original) == digest(image_copy))

Вывод:

original: a1b2c3d4e5f6
image:    a1b2c3d4e5f6
совпадают: True

Идентичные данные дают идентичный хеш; совпадение и есть доказательство точности копии. А теперь убедимся в обратном — что малейшее изменение ломает совпадение:

import hashlib

def digest(data):
    return hashlib.sha256(data).hexdigest()

original = b"disk image bytes ..."
tampered = b"disk image bytes ..!"   # изменён один байт

print("совпадают:", digest(original) == digest(tampered))

Вывод:

совпадают: False

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

MD5, SHA-1, SHA-256: что выбрать

АлгоритмСтатус
MD5устарел, есть коллизии — только как дополнительный
SHA-1скомпрометирован — не использовать как основной
SHA-256современный стандарт — основной выбор

На практике часто считают сразу два хеша (например, SHA-256 + MD5): SHA-256 как надёжный основной, MD5 — для совместимости со старым инструментарием.

Уточним, что значит «коллизия» и почему она опасна. Коллизия — это два разных входа с одинаковым хешем. Для MD5 и SHA-1 исследователи научились конструировать такие пары намеренно, поэтому теоретически кто-то может оспорить уникальность отпечатка: «а вдруг существует другой образ с тем же MD5?». Для случайной порчи данных MD5 всё ещё ловит ошибки, но как доказательство уникальности он ослаб. SHA-256 на сегодня от практических коллизий свободен, поэтому именно он — основной. Двойное хеширование (SHA-256 + MD5) даёт и надёжность, и совместимость со старыми инструментами и базами.

Стоит отделить ещё два понятия, которые новички путают. Хеш-функция — это не шифрование и не контрольная сумма вроде CRC32. От шифрования она отличается тем, что необратима: по отпечатку нельзя восстановить исходные данные, отпечаток не «расшифровывается». От простой контрольной суммы (CRC32) — тем, что криптостойка: CRC хорошо ловит случайные ошибки передачи, но подделать под него совпадение тривиально, поэтому как доказательство он не годится. Именно сочетание необратимости и стойкости к подбору коллизий делает криптографический хеш пригодным для фиксации целостности доказательства.

Как работает под капотом

Хеш-функция читает весь поток байтов образа и сворачивает его в фиксированный отпечаток. Любое расхождение хоть в одном бите между оригиналом и копией даст разные отпечатки. Поэтому совпадение хешей — сильное математическое свидетельство идентичности (для криптостойких функций подделать совпадение практически невозможно).

Полезно понять, почему хеш фиксированной длины вообще способен «представлять» терабайтный диск. Функция обрабатывает вход порциями, на каждом шаге подмешивая очередной кусок данных к накопленному внутреннему состоянию через перемешивающие операции. К концу всё внутреннее состояние зависит от каждого прочитанного байта, и из него формируется итоговые 256 бит. Поэтому отпечаток компактен, но «помнит» весь вход: измените любой байт в середине образа — и за счёт лавинного эффекта изменится примерно половина битов отпечатка, до неузнаваемости. Именно эта чувствительность к каждому биту и делает хеш надёжным детектором даже мельчайшего расхождения между оригиналом и копией.

Частые ошибки

  • Полагаться только на MD5. Из-за коллизий его не используют как единственное доказательство.
  • Считать хеш после изменения образа. Хеш фиксируют сразу после снятия, до анализа.
  • Не сохранить эталон. Без записанного хеша оригинала не с чем сравнивать.
  • Хешировать смонтированный на запись диск. Тогда сами данные могли измениться до хеширования.
  • Не перепроверять хеш после анализа. Контрольная точка в конце доказывает, что работа не изменила образ.

Итоги

  • Верификация: хеш оригинала = хеш образа доказывает точность копии.
  • Основной алгоритм — SHA-256; MD5/SHA-1 устарели, MD5 — лишь дополнительно.
  • Хеш считают сразу и фиксируют в заметках и цепочке хранения, перепроверяя на контрольных точках.
Проверьте себя
1. Что доказывает совпадение хешей оригинала и образа?
AЧто образ сжат
BЧто копия точна и идентична оригиналу
CЧто диск зашифрован
DЧто образ меньше оригинала
2. Какой алгоритм является современным основным выбором для верификации?
AMD5
BSHA-1
CSHA-256
DCRC32
3. Когда правильно считать хеш образа?
AПосле завершения анализа
BСразу после снятия, до анализа
CТолько если возникли сомнения
DРаз в неделю