calcular - Cómo obtener una suma de comprobación MD5 en PowerShell
powershell md5 (12)
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")
Me gustaría calcular una suma de comprobación MD5 de algún contenido. ¿Cómo hago esto en PowerShell?
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.
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
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''"
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.
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()
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()
}
Esto se convierte en un trazador de líneas si descarga FCIV de Microsoft.
Descargó el Verificador de integridad de suma 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}
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
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)
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 <filepath> -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