Хеш-сумма файла. Сравнить файлы PDF, ISO, JPG, Word и любые другие

Сравнение хеш-сумм файлов
Рассмотрим только сравнение файлов на абсолютную идентичность с помощью проверки хеш-сумм.
Найти отличия, например, в документах Word или Excel можно штатными средствами Office.
Найти же конкретные отличия в паре образов ISO или двух нередактируемых PDF - отдельная грустная тема.

Содержание

1. Сравнить файлы из проводника Windows 11

Пример не требует установки абсолютно никаких приложений. Найдем хеш-сумму файла C:\Test\cpio.5.pdf

— включите Проводник (кто не в курсе, нажмите ⊞Win + E)
— встаньте на папку с исследуемым файлом (в примере C:\Test\) и нажмите правую клавишу
— нажмите «Открыть в терминале».

появится экран терминала PowerShell

введите команду Get-FileHash [имя файла] | Format-List [Алгоритм]

в примере получилось

				
					PS C:\Test> Get-FileHash cpio.5.pdf | Format-List
				
			

и нажмите Ввод.
Вы увидите почти уникальную хеш-сумму файла, полученную по умолчанию с помощью алгоритма SHA256. Алгоритм SHA256 — это двойка в 256 степени, или 77-значное десятичное число, или строка из 64 символов, которая содержит цифры и латинские буквы. Это очень много, и очень трудно подделать, но при желании можно в параметре Алгоритм задать и более (или менее) сложные криптографические алгоритмы, подробнее читайте ниже.

				
					Algorithm : SHA256
Hash      : 7A797AF608C343DF68C9CCB9B7B4DA1791393966AD1CFB2168853ADEBCC1C683
Path      : C:\Test\cpio.5.pdf
				
			

в этом примере, для файла «C:\Test\cpio.5.pdf» мы получили контрольную сумму из 64 символов.
Далее, чтобы проверить подлинность и полное отсутствие любых изменений в файле, полученном из другого источника, повторите сказанное для второго файла и сравните две контрольных суммы. Смена имени файла не влияет на контрольную сумму. Если суммы одинаковые — всё ок, изменений нет. Можно даже не открывать, к примеру, 50-страничное ТЗ, согласованное подрядчиком.

 

2. Сравнить файлы из консоли Windows командой CertUtil

Другой способ получить контрольную сумму файла — перейти в командную строку Windows. Для этого нажмите кнопку  ⊞Пуск в нижнем левом углу экрана и в поиске наберите команду cmd, или нажмите на клавиатуре  ⊞+R .В открывшемся окне введите команду

certutil -hashfile [Путь к файлу] [Алгоритм]

certutil — это программа командной строки, подробнее здесь.
[Путь к файлу] — если командная строка находится не в той же папке, что и ваш файл, введите полный путь к файлу, в примере это  C:\Test\cpio.5.pdf.
[Алгоритм] — для утилиты certutil можно указать следующие алгоритмы вычисления хеш-суммы файла: MD2, MD4, MD5, SHA1, SHA256, SHA384, SHA512.
Для 
SHA256 получится:

				
					d:\>certutil -hashfile C:\Test\cpio.5.pdf SHA256
				
			

Нажмите Ввод, чтобы получить контрольную сумму. В примере видно, что сумма такая же, как в варианте выше. Единственное различие — заглавные и строчные буквы, в данном случае это одно и то же.

				
					d:\>certutil -hashfile C:\Test\cpio.5.pdf SHA256
Хеш SHA256 C:\Test\cpio.5.pdf:
7a797af608c343df68c9ccb9b7b4da1791393966ad1cfb2168853adebcc1c683
CertUtil: -hashfile — команда успешно выполнена.
				
			

3. Сравнить файлы из Total Commander

Этот пример работает еще быстрее, но требует наличия платной программы — файлового менеджера Total Commander. Здесь всё предельно понятно:

1. Выделите файлы, которые нужно сравнить и перейдите в меню Файлы — Посчитать CRC-суммы.

2. Выберите алгоритм контрольной суммы. Total Commander предлагает 12 вариантов, оставим использованный выше SHA256.

3. В выбранной папке появится новый файл, в нашем случае (по умолчанию) Test.sha256. Встаньте на него и нажмите F3. Видим, что файлы одинаковые, а суммы полностью совпадают с примерами выше.

4. Если нет желания вглядываться и сравнивать длинные строки контрольных сумм, можно просто кликнуть мышью на файле с результатами проверки и сразу увидеть отчет

Зачем сравнивать файлы

  1. Обнаружить любые минимальные изменения без открытия или анализа файлов.
  2. Проверить безопасность. Убедиться, что файл не был заражен.
  3. Проверить подлинность. Убедиться, что файл не был подменен.
  4. Проверить целостность. Убедиться, что файл не был поврежден при передаче.
Get-FileHash вычисляет хеш-значение файла с помощью выбранного хеш-алгоритма.

Модуль: Microsoft.PowerShell.Utility

Синтаксис

Get-FileHash
   [-Path] <String[]>
   [[-Algorithm] <String>]
   [<CommonParameters>]
Get-FileHash
   [-LiteralPath] <String[]>
   [[-Algorithm] <String>]
   [<CommonParameters>]
Get-FileHash
   [-InputStream] <Stream>
   [[-Algorithm] <String>]
   [<CommonParameters>]

Описание

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

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

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

Примеры

Пример 1. Вычисление хеш-значения для файла

Get-FileHash /etc/apt/sources.list | Format-List

Algorithm : SHA256
Hash      : 3CBCFDDEC145E3382D592266BE193E5BE53443138EE6AB6CA09FF20DF609E268
Path      : /etc/apt/sources.list

В этом примере используется командлет Get-FileHash для вычисления хеш-значения файла /etc/apt/sources.list. Хэшалгоритм используется по умолчанию SHA256. Выходные данные передаются в командлет Format-List для форматирования выходных данных в виде списка.

Пример 2. Вычисление хеш-значения для ISO-файла

Get-FileHash C:\Users\user1\Downloads\Contoso8_1_ENT.iso -Algorithm SHA384 | Format-List

Algorithm : SHA384
Hash      : 20AB1C2EE19FC96A7C66E33917D191A24E3CE9DAC99DB7C786ACCE31E559144FEAFC695C58E508E2EBBC9D3C96F21FA3
Path      : C:\Users\user1\Downloads\Contoso8_1_ENT.iso

В этом примере используется командлет Get-FileHash и алгоритм SHA384 для вычисления хеш-файла, скачанного администратором из Интернета. Выходные данные передаются в командлет Format-List для форматирования выходных данных в виде списка.

Пример 3. Вычисление хеш-значения потока

В этом примере мы используем System.Net.WebClient для скачивания пакета на странице выпуска PowerShell . Страница выпуска также документирует хеш SHA256 каждого файла пакета. Мы можем сравнить опубликованное хеш-значение с тем, с которым мы вычисляем Get-FileHash.

$wc = [System.Net.WebClient]::new()
$pkgurl = 'https://github.com/PowerShell/PowerShell/releases/download/v6.2.4/powershell_6.2.4-1.debian.9_amd64.deb'
$publishedHash = '8E28E54D601F0751922DE24632C1E716B4684876255CF82304A9B19E89A9CCAC'
$FileHash = Get-FileHash -InputStream ($wc.OpenRead($pkgurl))
$FileHash.Hash -eq $publishedHash

True

Пример 4. Вычисление хеша строки

PowerShell не предоставляет командлет для вычисления хеша строки. Однако можно написать строку в поток и использовать параметр InputStream Get-FileHash для получения хеш-значения.

$stringAsStream = [System.IO.MemoryStream]::new()
$writer = [System.IO.StreamWriter]::new($stringAsStream)
$writer.write("Hello world")
$writer.Flush()
$stringAsStream.Position = 0
Get-FileHash -InputStream $stringAsStream | Select-Object Hash

Hash
----
64EC88CA00B268E5BA1A35678A1B5316D212F4F366B2477232534A8AECA37F3C

Параметры

-Algorithm

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

Допустимые значения для этого параметра:

  • SHA1
  • SHA256
  • SHA384
  • SHA512
  • MD5

Если значение не указано или если параметр не указан, значение по умолчанию — SHA256.

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

Тип:

String

Допустимые значения:

SHA1, SHA256, SHA384, SHA512, MD5

Position:

1

Default value:

SHA256

Обязательно:

False

Принять входные данные конвейера:

False

Принять подстановочные знаки:

False

-InputStream

Задает входной поток.

Тип:

 

Stream

Position:

 

0

Default value:

 

None

Обязательно:

 

True

Принять входные данные конвейера:

 

False

Принять подстановочные знаки:

 

False

-LiteralPath

Указывает путь к файлу. В отличие от параметра Path, значение параметра LiteralPath используется точно так же, как и тип. Символы не интерпретируются как подстановочные знаки. Если путь содержит escape-символы, заключите путь в одинарные кавычки. Одинарные кавычки указывают PowerShell не интерпретировать символы как escapeпоследовательности.

Тип:

String[]

Aliases:

PSPath, LP

Position:

0

Default value:

None

Обязательно:

True

Принять входные данные конвейера:

True

Принять подстановочные знаки:

False

-Path

Указывает путь к одному или нескольким файлам в виде массива. Разрешены подстановочные знаки.

Тип:

String[]

Position:

0

Default value:

None

Обязательно:

True

Принять входные данные конвейера:

True

Принять подстановочные знаки:

True

Входные данные

String

Строку, содержащую путь к файлу, можно передать в этот командлет.

Выходные данные

Microsoft.PowerShell.Utility.FileHash

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

Связанные ссылки

Format-List

Telegram
VK
Email
Прокрутить вверх