如何获取PowerShell中的MD5校验和

我想计算一些内容的MD5校验和。 我如何在PowerShell中执行此操作?

如果内容是一个string:

$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 cmdlet就可以轻松完成开箱即用的文件操作:

 Get-FileHash <filepath> -Algorithm MD5 

这当然是可取的,因为它避免了第一个解决scheme提供的问题(使用stream,closures它并支持大文件)。

如果您使用的是PowerShell社区扩展,则可以使用Get-Hash命令行程序轻松完成此操作:

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

这是我用来处理相对和绝对path的函数:

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

感谢上面的@davorbuild议使用Open()而不是ReadAllBytes()和@ jpmc26build议使用finally块。

这里是两行,只要在#2行中改变“hello”即可:

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

在线使用ComputeHash()有很多例子。 我的testing显示,通过networking连接运行时速度非常慢。 下面的代码片段对我来说要快得多,不过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哈希algorithm的实例来计算哈希。

以下是文章中的代码,并结合了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() 

如果您从Microsoft下载FCIV,这将成为一个单行的内容。

从此处下载了Microsoft的文件校验和完整性validation程序https://support.microsoft.com/zh-cn/kb/841290

运行以下命令。 我有十个文件来检查。

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

这将返回一个远程计算机上的文件的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'"