Перейти к содержимому

Хеш-сумма файла

Хеш-сумма файла — конкретное значение, полученное применением хеш-функции к содержимому файла: строка фиксированной длины, например 64 шестнадцатеричных символа для SHA-256. Совпадение хеш-сумм означает, что файлы побайтово идентичны.

Хеш-сумма и хеш-функция: что чем является

Эти два понятия постоянно смешивают, хотя разница строгая. Хеш-функция — алгоритм, общий для всех: SHA-256, MD5, «Стрибог». Хеш-сумма файла — результат применения этого алгоритма к содержимому одного конкретного файла, то есть число, записанное обычно в шестнадцатеричном виде.

Длина хеш-суммы определяется алгоритмом, а не размером файла: SHA-256 даёт 32 байта (64 шестнадцатеричных символа), SHA-512 — 64 байта, MD5 — 16 байт. Дистрибутив на 4 ГБ и пустой текстовый файл описываются строкой одинаковой длины. Хеш-сумма пустого файла для SHA-256 равна e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855, и это значение одинаково в любой системе.

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

У одного файла столько хеш-сумм, сколько к нему применено алгоритмов. Поэтому в списках проверки всегда указывают алгоритм: строка из 32 символов — MD5, из 40 — SHA-1, из 64 — SHA-256. Сравнивать значения, посчитанные разными функциями, бессмысленно.

Как посчитать хеш-сумму

В Windows встроенных инструментов два. PowerShell: Get-FileHash image.iso -Algorithm SHA256; допустимые значения параметра — MD5, SHA1, SHA256, SHA384, SHA512. Классический cmd: certutil -hashfile image.iso SHA256, вывод содержит хеш с пробелами, которые перед сравнением надо убрать.

В Linux применяют утилиты sha256sum image.iso, sha512sum, md5sum. В macOS команда называется иначе: shasum -a 256 image.iso или md5 image.iso.

Формат файла со списком сумм (обычно SHA256SUMS или CHECKSUMS.txt) прост: хеш, два пробела, имя файла. Звёздочка вместо второго пробела означает бинарный режим чтения. Проверить весь список одной командой позволяет ключ -c: sha256sum -c SHA256SUMS выведет OK напротив каждого совпавшего файла и FAILED напротив расходящегося.

Три ошибки при ручной сверке. Первая — сравнивать глазами: человек уверенно пропускает подмену в середине 64-символьной строки, надёжнее вставить эталон в команду сравнения или воспользоваться поиском по странице. Вторая — регистр: A1FF и a1ff это одно значение, шестнадцатеричная запись регистронезависима. Третья — текстовые файлы: перевод строки CRLF в Windows и LF в Linux дают разные байты, поэтому один и тот же по смыслу текст после переноса между системами получает другую сумму. Для архивов ZIP и офисных документов DOCX добавляется ещё и время создания записей внутри контейнера: пересобранный архив с тем же содержимым получит другой хеш.

Что доказывает совпадение, а что нет

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

Подлинность источника хеш-сумма сама по себе не доказывает. Если атакующий контролирует и файл, и страницу с опубликованным эталоном, он подменит оба значения, и проверка сойдётся. Хеш работает только тогда, когда эталон получен по независимому доверенному каналу либо скреплён подписью: у дистрибутивов Linux рядом с SHA256SUMS лежит файл подписи GPG, а в российском документообороте роль такого скрепления играет УКЭП — подписывается как раз хеш документа, а не сам документ.

Отдельная оговорка про алгоритм. Для MD5 и SHA-1 злоумышленник умеет заранее готовить пару файлов с одинаковой суммой, поэтому опубликованная MD5-сумма не защищает от намеренной подмены, хотя по-прежнему ловит случайное повреждение. Против подмены нужен SHA-256 или «Стрибог».

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

Где хеш-суммы файлов работают незаметно

Торренты. Файл режется на части по 256 КБ или 1 МБ, и в метаданных лежит хеш каждой части. Клиент проверяет часть сразу после загрузки и перекачивает только повреждённые куски, а не весь файл целиком.

Контейнеры. Идентификатор образа Docker вида sha256:9b6... — это хеш-сумма манифеста. Обращение к образу по цифровому отпечатку вместо тега гарантирует, что развернётся ровно проверенная сборка.

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

Пакетные менеджеры. Файлы блокировок npm, pip и Composer хранят хеш каждой зависимости, и установка падает, если содержимое пакета в реестре изменилось при том же номере версии.

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

Компьютерная криминалистика. Хеш образа носителя фиксируется в акте изъятия, чтобы позже доказать, что данные не изменялись при исследовании.

Хеш-сумму стоит отличать от контрольной суммы CRC. CRC занимает 4 байта, считается на порядок быстрее и предназначен для выявления помех в канале связи или на диске. Хеш-сумма длиннее, медленнее и рассчитана в том числе на противодействие противнику.

Частые вопросы

Хеш-сумма изменилась после копирования файла. Что это значит?

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

Какой алгоритм выбрать для проверки скачанного дистрибутива?

SHA-256, если издатель публикует именно его. Он одновременно защищает от случайного повреждения и от намеренной подмены, а на процессорах с аппаратными инструкциями считается со скоростью в гигабайты в секунду. MD5 берите, только если других эталонов нет, и помните, что он подтверждает целостность, но не защищает от подготовленной подмены.

Можно ли по хеш-сумме определить, что это за файл?

Напрямую нет: восстановить содержимое по сумме невозможно. Но по ней ищут в базах известных файлов. Сервисы репутации хранят хеши миллиардов образцов, и по 64 символам определяется и название дистрибутива, и вердикты антивирусов. Работает это только для уже известных файлов; уникальный документ по хешу не опознается.

Почему у одного файла публикуют сразу MD5, SHA-1 и SHA-256?

Ради совместимости. Старые сборочные конвейеры и встроенные средства некоторых систем умеют считать только MD5, поэтому издатели выкладывают несколько сумм сразу. Проверять достаточно самую сильную из доступных: если сошёлся SHA-256, сверять остальные не нужно. Обратный порядок не работает — совпадение MD5 не компенсирует расхождение SHA-256.

Бывает ли хеш-сумма у папки?

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