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

Для расчёта хеша файла в PowerShell не нужно ничего устанавливать: в системе уже есть командлет Get-FileHash. Он появился в PowerShell 4.0 и работает как в Windows PowerShell, так и в PowerShell 7+ на Linux и macOS. Достаточно одной строки:

Get-FileHash -Path «C:\iso\ubuntu-24.04-desktop-amd64.iso»

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

Зачем вообще считать хеш файла

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

  • Проверка целостности после загрузки. Разработчики дистрибутивов и программ публикуют контрольные суммы; сверка подтверждает, что файл скачался целиком и без повреждений.
  • Убеждение, что два файла идентичны. Быстрее сравнить суммы, чем побайтово сравнивать большие файлы.
  • Контроль изменений. Сохранив суммы важных файлов, можно позже обнаружить их подмену или случайную модификацию.

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

Базовый синтаксис Get-FileHash

Минимальный вызов выглядит так:

Get-FileHash «C:\путь\к\файлу.zip»

Результат — объект с тремя свойствами:

  • Hash — сама сумма в верхнем регистре;
  • Algorithm — использованный алгоритм;
  • Path — полный путь к файлу.

Чтобы получить только строку суммы, например для вставки в скрипт или сравнения, обратитесь к свойству напрямую:

(Get-FileHash «C:\файл.zip»).Hash

Командлет принимает путь и через конвейер, поэтому работают оба варианта:

«C:\файл.zip» | Get-FileHashGet-ChildItem C:\Logs\*.log | Get-FileHash

Второй пример показывает важную особенность: если передать несколько файлов, вы получите массив объектов — по одному на каждый файл. Это основа пакетной проверки, о которой ниже.

Выбор алгоритма

За алгоритм отвечает параметр -Algorithm. Доступные значения зависят от версии PowerShell и операционной системы:

Алгоритм Где доступен Типичное применение
SHA256 (по умолчанию) Windows PowerShell 4.0+, PowerShell 7+ Проверка целостности загрузок, общий стандарт
SHA384, SHA512 Windows PowerShell 4.0+, PowerShell 7+ Сценарии с повышенными требованиями к стойкости
MD5 Windows PowerShell 4.0+, PowerShell 7+ (на Linux зависит от сборки .NET) Совместимость со старыми списками сумм, быстрая дедупликация
SHA1 Windows PowerShell 4.0+, PowerShell 7+ Только для совместимости: считается устаревшим

Пример с явным указанием алгоритма:

Get-FileHash «C:\файл.zip» -Algorithm MD5

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

Сравнение хеша файла с эталонной суммой

Самая частая задача: скачать файл, рядом лежит опубликованная сумма, нужно убедиться в совпадении. Наивное сравнение строк через оператор -eq часто подводит из-за регистра символов и лишних пробелов. Надёжнее использовать оператор -eq в режиме без учёта регистра (им является поведение по умолчанию для строк в PowerShell) плюс очистку строки:

$etalon = «a1b2c3…» # сумма с сайта

$fact = (Get-FileHash «C:\Downloads\file.iso» -Algorithm SHA256).Hash

if ($fact.Trim() -eq $etalon.Trim()) { «Совпадает» } else { «НЕ совпадает» }

Обратите внимание на две детали:

  • Get-FileHash возвращает сумму заглавными буквами, а на сайтах она чаще строчными. Строковое сравнение в PowerShell по умолчанию регистр игнорирует, поэтому проблем обычно нет, но если вы принудительно включили чувствительность к регистру — приведите обе строки к одному виду через .ToUpper() или .ToLower().
  • В скопированной сумме могут оказаться невидимые символы переноса строки. Метод .Trim() убирает пробелы и переводы строк по краям.

Если сверка делается вручную, а не скриптом, удобнее вывести сумму в буфер обмена:

(Get-FileHash «C:\файл.iso»).Hash | Set-Clipboard

и сравнить визуально или вставить в любой текстовый компаратор.

Пакетный расчёт хешей для папки

Когда нужно просуммировать много файлов, комбинация Get-ChildItem и Get-FileHash решает задачу одной строкой:

Get-ChildItem «D:\Archive» -File -Recurse | Get-FileHash -Algorithm SHA256 | Select-Object Hash, Path

Здесь -Recurse захватывает вложенные папки, а -File отсекает каталоги — передавать папки в Get-FileHash бессмысленно, командлет выдаст ошибку.

Результат удобно сохранить в CSV, чтобы позже сравнить состояние файлов:

Get-ChildItem «D:\Docs» -File -Recurse | Get-FileHash | Export-Csv «D:\hashes.csv» -NoTypeInformation

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

Скрипт сверки текущих сумм с сохранённым списком

Условный пример проверки по ранее сохранённому CSV:

$old = Import-Csv «D:\hashes.csv»

foreach ($row in $old) {

  if (-not (Test-Path $row.Path)) { Write-Host «Отсутствует:» $row.Path; continue }

  $now = (Get-FileHash $row.Path).Hash

  if ($now -ne $row.Hash) { Write-Host «Изменён:» $row.Path }

}

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

Производительность и большие файлы

Get-FileHash читает файл целиком, поэтому время расчёта пропорционально размеру файла и скорости диска. Практические ориентиры:

  • Гигабайтный файл на обычном SSD суммируется за секунды; на медленном HDD упор будет в скорость чтения диска, а не в процессор.
  • Разница между MD5 и SHA-256 по скорости на современных машинах обычно несущественна для разовых проверок — выбирайте алгоритм по требованиям совместимости и стойкости, а не ради экономии секунд.
  • При пакетной обработке тысяч мелких файлов узким местом становятся операции с файловой системой. Прогресс удобно показывать так:

$files = Get-ChildItem «D:\Data» -File -Recurse

$i = 0

$files | ForEach-Object {

  $i++

  Write-Progress -Activity «Расчёт хешей» -Status $_.Name -PercentComplete ($i / $files.Count * 100)

  Get-FileHash $_.FullName

} | Export-Csv «D:\hashes.csv» -NoTypeInformation

Во время работы командлет занимает файл на чтение. Если файл открыт другой программой с монопольным доступом, Get-FileHash сообщит об ошибке доступа — закройте приложение и повторите.

Типичные ошибки и как их избежать

  • Несовпадение алгоритмов. Самая распространённая причина «хеш не сходится». Сверьте, что эталон посчитан тем же алгоритмом, который указан в -Algorithm (или оставлен по умолчанию SHA256).
  • Разный регистр и пробелы. Используйте Trim() и приведение к одному регистру при программном сравнении.
  • Передача папки вместо файла. Get-FileHash работает только с файлами; фильтруйте вывод Get-ChildItem параметром -File.
  • Файл изменился между скачиванием и проверкой. Если антивирус или менеджер загрузок доработал файл, сумма уже не совпадёт с эталоном. Сверяйте сразу после загрузки.
  • Ошибочный путь с пробелами. Заключайте пути в кавычки: Get-FileHash «C:\Мои документы\отчёт.pdf».
  • Сравнение через визуальный просмотр длинных строк. Человеческий глаз легко пропускает различия в 64-символьной сумме — доверяйте программному сравнению, а не взгляду.

Когда встроенных средств недостаточно

Get-FileHash покрывает большинство потребностей, но есть ситуации, где нужны другие инструменты:

  • Проверка цифровых подписей. Для подтверждения авторства исполняемых файлов используйте командлет Get-AuthenticodeSignature в Windows — он проверяет подпись, а не просто сумму.
  • Нестандартные алгоритмы. Если источник публикует сумму в формате, который Get-FileHash не поддерживает (например, BLAKE3), понадобится сторонняя утилита или модуль.
  • Хеширование потоков и строк. Для данных в памяти, а не в файле, используйте классы .NET напрямую, например System.Security.Cryptography.SHA256 через Create() и ComputeHash().
  • Массовый мониторинг целостности. Регулярный контроль сотен машин лучше доверить специализированным средствам контроля целостности, а не самописным скриптам.

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

Почему мой хеш не совпадает с суммой на сайте?

Проверьте три вещи: тот ли алгоритм используется (SHA256 против MD5), не добавились ли пробелы или перенос строки при копировании, и не изменился ли файл после загрузки. Если всё верно, а суммы разные — файл повреждён или подменён, скачивайте заново из другого источника.

Можно ли посчитать хеш строки, а не файла?

Напрямую Get-FileHash работает с файлами, но строку можно записать во временный файл или использовать классы .NET: [System.Security.Cryptography.SHA256]::Create().ComputeHash() с последующим преобразованием байтов в шестнадцатеричную строку.

Работает ли Get-FileHash в старых версиях Windows?

Командлет появился в PowerShell 4.0, который входит в состав Windows 8.1 и Windows Server 2012 R2. На Windows 7 со штатным PowerShell 2.0 его нет — потребуется обновить PowerShell или использовать утилиту certutil из состава Windows.

Какой алгоритм выбрать?

Если нет внешних требований — оставляйте SHA256 по умолчанию. MD5 и SHA1 применяйте только когда эталонная сумма опубликована именно в них и альтернативы нет.

Что делать дальше

Главный принцип: хеш имеет смысл только в паре с надёжным эталоном и совпадающим алгоритмом. Перед сверкой всегда уточняйте, какой алгоритм использовал источник, и сравнивайте строки программно, а не на глаз. Для быстрого старта достаточно запомнить одну команду — Get-FileHash «путь\к\файлу» — и правило сверять результат с опубликованной суммой того же типа. Если задача регулярная, сохраните список сумм в CSV и периодически повторяйте расчёт: это займёт пару минут на настройку и избавит от ручных проверок.

PEFile.ru