dimayakovlev.ru


Как вычислить и проверить хеш-сумму файла в PowerShell

Для вычисления и проверки хеш-суммы файла не требуется искать и устанавливать специальные утилиты. Это можно сделать не покидая консоль PowerShell.

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

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

Хеш-функцией называют математическое преобразование данных в короткую строку определённой длины с применением заданного алгоритма хеширования. Например, это могут быть алгоритмы MD5, SHA1, SHA256 и другие.

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

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

В PowerShell для вычисления хеш-суммы содержимого файла или потока служит командлет Get-FileHash. Для работы с содержимым файла требуется передать командлету путь к файлу через параметр -Path или -LiteralPath. Используемый алгоритм хеширования задаётся параметром -Algorithm. Командлет поддерживает работу с алгоритмами SHA1, SHA256, SHA384, SHA512 и MD5. При этом параметр -Algorithm не обязательный, по умолчанию для вычисления хеш-суммы используется алгоритм SHA256.

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

Конкретным примером такого файла может быть скачанный файл ISO образа операционной системы Ubuntu. При попытке монтирования этого образа или создания на его основе загрузочного носителя, возникает ошибка.

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

На текущий момент для загрузки доступна версия Ubuntu 21.10 (ubuntu-21.10-desktop-amd64.iso). Эталонная SHA256 хеш-сумма файла образа, указанная на странице загрузки: f8d3ab0faeaecb5d26628ae1aa21c9a13e0a242c381aa08157db8624d574b830.

В приведённом далее сценарии будет выполнять проверка хеш-суммы файла для скачанного образа именно этой версии Ubuntu.

$hashOriginal = "f8d3ab0faeaecb5d26628ae1aa21c9a13e0a242c381aa08157db8624d574b830"
$hashCalculated = (Get-FileHash -Path .\Downloads\ubuntu-21.10-desktop-amd64.iso).Hash
IF ($hashOriginal -ieq $hashCalculated) {
	Write-Output "Хеш-суммы совпадают"
} Else {
	Write-Output "Хеш-суммы отличаются"
}

Для лучшего понимания подробно рассмотрю как работает этот сценарий PowerShell.

В переменной $hashOriginal хранится хеш-сумма эталонного образа, указанная на странице загрузки.

Хэш-сумма скачанного образа, вычисленная при помощи командлета Get-FileHash, сохраняется в переменную $hashCalculated.

Командлет Get-FileHash возвращает не строку с хеш-суммой, а объект класса Microsoft.Powershell.Utility.FileHash. Для того, чтобы получить текстовое представление хеш-суммы файла из возвращённого объекта, надо обратиться к его свойству Hash.

При неизменности загруженной копии образа, вычисленная для него хеш-сумма, сохранённая в переменной $hasCalculated, должна совпасть со значением переменной $hashOriginal. Сравнение строковых значений переменных выполняется без учёта регистра с использованием оператора сравнения -ieq. Вместо оператора -ieq можно использовать привычный оператор -eq, который так же выполняет регистронезависимое сравнение строк, но без явного указания на это.

В результате сравнения выводится соответствующее сообщение. При желании можно расширить возможности сценария. Например, в случае несовпадения хеш-сумм, предложить пользователю автоматически скачать новую копию образа.

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