Почему распаковка меняет хеш содержимого файла

Распаковка меняет хеш содержимого потому, что хеш считается не от «смысла» файла, а от конкретной последовательности байтов. Архив и файл после извлечения из него — это разные наборы данных, поэтому их хеш-суммы обычно не совпадают.

Главный принцип простой: одинаковый хеш означает одинаковые входные данные для выбранного алгоритма хеширования, а изменение байтов приводит к изменению результата. Сам процесс распаковки не «ломает» хеш и не делает его случайным — он создаёт новый объект с другим содержимым и другой структурой данных.

Что именно хеширует алгоритм

Хеш-функция получает набор байтов и преобразует его в значение фиксированной длины. Например, SHA-256 не понимает, что перед ним документ, фотография или архив. Для него существуют только последовательности нулей и единиц.

Если взять архив ZIP и посчитать его хеш, алгоритм обработает байты самого ZIP-файла: заголовки, таблицу содержимого, сжатые блоки данных и служебную информацию. После распаковки появляется отдельный файл, в котором уже нет структуры ZIP-контейнера. Его байты отличаются, поэтому отличается и хеш.

Почему архив и распакованный файл имеют разные хеши

Архивирование обычно включает не только хранение данных, но и добавление дополнительной информации. Формат архива должен сообщать программе, как найти файлы внутри, как их восстановить и какие параметры использовать.

Даже если внутри архива находится один файл без изменений, сам архив является другим объектом.

  • Структура контейнера. Архив содержит заголовки, сведения о файлах и другие служебные блоки, которых нет в исходном файле.
  • Сжатие. Данные внутри архива представлены в другом виде. Алгоритм сжатия преобразует исходные байты в более компактную последовательность.
  • Метаданные. В архив могут попасть даты изменения, права доступа, имена файлов и другие параметры.
  • Порядок хранения. Если в архиве несколько файлов, их порядок внутри контейнера влияет на итоговую последовательность байтов.

Поэтому сравнивать хеш архива с хешем распакованного файла нельзя: это проверка двух разных объектов.

Простой пример: файл до и после упаковки

Представим, что есть текстовый файл с содержимым:

«Пример текста»

Если посчитать его хеш, результат будет относиться только к этим байтам. После создания ZIP-архива внутри окажется этот же текст, но сам ZIP будет содержать дополнительные данные и сжатое представление содержимого.

Получаются три разных объекта:

  • исходный текстовый файл;
  • ZIP-архив, содержащий этот файл;
  • файл после извлечения из ZIP.

Первый и третий объект могут иметь одинаковый хеш, если распаковка восстановила файл без изменений. Второй объект будет иметь другой хеш, потому что это другой набор байтов.

Меняется ли хеш самого файла после распаковки

Здесь важно разделять два случая.

Ситуация Что происходит с хешем
Хешируется архив до распаковки Получается хеш контейнера с его структурой и метаданными.
Хешируется извлечённый файл Получается хеш содержимого отдельного файла.
Файл был упакован и затем распакован без изменений Хеш исходного файла и восстановленного файла должен совпасть.
При распаковке изменились данные, кодировка или формат Хеш восстановленного файла будет другим.

Таким образом, сама операция распаковки не обязана менять хеш исходного содержимого. Она меняет хеш, когда вы сравниваете архив и извлечённый файл либо когда процесс восстановления изменил байты файла.

Когда распаковка может изменить сам файл

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

  • Повреждённый архив. Если часть данных потеряна или повреждена, восстановленный файл может отличаться.
  • Особенности формата. Некоторые программы при создании или открытии файлов могут изменять внутреннюю структуру документа.
  • Изменение текстовых данных. Например, могут отличаться окончания строк, кодировка или скрытые символы.
  • Автоматическая обработка. Некоторые инструменты при распаковке или последующем сохранении добавляют или удаляют служебные данные.

Поэтому при проверке целостности важно понимать, какой именно объект должен иметь контрольный хеш: архив или конкретный файл внутри него.

Как правильно проверять файл после распаковки

Если задача — убедиться, что скачанный архив содержит правильный файл, нужно проверять не только архив, но и результат извлечения.

  1. Определите, для какого объекта был опубликован контрольный хеш: для архива или для отдельного файла.
  2. Скачайте файл и посчитайте хеш тем же алгоритмом.
  3. Сравните полученное значение с эталонным.
  4. Если проверяется содержимое архива, сначала распакуйте его, затем вычислите хеш нужного файла.
  5. При несовпадении сравните размер, дату получения файла и способ распаковки.

Ошибка, которая часто приводит к неправильным выводам: взять хеш ZIP-архива из одного источника и сравнить его с хешем распакованного файла. Эти значения не должны совпадать изначально.

Почему иногда одинаковое содержимое даёт разные хеши

Бывает и обратная ситуация: два файла выглядят одинаково, но их хеши отличаются. Причина в том, что человек оценивает содержимое визуально, а алгоритм работает с байтами.

Различия могут появиться из-за:

  • другой кодировки текста;
  • разных символов переноса строк;
  • скрытых символов;
  • изменённых метаданных внутри формата файла;
  • повторного сохранения документа программой.

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

Что делать, если хеш после распаковки не совпал

Сначала нужно определить, какой именно хеш сравнивался. Большинство проблем возникает не из-за ошибки распаковки, а из-за сравнения разных объектов.

Проверьте:

  • совпадает ли алгоритм хеширования в обоих случаях;
  • сравниваются ли два одинаковых типа объектов;
  • не был ли изменён файл после распаковки;
  • не использовалась ли программа, которая автоматически преобразует содержимое;
  • не повреждён ли архив.

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

Распространённые ошибки при проверке хешей

Сравнение архива и файла внутри него

Это самая частая ошибка. Архив и содержащийся в нём файл имеют разное назначение и разные байтовые представления.

Проверка только имени файла

Название файла не является его содержимым. Переименование обычно не меняет хеш самого файла, если данные внутри остались прежними.

Игнорирование алгоритма

Хеш SHA-256 нельзя напрямую сравнивать с MD5 или другим алгоритмом. Сначала нужно убедиться, что используется одинаковый метод расчёта.

Ожидание, что хеш показывает смысл данных

Хеш не знает, что файл является архивом, фотографией или программой. Он показывает только соответствие конкретной последовательности байтов.

Главный принцип проверки

Чтобы правильно понимать изменение хеша после распаковки, нужно задать один вопрос: какой именно объект должен быть проверен?

Если нужно проверить скачанный архив, сравнивается хеш архива. Если нужно проверить извлечённую программу или документ, сравнивается хеш распакованного файла. Эти две проверки решают разные задачи и дают разные результаты.

Перед проверкой определите объект, выберите тот же алгоритм хеширования и сравнивайте именно одинаковые данные. Тогда изменение хеша после распаковки перестаёт быть загадкой: это обычное следствие того, что архив и файл внутри него являются разными наборами байтов.

PEFile.ru