Сделайте это простым способом: работа с хэшами файлов в PowerShell

Опубликовано: 15 Марта, 2023
Сделайте это простым способом: работа с хэшами файлов в PowerShell

Некоторое время назад я написал на этом сайте статью, в которой обсуждал ошибку PowerShell, указывающую на то, что термин не распознается как командлет. Несколько дней назад кто-то прокомментировал статью, что он получил эту конкретную ошибку при попытке вычислить хэш MD5. Я нашел источник их проблемы и объяснил, почему они получают сообщение об ошибке. Однако я никогда не пытался создать хэш файла в PowerShell и не совсем понимал, что для этого нужно. Не успев в тот момент его поискать, я предложил им поискать скрипт в Интернете. С тех пор, как я опубликовал этот совет, меня беспокоило, что я не придумал ничего более полезного. Поэтому я хотел воспользоваться возможностью, чтобы продемонстрировать, как работает хеширование файлов в PowerShell.

Простой процесс

Использование PowerShell для создания хэша файла — удивительно простой процесс. На самом деле существует собственный командлет PowerShell, который можно использовать для создания хэша файла. Этот командлет называется Get-FileHash. Чтобы использовать командлет, просто добавьте имя пути, для которого вы хотите создать хэш. Например, у меня на жестком диске есть файл с именем Nano.vhd. Если бы я хотел хешировать этот файл, я бы использовал эту команду:

Get-FileHash C:Nano.vhd

Если вы посмотрите на вывод команды на рисунке ниже, вы увидите, что PowerShell создал хэш SHA256 файла. Однако это не единственный поддерживаемый тип хэша. Добавляя параметр Algorithm, можно создать другой тип хэша (например, MD5).

Изображение 4318
Чтобы указать другой алгоритм хеширования, просто добавьте параметр -Algorithm в конец показанной выше команды, за которым следует имя алгоритма, который вы хотите использовать. Поддерживаемые алгоритмы включают SHA1, SHA256, SHA384, SHA512 и MD5. Например, если вы хотите создать хэш MD5, вы должны использовать команду, подобную этой:

Get-FileHash C:Nano.vhd -Algorithm MD5

Вы можете увидеть вывод команды на рисунке ниже.

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

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

$File1S = (Get-FileHash C:Nano.vhd -Algorithm MD5).Hash

Эта команда создает переменную с именем $File1. Команда работает, выполняя командлет Get-FileHash для интересующего файла (одновременно указывая желаемый алгоритм хеширования), а затем записывая выходной атрибут Hash в переменную $File1. Вы можете увидеть команду, а также последующую команду, которая отображает содержимое переменной, как показано на рисунке ниже.

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

Итак, теперь давайте воспользуемся PowerShell для сравнения хэшей двух разных файлов. У меня есть два отдельных, но похожих файла виртуального жесткого диска, хранящихся на моем жестком диске. Один из этих файлов, Nano.vhd, представляет собой файл виртуального жесткого диска на основе VHD. Другой файл, Nano.vhdx, представляет собой еще один файл виртуального жесткого диска. Содержимое двух виртуальных жестких дисков идентично друг другу, но сами файлы различаются, поскольку они имеют два разных формата (VHD и VHDX). Следовательно, два виртуальных жестких диска должны иметь разные хэши.

Первое, что я собираюсь сделать, это использовать технику, описанную выше, для хеширования обоих файлов. На этот раз я создам две переменные, по одной для каждого файла. Я буду называть эти переменные $File1 и $File2. Если я выведу содержимое двух переменных, то сразу увижу, что хэши разные, как показано на рисунке ниже. Но просто для демонстрации давайте позволим PowerShell сделать сравнение.

PowerShell упрощает сравнение содержимого двух переменных. Вы должны начать с использования команды If. Оттуда вы должны написать свое сравнение в скобках. По сути, это включает в себя ввод одного имени переменной, за которым следует оператор сравнения и имя другой переменной. В этом случае два наиболее подходящих оператора сравнения — это -EQ (равно) и -NE (не равно). Последним шагом в этом процессе является выполнение каких-либо действий на основе сравнения. Например, вы можете отобразить строку текста, чтобы передать результаты сравнения. Какое бы действие вы ни предприняли, команда для этого должна быть заключена в фигурные скобки.

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

if ($File1 -eq $File2) {Напишите "Файлы идентичны друг другу"} if ($File1 -ne $File2) {Напишите "Файлы отличаются друг от друга"}

Вы можете увидеть вывод этих команд на рисунке ниже.

Простой способ хеширования файлов

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