Проверка файлов по списку хешей полезна при загрузке дистрибутивов, резервных копиях, распространении программного обеспечения или любой ситуации, когда необходимо убедиться, что содержимое файлов не изменилось. Ниже описаны универсальные подходы, которые работают в основных операционных системах, а также рекомендации по автоматизации и обработке возможных расхождений.
- Основные понятия Хеш‑функция преобразует содержимое файла в фиксированную длину строки (например, SHA‑256 → 64 шестнадцатеричных символа). Если даже один байт файла изменится, получившийся хеш будет другим. Список хешей обычно представляет собой текстовый файл, где каждая строка содержит хеш и имя файла, разделённые пробелом или табуляцией: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 file1.txt 9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08 file2.bin
- Как выполнить проверку вручную
- Linux и macOS В этих системах обычно уже установлены утилиты sha256sum, sha1sum, md5sum и аналогичные для других алгоритмов. Они принимают список файлов и выводят хеши в формате, подходящем для дальнейшего сравнения. Перейдите в каталог с файлами. Сгенерируйте хеши нужного алгоритма и сохраните их во временный файл: sha256sum * > current_hashes.txt Сравните полученный файл с эталонным списком. Для этого удобно использовать diff или comm: diff -u reference_hashes.txt current_hashes.txt Если вывод пустой, все файлы совпадают. Если есть строки, помеченные — (отсутствуют в текущем) или + (лишние или изменённые), значит хеши не совпадают.
- Windows В Windows нет встроенной утилиты, аналогичной sha256sum, но можно использовать: PowerShell – командлет Get-FileHash; certutil – встроенная утилита для вычисления хешей; сторонние программы (например, HashMyFiles от NirSoft), если предпочтителен графический интерфейс. Пример с PowerShell: Откройте PowerShell в каталоге с файлами. Сформируйте файл с текущими хешами: Get-FileHash -Algorithm SHA256 * | Format-List | Out-File current_hashes.txt Однако вывод Get-FileHash по умолчанию включает заголовки. Чтобы получить формат, аналогичный sha256sum, используйте: Get-FileHash -Algorithm SHA256 * | ForEach-Object { «$($_.Hash.ToLower()) $($_.Path)» } | Out-File current_hashes.txt -Encoding ASCII Сравните с эталонным списком при помощи fc (сравнение файлов) или Compare-Object в PowerShell: fc /b reference_hashes.txt current_hashes.txt или Compare-Object (Get-Content reference_hashes.txt) (Get-Content current_hashes.txt) Если различий нет, вывод будет пустым. Автоматизация проверки скриптом Для регулярной проверки удобно написать небольшой скрипт, который сам вычислит хеши и сравнит их с эталоном, выдавая только список несовпадающих файлов.
- Автоматизация проверки скриптом
- Пример на Bash (Linux/macOS) #!/usr/bin/env bash ALGO=»sha256sum» REF=»$1″ if [[ -z «$REF» ]]; then echo «Usage: $0 reference_hashes.txt» exit 1 fi # Вычисляем хеши всех файлов, перечисленных в справочнике while read -r expected_hash filename; do if [[ -z «$filename» ]]; then continue; fi actual_hash=$($ALGO «$filename» 2>/dev/null | awk ‘{print $1}’) if [[ «$actual_hash» != «$expected_hash» ]]; then echo «NOT MATCH: $filename» fi done < "$REF" Скрипт читает эталонный файл построчно, вычисляет хеш каждого указанного файла и сообщает о несовпадении. При необходимости можно добавить проверку на отсутствие файла.
- Пример на PowerShell (Windows) param( [Parameter(Mandatory=$true)] [string]$ReferenceFile ) $algo = «SHA256» Get-Content $ReferenceFile | ForEach-Object { if ($_ -match ‘^\s*([0-9a-fA-F]+)\s+(.+)$’) { $expected = $matches[1].ToLower() $path = $matches[2] if (-Not (Test-Path $path)) { Write-Host «MISSING: $path» return } $actual = (Get-FileHash -Path $path -Algorithm $algo).Hash.ToLower() if ($actual -ne $expected) { Write-Host «NOT MATCH: $path» } } } Скрипт принимает путь к файлу с эталонными хешами и выводит сообщения о недостающих или изменённых файлах. Что делать при обнаружении несовпадений Проверьте, не был ли файл случайно изменён (например, при загрузке мог произойти сбой сети). Попробуйте загрузить файл заново из надёжного источника. Убедитесь, что вы используете тот же алгоритм хеширования, что и при создании эталонного списка (SHA‑256, SHA‑1, MD5 и т.д.). Если в эталонном списке указаны относительные пути, запускайте проверку из того же каталога, где находились файлы при генерации списка. Для больших наборов файлов удобно вести журнал несовпадений, чтобы позже разобраться с каждым случаем индивидуально. Практические советы Храните эталонные списки хешей в отдельном, защищённом месте (например, в репозитории с подписью GPG или в облачном хранилище с двухфакторной аутентификацией). Это предотвратит подмену как файлов, так и самих хешей. При распространении программного обеспечения публикуйте хеши вместе с цифровой подписью разработчика – так пользователь сможет убедиться не только в целостности файла, но и в его подлинности. Если необходимо проверять файлы разных размеров, выбирайте криптостойкие алгоритмы (SHA‑256 или выше). MD5 и SHA‑1 больше не рекомендуются для целей безопасности из-за известных уязвимостей к коллизиям. Для ускорения проверки на многопроцессорных системах можно параллелизовать вычисление хешей (например, с помощью xargs -P в Bash или Start-Job в PowerShell). Перед массовой проверкой убедитесь, что у вас есть доступ на чтение ко всем файлам и достаточно места на диске для временных файлов с хешами. Ограничения и предположения Методы, описанные выше, проверяют только целостность файлов, а не их безопасность. Вредоносный код может иметь тот же хеш, если злоумышленник смог подобрать коллизию – это практически невозможно для SHA‑256, но теоретически возможно для слабых алгоритмов. Скрипты предполагают, что имена файлов в эталонном списке не содержат пробелов или специальных символов, которые могли бы нарушить разбор строк. Если такие символы присутствуют, необходимо использовать более надёжный формат (например, CSV с кавычками) и соответствующим образом адаптировать парсер. На Windows встроенная утилита certutil выводит хеш в верхнем регистре и с дополнительными строками; если вы используете её, потребуется предварительная обработка вывода. Следующие шаги После того как вы убедились, что все файлы соответствуют эталонным хешам, можно: Заархивировать проверенные наборы для дальнейшего распространения или резервного копирования. Настроить автоматическую проверку в системе непрерывной интеграции (CI) – например, добавить шаг, который вычисляет хеши артефактов и сравнивает их с эталонным списком перед публикацией. Регулярно обновлять эталонные списки при легитимном изменении файлов (новые версии, патчи) и подписывать их цифровой подписью, чтобы цепочка доверия оставалась непробиваемой.
- Что делать при обнаружении несовпадений
- Практические советы
- Ограничения и предположения
- Следующие шаги
Основные понятия
Хеш‑функция преобразует содержимое файла в фиксированную длину строки (например, SHA‑256 → 64 шестнадцатеричных символа). Если даже один байт файла изменится, получившийся хеш будет другим. Список хешей обычно представляет собой текстовый файл, где каждая строка содержит хеш и имя файла, разделённые пробелом или табуляцией:
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 file1.txt
9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08 file2.bin
Как выполнить проверку вручную
Linux и macOS
В этих системах обычно уже установлены утилиты sha256sum, sha1sum, md5sum и аналогичные для других алгоритмов. Они принимают список файлов и выводят хеши в формате, подходящем для дальнейшего сравнения.
- Перейдите в каталог с файлами.
- Сгенерируйте хеши нужного алгоритма и сохраните их во временный файл:
sha256sum * > current_hashes.txt
- Сравните полученный файл с эталонным списком. Для этого удобно использовать diff или comm:
diff -u reference_hashes.txt current_hashes.txt
Если вывод пустой, все файлы совпадают. Если есть строки, помеченные — (отсутствуют в текущем) или + (лишние или изменённые), значит хеши не совпадают.
Windows
В Windows нет встроенной утилиты, аналогичной sha256sum, но можно использовать:
- PowerShell – командлет Get-FileHash;
- certutil – встроенная утилита для вычисления хешей;
- сторонние программы (например, HashMyFiles от NirSoft), если предпочтителен графический интерфейс.
Пример с PowerShell:
- Откройте PowerShell в каталоге с файлами.
- Сформируйте файл с текущими хешами:
Get-FileHash -Algorithm SHA256 * | Format-List | Out-File current_hashes.txt
Однако вывод Get-FileHash по умолчанию включает заголовки. Чтобы получить формат, аналогичный sha256sum, используйте:
Get-FileHash -Algorithm SHA256 * | ForEach-Object { «$($_.Hash.ToLower()) $($_.Path)» } | Out-File current_hashes.txt -Encoding ASCII
- Сравните с эталонным списком при помощи fc (сравнение файлов) или Compare-Object в PowerShell:
fc /b reference_hashes.txt current_hashes.txt
или
Compare-Object (Get-Content reference_hashes.txt) (Get-Content current_hashes.txt)
Если различий нет, вывод будет пустым.
Автоматизация проверки скриптом
Для регулярной проверки удобно написать небольшой скрипт, который сам вычислит хеши и сравнит их с эталоном, выдавая только список несовпадающих файлов.
Пример на Bash (Linux/macOS)
#!/usr/bin/env bash
ALGO=»sha256sum»
REF=»$1″
if [[ -z «$REF» ]]; then
echo «Usage: $0 reference_hashes.txt»
exit 1
fi
# Вычисляем хеши всех файлов, перечисленных в справочнике
while read -r expected_hash filename; do
if [[ -z «$filename» ]]; then continue; fi
actual_hash=$($ALGO «$filename» 2>/dev/null | awk ‘{print $1}’)
if [[ «$actual_hash» != «$expected_hash» ]]; then
echo «NOT MATCH: $filename»
fi
done < "$REF"
Скрипт читает эталонный файл построчно, вычисляет хеш каждого указанного файла и сообщает о несовпадении. При необходимости можно добавить проверку на отсутствие файла.
Пример на PowerShell (Windows)
param(
[Parameter(Mandatory=$true)]
[string]$ReferenceFile
)
$algo = «SHA256»
Get-Content $ReferenceFile | ForEach-Object {
if ($_ -match ‘^\s*([0-9a-fA-F]+)\s+(.+)$’) {
$expected = $matches[1].ToLower()
$path = $matches[2]
if (-Not (Test-Path $path)) {
Write-Host «MISSING: $path»
return
}
$actual = (Get-FileHash -Path $path -Algorithm $algo).Hash.ToLower()
if ($actual -ne $expected) {
Write-Host «NOT MATCH: $path»
}
}
}
Скрипт принимает путь к файлу с эталонными хешами и выводит сообщения о недостающих или изменённых файлах.
Что делать при обнаружении несовпадений
- Проверьте, не был ли файл случайно изменён (например, при загрузке мог произойти сбой сети). Попробуйте загрузить файл заново из надёжного источника.
- Убедитесь, что вы используете тот же алгоритм хеширования, что и при создании эталонного списка (SHA‑256, SHA‑1, MD5 и т.д.).
- Если в эталонном списке указаны относительные пути, запускайте проверку из того же каталога, где находились файлы при генерации списка.
- Для больших наборов файлов удобно вести журнал несовпадений, чтобы позже разобраться с каждым случаем индивидуально.
Практические советы
- Храните эталонные списки хешей в отдельном, защищённом месте (например, в репозитории с подписью GPG или в облачном хранилище с двухфакторной аутентификацией). Это предотвратит подмену как файлов, так и самих хешей.
- При распространении программного обеспечения публикуйте хеши вместе с цифровой подписью разработчика – так пользователь сможет убедиться не только в целостности файла, но и в его подлинности.
- Если необходимо проверять файлы разных размеров, выбирайте криптостойкие алгоритмы (SHA‑256 или выше). MD5 и SHA‑1 больше не рекомендуются для целей безопасности из-за известных уязвимостей к коллизиям.
- Для ускорения проверки на многопроцессорных системах можно параллелизовать вычисление хешей (например, с помощью xargs -P в Bash или Start-Job в PowerShell).
- Перед массовой проверкой убедитесь, что у вас есть доступ на чтение ко всем файлам и достаточно места на диске для временных файлов с хешами.
Ограничения и предположения
- Методы, описанные выше, проверяют только целостность файлов, а не их безопасность. Вредоносный код может иметь тот же хеш, если злоумышленник смог подобрать коллизию – это практически невозможно для SHA‑256, но теоретически возможно для слабых алгоритмов.
- Скрипты предполагают, что имена файлов в эталонном списке не содержат пробелов или специальных символов, которые могли бы нарушить разбор строк. Если такие символы присутствуют, необходимо использовать более надёжный формат (например, CSV с кавычками) и соответствующим образом адаптировать парсер.
- На Windows встроенная утилита certutil выводит хеш в верхнем регистре и с дополнительными строками; если вы используете её, потребуется предварительная обработка вывода.
Следующие шаги
После того как вы убедились, что все файлы соответствуют эталонным хешам, можно:
- Заархивировать проверенные наборы для дальнейшего распространения или резервного копирования.
- Настроить автоматическую проверку в системе непрерывной интеграции (CI) – например, добавить шаг, который вычисляет хеши артефактов и сравнивает их с эталонным списком перед публикацией.
- Регулярно обновлять эталонные списки при легитимном изменении файлов (новые версии, патчи) и подписывать их цифровой подписью, чтобы цепочка доверия оставалась непробиваемой.
