Как узнать хэш (контрольную сумму) файла в Windows
У каждого файла имеется свое собственное уникальное значение, которое может быть использовано для проверки файла. Это значение носит название хэш или контрольная сумма. Оно зачастую используется разработчиками программного обеспечения при обращении к файлам. По контрольной сумму проходит сверка файла с целью выявить его целостность и совпадение с заданным идентификатором.
Есть несколько алгоритмов вычислений контрольной суммы файла, среди которых наиболее известны и распространены MD5, SHA256, SHA1, SHA384. Вычислить хэш файла, то есть его контрольную сумму, можно как стандартными инструментами Windows, так и сторонними сервисами. В рамках данной статьи рассмотрим, как это сделать.
Оглавление: 1. Как узнать хэш файла через командную строку 2. Как узнать хэш файла через утилиту PowerShell 3. Как узнать хэш файла при помощи утилиты HashTab
Как узнать хэш файла через командную строку
Командная строка в Windows позволяет выполнять различные действия, как с самой системой, так и с отдельными файлами.Через нее можно определить контрольную сумму файлов при помощи встроенной утилиты CertUtil.
Чтобы через командную строку узнать хэш файла, достаточно запустить командную строку и ввести в командную строку следующий запрос:
certutil -hashfile *путь к файлу* *алгоритм*
Вместо *путь к файлу* нужно ввести полный путь к файлу. Например: d:\8.jpg
Вместо *алгоритм* нужно ввести название алгоритма, по которому нужно высчитать контрольную сумму. Утилита CertUtil умеет высчитывать контрольную сумму по алгоритмам: MD2, MD4, MD5, SHA1, SHA256, SHA384, SHA512.
Выполнив указанную команду, можно будет увидеть хэш файла, вычисленный при помощи утилиты CertUtil.
Как узнать хэш файла через утилиту PowerShell
Еще одна встроенная в Windows утилита, которая способна определить контрольную сумму файла — это PowerShell. Она отличается от CertUtil поддержкой большего числа алгоритмов для вычисления контрольной суммы: SHA256, MD5, SHA384, SHA1, SHA512, MACTripleDES, RIPEMD160.
Для проверки хэша через утилиту PowerShell используется следующая команда:
Get-FileHash *путь к файлу* | Format-List
Вместо *путь к файлу* необходимо указать полный путь до файла, контрольная сумма которого проверяется.
Важно заметить, что по умолчанию утилита PowerShell ведет расчет контрольной суммы по алгоритму SHA256.
Если требуется использовать другой алгоритм, это нужно указать в команде при выполнении запроса. Например, чтобы определить хэш по алгоритму MD5 потребуется выполнить команду:
Get-FileHash *путь к файлу* -Algorithm MD5 | Format-List
Вместо MD5 можно указать другие поддерживаемые утилитой алгоритмы.
Как узнать хэш файла при помощи утилиты HashTab
Помимо инструментов Windows для определения контрольной суммы файла можно использовать сторонние приложения. Например, одной из удобных программ, способной определить хэш файла, является HashTab. Это крайне простое приложение, которое можно бесплатно скачать из интернета.
После загрузки программы HashTab и установки, в свойствах файлов создается новая вкладка, которая носит название “Хэш-суммы файлов”. В этом вкладке можно видеть расчет контрольной суммы для файла в различных алгоритмах.
Стоит отметить, что помимо отображения значений хэша, программа HashTab также умеет проводить сравнение файлов.
hash_file
Название выбранного алгоритма хеширования (например, «md5», «sha256», «haval160,4» и т.д.). Список поддерживаемых алгоритмов смотрите в hash_algos() .
Путь или URL к файлу, который будет хеширован; Поддерживается интерфейс fopen.
Когда установлено в true , выводит необработанные двоичные данные. При false выводит данные в шестнадцатеричной кодировке в нижнем регистре.
Множество опций для различных алгоритмов хеширования. В настоящее время в вариантах MurmurHash поддерживается только параметр «seed».
Возвращаемые значения
Возвращает строку, содержащую вычисленный хеш-код в шестнадцатеричной кодировке в нижнем регистре. Если binary задан как true , то возвращается хеш-код в виде бинарных данных.
Список изменений
Версия | Описание |
---|---|
8.1.0 | Добавлен параметр options . |
Примеры
Пример #1 Использование hash_file()
/* Создаём файл, чтобы вычислить его хеш */
file_put_contents ( ‘example.txt’ , ‘Наглый коричневый лисёнок прыгает вокруг ленивой собаки.’ );
?php
echo hash_file ( ‘sha256’ , ‘example.txt’ );
?>
Результат выполнения приведённого примера:
199f52fc9f2492c64449ed96003f135f8ea428e353e50c40b0c1a16b9c16f571
Смотрите также
- hash() — Генерирует хеш-код (подпись сообщения)
- hash_hmac_file() — Генерация хеш-кода на основе ключа, используя метод HMAC и содержимое полученного файла
- hash_update_file() — Добавляет данные из файла в активный контекст хеширования
- md5_file() — Возвращает MD5-хеш файла
- sha1_file() — Возвращает SHA1-хеш файла
Improve This Page
User Contributed Notes 9 notes
13 years ago
If you want to use hash_file() to get the CRC32 value of a file, use the following to unpack the hex string returned by the function to an integer (similar to crc32()):
$hash = hash_file(‘crc32b’, $filepath);
$array = unpack(‘N’, pack(‘H*’, $hash));
$crc32 = $array[1];
8 years ago
bench 476 Mo, win is ‘haval160,4’ : 0.037002
ALGO: md2, time: 74.702272891998
ALGO: md4, time: 9.2155270576477
ALGO: md5, time: 9.0815191268921
ALGO: sha1, time: 9.0945210456848
ALGO: sha224, time: 9.1465229988098
ALGO: sha256, time: 9.143522977829
ALGO: sha384, time: 14.065804004669
ALGO: sha512, time: 13.990800857544
ALGO: ripemd128, time: 9.3185329437256
ALGO: ripemd160, time: 9.3165328502655
ALGO: ripemd256, time: 9.2495288848877
ALGO: ripemd320, time: 9.2395279407501
ALGO: whirlpool, time: 27.779588937759
ALGO: tiger128,3, time: 9.3075330257416
ALGO: tiger160,3, time: 9.1875250339508
ALGO: tiger192,3, time: 9.3875370025635
ALGO: tiger128,4, time: 9.1755249500275
ALGO: tiger160,4, time: 9.355535030365
ALGO: tiger192,4, time: 9.2025260925293
ALGO: snefru, time: 42.781446218491
ALGO: snefru256, time: 42.613437175751
ALGO: gost, time: 18.606064081192
ALGO: gost-crypto, time: 18.664067983627
ALGO: adler32, time: 9.1535229682922
ALGO: crc32, time: 10.126579999924
ALGO: crc32b, time: 10.01757311821
ALGO: fnv132, time: 9.7505569458008
ALGO: fnv1a32, time: 9.7935597896576
ALGO: fnv164, time: 9.8945660591125
ALGO: fnv1a64, time: 9.3025319576263
ALGO: joaat, time: 9.7175559997559
ALGO: haval128,3, time: 9.6855540275574
ALGO: haval160,3, time: 10.10857796669
ALGO: haval192,3, time: 9.6765530109406
ALGO: haval224,3, time: 20.636180877686
ALGO: haval256,3, time: 10.641607999802
ALGO: haval128,4, time: 7.5594329833984
ALGO: haval160,4, time: 7.2884171009064
ALGO: haval192,4, time: 7.2934169769287
ALGO: haval224,4, time: 7.2964169979095
ALGO: haval256,4, time: 7.3034179210663
ALGO: haval128,5, time: 8.3244760036469
ALGO: haval160,5, time: 8.3174757957458
ALGO: haval192,5, time: 8.3204758167267
ALGO: haval224,5, time: 8.3234758377075
ALGO: haval256,5, time: 8.3254759311676
bench 13,0 Mo, win is ‘adler32’ : 0.037002
ALGO: md2, time: 2.0341160297394
ALGO: md4, time: 0.062004089355469
ALGO: md5, time: 0.071003913879395
ALGO: sha1, time: 0.086004972457886
ALGO: sha224, time: 0.18301010131836
ALGO: sha256, time: 0.18301105499268
ALGO: sha384, time: 0.36102104187012
ALGO: sha512, time: 0.3610200881958
ALGO: ripemd128, time: 0.15900897979736
ALGO: ripemd160, time: 0.20701193809509
ALGO: ripemd256, time: 0.16500997543335
ALGO: ripemd320, time: 0.22501301765442
ALGO: whirlpool, time: 0.74204206466675
ALGO: tiger128,3, time: 0.12200689315796
ALGO: tiger160,3, time: 0.12100696563721
ALGO: tiger192,3, time: 0.12200713157654
ALGO: tiger128,4, time: 0.15700888633728
ALGO: tiger160,4, time: 0.15700888633728
ALGO: tiger192,4, time: 0.15600895881653
ALGO: snefru, time: 1.1520659923553
ALGO: snefru256, time: 1.151065826416
ALGO: gost, time: 0.48902797698975
ALGO: gost-crypto, time: 0.49202799797058
ALGO: adler32, time: 0.037002086639404
ALGO: crc32, time: 0.10300588607788
ALGO: crc32b, time: 0.093006134033203
ALGO: fnv132, time: 0.043002128601074
ALGO: fnv1a32, time: 0.045002937316895
ALGO: fnv164, time: 0.12800693511963
ALGO: fnv1a64, time: 0.12800693511963
ALGO: joaat, time: 0.070003986358643
ALGO: haval128,3, time: 0.12900686264038
ALGO: haval160,3, time: 0.12800693511963
ALGO: haval192,3, time: 0.12900805473328
ALGO: haval224,3, time: 0.12800693511963
ALGO: haval256,3, time: 0.12800693511963
ALGO: haval128,4, time: 0.19901204109192
ALGO: haval160,4, time: 0.1990110874176
ALGO: haval192,4, time: 0.20001196861267
ALGO: haval224,4, time: 0.20001101493835
ALGO: haval256,4, time: 0.20001220703125
ALGO: haval128,5, time: 0.22601294517517
ALGO: haval160,5, time: 0.2270131111145
ALGO: haval192,5, time: 0.2270131111145
ALGO: haval224,5, time: 0.2270131111145
ALGO: haval256,5, time: 0.22701287269592
12 years ago
I have verified that the output of the «crc32» is the ITU I.363.5 algorithm (a.k.a. AAL5 CRC — popularised by BZIP2 but also used in ATM transmissions — the algorithm is the same as that in POSIX 1003.2-1992 in Cksum but that stuffs the size into the CRC at the end for extra measure). However, the output is expressed in reverse order to many CRC programs. Using the «standard» crctest.txt (numbers 1 to 9 in sequence — google it, it’s not hard to find), php will output 181989fc — many other (Intel little endian) programs would output this as fc891918, hence the confusion (that I have had, at least).
The crc32b is the 32-bit Frame Check Sequence of ITU V.42 (used in Ethernet and popularised by PKZip). The output from this CRC is popularised in Intel little endian format and would produce cbf43926 on the same file.
15 years ago
The ‘octets reversed’ you are seeing is the bug 45028 which has been fixed. http://bugs.php.net/bug.php?id=45028
The difference between crc32 and crc32b is explained on mhash man page. crc32 is the one used on ethernet, while crc32b is the one used on zip, png. They differ on the table used.
6 years ago
It’s sometimes necessary to hash the same file with different algos,
function hash_file_multi ( $algos = [], $filename ) if (! is_array ( $algos )) throw new \InvalidArgumentException ( ‘First argument must be an array’ );
>
if (! is_string ( $filename )) throw new \InvalidArgumentException ( ‘Second argument must be a string’ );
>
if (! file_exists ( $filename )) throw new \InvalidArgumentException ( ‘Second argument, file not found’ );
>
$result = [];
$fp = fopen ( $filename , «r» );
if ( $fp ) // ini hash contexts
foreach ( $algos as $algo ) $ctx [ $algo ] = hash_init ( $algo );
>
// calculate hash
while (! feof ( $fp )) $buffer = fgets ( $fp , 65536 );
foreach ( $ctx as $key => $context ) hash_update ( $ctx [ $key ], $buffer );
>
>
// finalise hash and store in return
foreach ( $algos as $algo ) $result [ $algo ] = hash_final ( $ctx [ $algo ]);
>
fclose ( $fp );
> else throw new \InvalidArgumentException ( ‘Could not open file for reading’ );
>
return $result ;
>
?>
Which would be used like:
$result = hash_file_multi ([ ‘md5’ , ‘sha1’ , ‘sha256’ ], ‘path/to/file.ext’ );
var_dump ( $result [ ‘md5’ ] === hash_file ( ‘md5’ , ‘path/to/file.ext’ )); //true
var_dump ( $result [ ‘sha1’ ] === hash_file ( ‘sha1’ , ‘path/to/file.ext’ )); //true
var_dump ( $result [ ‘sha256’ ] === hash_file ( ‘sha256’ , ‘path/to/file.ext’ )); //true
11 years ago
The Hash_File() function returns the same value as if the function Hash() had been performed on the same exact piece of data. At first, I was uncertain if Hash_File() used the filename, or even the permission settings, when defining the data to be hashed for the given algorithm. If it did work that way, then that means the same exact files would have different HASH values when you moved or renamed them on your system. Anyway, fortunately, it does not work that way. Hash() and Hash_File() produce identical results for the same pieces of data. This is also true for the relationship between the Hash_HMAC() and Hash_HMAC_File() functions: the same pieces of data, the same keys, produce identical results. It was a wise, design principle.
Some sample code to demonstrate this principle :
$test_data = «php-hashing» ;
$test_file = «test.txt» ;
$test_file_read = file_get_contents ( $test_file );
$test_data_hash = hash ( «md2» , $test_data , FALSE );
$test_file_hash = hash_file ( «md2» , $test_file , FALSE );
print( «Data Hash ( $test_data ): $test_data_hash
» );
print( «File Hash ( $test_file_read ): $test_file_hash » );
Data Hash (php-hashing): 457d84e1d69e519a7b73348db21477d3
File Hash (php-hashing): 457d84e1d69e519a7b73348db21477d3
2 способа. Как тестировать hash начинающему тестировщику? 2023
Хеш-функция или в народе хеш — очень важная и нужная штука, которая используется повсеместно, например в защите файлов, обнаружение вирусов, аутентификация и другое. Но как ее тестировать?
Далее вы узнаете:
- Что такое хэш-функция?
- Что такое криптографическая хэш-функция?
- Как тестировать хэш?
Поставь лайк за полезный материал❤
Хеш-функция — это математическая функция, которая принимает ввод (или «сообщение») и возвращает строку символов фиксированного размера, которая обычно представляет собой «дайджест», уникальный для уникального ввода. Одни и те же входные данные всегда будут давать один и тот же результат, но даже небольшое изменение ввода приведет к совершенно другому результату.
Хеш-функции обычно используются в структурах данных, таких как хэш-таблицы, и в криптографии. Их можно использовать для создания уникального отпечатка цифрового файла, проверки целостности данных и обнаружения дубликатов в больших наборах данных.
Криптографическая хеш-функция — это особый тип хэш-функции, обладающий определенными свойствами, делающими ее пригодной для использования в криптографии. Это односторонняя функция, что означает, что практически невозможно обратить процесс вспять и восстановить исходный ввод из хэша. Кроме того, вычислительно невозможно найти два разных входа, которые производят один и тот же хэш (известный как «коллизия»). Некоторыми примерами криптографических хеш-функций являются SHA-256, SHA-1 и MD5.
Алгоритм хеширование данных
Первый способ, чтобы проверить хеш-сумму файла, вы можете использовать такой инструмент, как утилита командной строки «md5sum» (для хэша MD5), «sha1sum» (для хэша SHA-1) или «sha256sum» (для хэша SHA-256). хэш).
Основной синтаксис:
- md5sum /путь/к/файлу
- sha1sum /путь/к/файлу
- sha256sum /путь/к/файлу
Слево хеш, справа название файла
Затем вы можете сравнить выходное хеш-значение с ожидаемым хэш-значением. Если они совпадают, файл считается неповрежденным и неизмененным.
Другой способ тестирования — использовать программное обеспечение, такое как Hashtab для Windows, оно даст вам значения хэша для выбранного вами файла, а также вы сможете сравнить его с ожидаемым хэшем.
Вы также можете использовать веб-сайты онлайн-калькулятора хэшей, вам просто нужно загрузить файл, и он даст вам значение хеш-функции.
Итог. Вы узнали про хэш и то, как его можно тестировать.
Хочу еще привести вам пример кейса для большего понимания:
- Возьми файл,
- Посмотри его хэш,
- Загрузи в тестовое приложение,
- Скачай,
- Посмотри хэш и сравни с прошлым.
Также хэш можно было посмотреть, после загрузки в приложение через консоль разработчика. На самом деле вариантов в разы намного больше и зависит от ваших кейсов.
Get-File Hash
Вычисляет хэш-значение для файла с помощью указанного хэш-алгоритма.
Синтаксис
Get-FileHash [-Path] [[-Algorithm] ] []
Get-FileHash [-LiteralPath] [[-Algorithm] ] []
Get-FileHash [-InputStream] [[-Algorithm] ] []
Описание
Командлет Get-FileHash вычисляет хэш-значение файла с помощью указанного алгоритма хэша. Хэш-значение представляет собой уникальное значение, соответствующее содержимому файла. Вместо определения содержимого файла по его имени, расширению или иному обозначению хэш назначает содержимому файла уникальное значение. Имена и расширения файлов могут изменяться без изменения содержимого файла и без изменения хэш-значения. Аналогичным образом содержимое файла можно изменить без изменения имени или расширения. Однако при изменении даже одного символа в содержимом файла хэш-значение этого файла тоже изменяется.
Хэш-значения позволяет криптографически защищенным образом убедиться, что содержимое файла не было изменено. Хотя некоторые хэш-алгоритмы, в том числе MD5 и SHA1, больше не считаются безопасными для атак, цель безопасного хэш-алгоритма заключается в том, чтобы отрисовка невозможно изменить содержимое файла , либо случайно, либо вредоносной или несанкционированной попытки — и сохранить то же хэш-значение. С помощью хэш-значений также можно определить, имеют ли два разных файла эквивалентное содержимое. Если хэш-значения двух файлов идентичны, содержимое этих файлов также идентично.
По умолчанию Get-FileHash командлет использует алгоритм SHA256, хотя можно использовать любой хэш-алгоритм, поддерживаемый целевой операционной системой.
Примеры
Пример 1. Вычисление хэш-значения для файла
В этом примере командлет используется Get-FileHash для вычисления хэш-значения файла /etc/apt/sources.list . Хэш-алгоритм используется по умолчанию SHA256 . Выходные данные передаются Format-List командлету для форматирования выходных данных в виде списка.
Get-FileHash /etc/apt/sources.list | Format-List Algorithm : SHA256 Hash : 3CBCFDDEC145E3382D592266BE193E5BE53443138EE6AB6CA09FF20DF609E268 Path : /etc/apt/sources.list
Пример 2. Вычисление хэш-значения для ISO-файла
В этом примере используется Get-FileHash командлет и алгоритм SHA384 для вычисления хэш-значения ISO-файла, скачаного администратором из Интернета. Выходные данные передаются Format-List командлету для форматирования выходных данных в виде списка.
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
Пример 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
Указывает функцию криптографического хэша, используемую для вычисления хэш-значения содержимого указанного файла или потока. Функция криптографического хэша имеет свойство, которое невозможно найти два разных файла с одинаковым хэш-значением. Хэш-функции обычно используются с цифровыми подписями и для обеспечения целостности данных. Допустимые значения для этого параметра:
Если значение не указано или параметр пропущен, используется значение по умолчанию — SHA256.
По соображениям безопасности алгоритмы MD5 и SHA1, которые больше не считаются безопасными, следует использовать только для проверки на наличие изменений и не следует применять для создания хэш-значений файлов, которые требуют защиты от атак или незаконного изменения.
Type: | String |
Accepted values: | SHA1, SHA256, SHA384, SHA512, MD5 |
Position: | 1 |
Default value: | SHA256 |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-InputStream
Задает входной поток.
Type: | Stream |
Position: | 0 |
Default value: | None |
Required: | True |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-LiteralPath
Указывает путь к файлу. В отличие от параметра Path, значение параметра LiteralPath используется точно так же, как и типизированный параметр. Никакие символы не распознаются как подстановочные знаки. Если путь содержит escape-символы, заключите его в одинарные кавычки. Одинарные кавычки указывают PowerShell не интерпретировать символы как escape-последовательности.
Type: | String [ ] |
Aliases: | PSPath, LP |
Position: | 0 |
Default value: | None |
Required: | True |
Accept pipeline input: | True |
Accept wildcard characters: | False |
-Path
Указывает путь к одному или нескольким файлам в виде массива. Можно использовать подстановочные знаки.
Type: | String [ ] |
Position: | 0 |
Default value: | None |
Required: | True |
Accept pipeline input: | True |
Accept wildcard characters: | True |
Входные данные
Строку, содержащую путь к файлу, можно передать в этот командлет.
Выходные данные
Microsoft.PowerShell.Utility.FileHash
Этот командлет возвращает объект, представляющий путь к указанному файлу, значение вычисляемого хэша и алгоритм, используемый для вычисления хэша.
Связанные ссылки
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.