Контрольные суммы: sha256sum и проверка скачанного файла

Криптографическая контрольная сумма превращает байты файла в короткий digest. Изменение содержимого почти наверняка меняет SHA-256, поэтому сумма обнаруживает повреждение и…

Криптографическая контрольная сумма превращает байты файла в короткий digest. Изменение содержимого почти наверняка меняет SHA-256, поэтому сумма обнаруживает повреждение и подмену относительно доверенного ожидаемого значения. Но сама по себе она не доказывает, кто опубликовал файл.

Вычисление и manifest

GNU sha256sum печатает digest и имя. Manifest позволяет проверить несколько файлов машинно.

mkdir -p /tmp/checksum-demo
printf 'release payload\n' >/tmp/checksum-demo/app.bin
cd /tmp/checksum-demo
sha256sum app.bin >SHA256SUMS
sha256sum --check SHA256SUMS

--check перечитывает указанное имя и сравнивает байты. Выполняйте проверку из ожидаемого каталога либо используйте manifest с контролируемыми относительными путями.

Целостность не равна подлинности

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

Для package manager эту задачу решают подписанные repository metadata и цепочка доверия APT. Ручное скачивание бинарника переносит ответственность на оператора.

Проверка в скрипте

Status команды должен остановить дальнейшее использование артефакта.

if ! sha256sum --check --status SHA256SUMS; then
  printf 'checksum mismatch\n' >&2
  exit 1
fi
printf 'artifact verified against manifest\n'

Опция --status убирает обычный вывод, но не меняет код. Не подавляйте stderr при расследовании: malformed manifest и отсутствующий файл отличаются от mismatch.

Ошибка и диагностика

Несовпадение может появиться из-за неполной загрузки, неверной версии, преобразования строк или настоящей подмены. Сначала сравните размер и источник, повторно скачайте во временный файл, вычислите обе суммы и не запускайте подозрительный объект. Не «обновляйте» ожидаемый digest значением из сломанного файла без возврата к доверенному издателю.

Практика

Создайте два файла и manifest, проверьте его. Измените один байт, повторите проверку и запишите status. Затем верните файл, переименуйте его и посмотрите, чем missing file отличается от FAILED checksum. Объясните, какой доверенный канал нужен для production-artifact.

Что важно запомнить

Источники