Cómo obtener una sum de comprobación MD5 en PowerShell

Me gustaría calcular una sum de comprobación MD5 de algún contenido. ¿Cómo hago esto en PowerShell?

Si el contenido es una cadena:

$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))) 

Si el contenido es un archivo:

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

Comenzando en PowerShell versión 4, esto es fácil de hacer para los archivos Get-FileHash cmdlet Get-FileHash :

 Get-FileHash  -Algorithm MD5 

Esto es ciertamente preferible ya que evita los problemas que ofrece la primera solución como se identifica en los comentarios (usa una secuencia, la cierra y admite archivos de gran tamaño).

Si está utilizando las extensiones de comunidad de PowerShell, hay un comando Get-Hash que lo hará fácilmente:

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

Aquí están las dos líneas, simplemente cambie “hola” en la línea # 2:

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

Aquí hay una función que uso que maneja rutas relativas y absolutas:

 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() } } 

Gracias a @davor anterior para la sugerencia de utilizar Open () en lugar de ReadAllBytes () y a @ jpmc26 para la sugerencia de utilizar un bloque finally.

Hay muchos ejemplos en línea usando ComputeHash (). Mi prueba mostró que esto era muy lento cuando se ejecutaba a través de una conexión de red. El siguiente fragmento se ejecuta mucho más rápido para mí, sin embargo, 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 

Este sitio tiene un ejemplo: http://blog.brianhartsock.com/2008/12/13/using-powershell-for-md5-checksums/ . Utiliza el framework .NET para instanciar una instancia del algoritmo hash MD5 para calcular el hash.

Aquí está el código del artículo, que incorpora el comentario de Stephen:

 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() 

Otro comando integrado que se ha instalado desde hace mucho tiempo en Windows, que se remonta por defecto a 2003, es certutil, que también puede invocarse desde powershell.

CertUtil -hashfile file.foo MD5

(advertencia: MD5 debe estar en mayúsculas para máxima robustez)

Esto se convierte en un trazador de líneas si descarga FCIV de Microsoft.

Descargó el Verificador de integridad de sum de comprobación de archivos de Microsoft desde aquí https://support.microsoft.com/en-us/kb/841290

Ejecute el siguiente comando. Tenía diez archivos para verificar.

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

Esta pregunta tiene casi 3 años, desde entonces, como algunos comentaron, hay una función Get-FileHash que es muy útil.

 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 

Simplemente cambie SHA384 por MD5.

El ejemplo es de la documentación oficial de PowerShell 5.1 .

Supongo que esta respuesta es redundante de la respuesta de Keith-hill y la edición de la respuesta elegida, pero apunta a la documentación oficial y tiene un mejor ejemplo. La documentación tiene más ejemplos.

Esto devolverá un hash MD5 para un archivo en una computadora remota:

 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() } 

Ejemplo de opción de menú con el botón derecho también:

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

Bonito ejemplo de impresión que intenta verificar la huella digital SHA256 gpg4win descargado v3.0.3 usando powershell v4 (requiere Get-FileHash )

Descargue el paquete desde https://www.gpg4win.org/download.html , abra powershell, tome el hash de la página de descargas y ejecute:

 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 ) ) } 

Salida:

 Hash matches for file gpg4win-3.0.3.exe