Как получить контрольную сумму MD5 в PowerShell

Я хотел бы вычислить контрольную сумму MD5 некоторого контента. Как это сделать в PowerShell?

Если содержимое является строкой:

$someString = "Hello World!" $md5 = new-object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider $utf8 = new-object -TypeName System.Text.UTF8Encoding $hash = [System.BitConverter]::ToString($md5.ComputeHash($utf8.GetBytes($someString))) 

Если содержимое является файлом:

 $someFilePath = "C:\foo.txt" $md5 = New-Object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider $hash = [System.BitConverter]::ToString($md5.ComputeHash([System.IO.File]::ReadAllBytes($someFilePath))) 

Начиная с версии PowerShell 4, это легко сделать для файлов из коробки с Get-FileHash командлета Get-FileHash :

 Get-FileHash  -Algorithm MD5 

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

Если вы используете расширения сообщества PowerShell, есть командный файл Get-Hash, который будет делать это легко:

 C:\PS> "hello world" | Get-Hash -Algorithm MD5 Algorithm: MD5 Path : HashString : E42B054623B3799CB71F0883900F2764 

Вот две строки, просто измените «привет» в строке # 2:

 PS C:\> [Reflection.Assembly]::LoadWithPartialName("System.Web") PS C:\> [System.Web.Security.FormsAuthentication]::HashPasswordForStoringInConfigFile("hello", "MD5") 

Вот функция, которую я использую для обработки относительных и абсолютных путей:

 function md5hash($path) { $fullPath = Resolve-Path $path $md5 = new-object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider $file = [System.IO.File]::Open($fullPath,[System.IO.Filemode]::Open, [System.IO.FileAccess]::Read) try { [System.BitConverter]::ToString($md5.ComputeHash($file)) } finally { $file.Dispose() } } 

Спасибо @davor выше за предложение использовать Open () вместо ReadAllBytes () и @ jpmc26 для предложения использовать блок finally.

В ComputeHash () есть много примеров в Интернете. Мое тестирование показало, что это было очень медленно при работе по сетевому соединению. Ниже приведенный ниже fragment работает намного быстрее, но YMMV:

 $md5 = [System.Security.Cryptography.MD5]::Create("MD5") $fd = [System.IO.File]::OpenRead($file) $buf = new-object byte[] (1024*1024*8) # 8mb buffer while (($read_len = $fd.Read($buf,0,$buf.length)) -eq $buf.length){ $total += $buf.length $md5.TransformBlock($buf,$offset,$buf.length,$buf,$offset) write-progress -Activity "Hashing File" ` -Status $file -percentComplete ($total/$fd.length * 100) } # finalize the last read $md5.TransformFinalBlock($buf,0,$read_len) $hash = $md5.Hash # convert hash bytes to hex formatted string $hash | foreach { $hash_txt += $_.ToString("x2") } write-host $hash_txt 

На этом сайте приведен пример: http://blog.brianhartsock.com/2008/12/13/using-powershell-for-md5-checksums/ . Он использует платформу .NET для создания экземпляра хеш-алгоритма MD5 для вычисления hashа.

Вот код из статьи, включающий комментарий Стивена:

 param ( $file ) $algo = [System.Security.Cryptography.HashAlgorithm]::Create("MD5") $stream = New-Object System.IO.FileStream($Path, [System.IO.FileMode]::Open, [System.IO.FileAccess]::Read) $md5StringBuilder = New-Object System.Text.StringBuilder $algo.ComputeHash($stream) | % { [void] $md5StringBuilder.Append($_.ToString("x2")) } $md5StringBuilder.ToString() $stream.Dispose() 

Еще одна встроенная команда, которая давно установлена ​​в Windows по умолчанию, начиная с 2003 года, является certutil, что, конечно же, можно вызвать из powershell.

CertUtil -hashfile file.foo MD5

(оговорка: MD5 должен быть во всех шапках для максимальной надежности)

Это становится однострочным, если вы загружаете FCIV из Microsoft.

Загруженный верификатор проверки чеков контрольной суммы Microsoft отсюда https://support.microsoft.com/en-us/kb/841290

Выполните следующую команду. У меня было десять файлов для проверки.

 gci WTAM*.tar | % {.\fciv $_.Name} 

Этот вопрос составляет почти 3 года, с тех пор, как некоторые комментируют, есть функция Get-FileHash, которая очень удобна.

 PS C:\> Get-FileHash C:\Users\Andris\Downloads\Contoso8_1_ENT.iso -Algorithm SHA384 | Format-List Algorithm : SHA384 Hash : 20AB1C2EE19FC96A7C66E33917D191A24E3CE9DAC99DB7C786ACCE31E559144FEAFC695C58E508E2EBBC9D3C96F21FA3 Path : C:\Users\Andris\Downloads\Contoso8_1_ENT.iso 

Просто измените SHA384 на MD5.

Пример из официальной документации PowerShell 5.1 .

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

Это вернет хеш MD5 для файла на удаленном компьютере:

 Invoke-Command -ComputerName RemoteComputerName -ScriptBlock { $fullPath = Resolve-Path 'c:\Program Files\Internet Explorer\iexplore.exe' $md5 = new-object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider $file = [System.IO.File]::OpenRead($fullPath) $hash = [System.BitConverter]::ToString($md5.ComputeHash($file)) $hash -replace "-", "" $file.Dispose() } 

Пример для меню правой кнопки мыши:

 [HKEY_CLASSES_ROOT\*\shell\SHA1 PS check\command] @="C:\\Windows\\system32\\WindowsPowerShell\\v1.0\\powershell.exe -NoExit -Command get-filehash -algorithm SHA1 '%1'" 

Довольно пример печати, пытающийся подтвердить SHA256 отпечаток загруженного gpg4win v3.0.3 с помощью powershell v4 (требуется Get-FileHash )

Загрузите пакет с https://www.gpg4win.org/download.html , откройте PowerShell, возьмите hash со страницы загрузки и запустите:

 cd ${env:USERPROFILE}\Downloads $file="gpg4win-3.0.3.exe" # set $hash to the hash reference from the download page: $hash="477f56212ee60cc74e0c5e5cc526cec52a069abff485c89c2d57d1b4b6a54971" # if you have an MD5 hash: # $hashAlgo="MD5" $hashAlgo="SHA256" $computed_hash=(Get-FileHash -Algorithm $hashAlgo $file).Hash.ToUpper() if ( $computed_hash.CompareTo($hash.ToUpper()) -eq 0 ) { Write-Output "Hash matches for file $file" } else { Write-Output ( "Hash DOES NOT match for file {0}:`nOriginal hash: {1} `nComputed hash: {2}" -f ( $file, $hash.ToUpper(), $computed_hash ) ) } 

Вывод:

 Hash matches for file gpg4win-3.0.3.exe 
  • Web.Config преобразуется за пределы Microsoft MSBuild?
  • Реализация PowerShell 2.0 ConvertFrom-Json и ConvertTo-Json
  • Как получить только каталоги с помощью Get-ChildItem?
  • Удаление файлов старше 15 дней с помощью PowerShell
  • экземпляр с альтернативными учетными данными
  • Перенаправление стандартного и выходного файла ошибки, добавляемого к одному и тому же лог-файлу
  • Как получить емкость диска и свободное место удаленного компьютера
  • Подсчитайте элементы в папке с помощью PowerShell
  • Использование Invoke-Command -ScriptBlock для функции с аргументами
  • Interesting Posts

    Как правильно получить доступ к Google через IPV6?

    Есть ли средство командной строки Windows для копирования файлов на удаленные компьютеры?

    Как сгенерировать сертификат аннулирования после создания отзыва с помощью GnuPG

    Разница между строкой и текстом в рельсах?

    Понимание JSF как структуры MVC

    Разница между getDefaultSharedPreferences и getSharedPreferences

    Регулярное выражение для слова «или» нескольких слов в grep

    Проверьте, заблокирован ли файл в Java

    Каков канонический способ проверки ошибок с использованием API-интерфейса CUDA?

    Включить ReadyBoost на второй внутренний жесткий диск?

    Реализация быстрого преобразования Фурье (FFT) в C #

    В чем причина «нестатического метода нельзя ссылаться из статического контекста»?

    Android: разница между невидимой и ушла?

    Возможно ли программно добавить папки на панель быстрого доступа Windows 10 в окне проводника?

    Как читать значения AppSettings из Config.json в ASP.NET Core

    Давайте будем гением компьютера.