Cómo obtener una suma de comprobación MD5 en PowerShell
Me gustaría calcular una suma de comprobación MD5 de algún contenido. ¿Cómo hago esto en PowerShell?
A partir de PowerShell versión 4, esto es fácil de hacer para archivos listos para usar con el Get-FileHash
cmdlet:
Get-FileHash <filepath> -Algorithm MD5
Esto es ciertamente preferible ya que evita los problemas que ofrece la solución para PowerShell anterior como se identifica en los comentarios (usa una secuencia, la cierra y admite archivos grandes).
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)))
Para versiones anteriores de PowerShell
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)))
Si está utilizando las Extensiones de la comunidad de PowerShell, hay un comando Get-Hash que hará esto fácilmente:
C:\PS> "hello world" | Get-Hash -Algorithm MD5
Algorithm: MD5
Path :
HashString : E42B054623B3799CB71F0883900F2764
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 arriba por la sugerencia de usar Open() en lugar de ReadAllBytes() y a @jpmc26 por la sugerencia de usar un bloque finalmente.