Для расчёта хеша файла в 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 в старых версиях Windows?
- Какой алгоритм выбрать?
- Что делать дальше
Зачем вообще считать хеш файла
Хеш — это короткая строка фиксированной длины, которая вычисляется из содержимого файла. Если изменить хотя бы один байт, сумма изменится практически до неузнаваемости. Отсюда три основных сценария использования:
- Проверка целостности после загрузки. Разработчики дистрибутивов и программ публикуют контрольные суммы; сверка подтверждает, что файл скачался целиком и без повреждений.
- Убеждение, что два файла идентичны. Быстрее сравнить суммы, чем побайтово сравнивать большие файлы.
- Контроль изменений. Сохранив суммы важных файлов, можно позже обнаружить их подмену или случайную модификацию.
Важно понимать ограничение: совпадение хеша говорит о совпадении содержимого с высокой вероятностью, но не является криптографическим доказательством подлинности. Для подтверждения авторства файла используются цифровые подписи — это отдельный механизм, хотя он тоже опирается на хеширование.
Базовый синтаксис 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 и периодически повторяйте расчёт: это займёт пару минут на настройку и избавит от ручных проверок.
