コンテンツのMD5チェックサムを計算したいと思います。PowerShell でこれを行うにはどうすればよいですか?
19 に答える
PowerShell バージョン 4 以降では、Get-FileHash
コマンドレットを使用して、すぐに使用できるファイルに対して簡単に実行できます。
Get-FileHash <filepath> -Algorithm 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)))
古い PowerShell バージョンの場合
コンテンツがファイルの場合:
$someFilePath = "C:\foo.txt"
$md5 = New-Object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider
$hash = [System.BitConverter]::ToString($md5.ComputeHash([System.IO.File]::ReadAllBytes($someFilePath)))
PowerShell Community Extensionsを使用している場合は、これを簡単に実行できる Get-Hash コマンドレットがあります。
C:\PS> "hello world" | Get-Hash -Algorithm MD5
Algorithm: MD5
Path :
HashString : E42B054623B3799CB71F0883900F2764
相対パスと絶対パスを処理するために使用する関数を次に示します。
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()
}
}
ReadAllBytes() の代わりに Open() を使用するよう提案してくれた上記の @davor と、finally ブロックを使用するよう提案してくれた @jpmc26 に感謝します。
以下に 2 行を示します。2 行目の「hello」を変更するだけです。
PS C:\> [Reflection.Assembly]::LoadWithPartialName("System.Web")
PS C:\> [System.Web.Security.FormsAuthentication]::HashPasswordForStoringInConfigFile("hello", "MD5")
ComputeHash() を使用したオンラインの例はたくさんあります。私のテストでは、ネットワーク接続を介して実行すると、これが非常に遅いことが示されました。以下のスニペットは私にとってははるかに高速に実行されますが、マイレージは異なる場合があります。
$md5 = [System.Security.Cryptography.MD5]::Create("MD5")
$fd = [System.IO.File]::OpenRead($file)
$buf = New-Object byte[] (1024*1024*8) # 8 MB 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 a hexadecimal formatted string
$hash | foreach { $hash_txt += $_.ToString("x2") }
Write-Host $hash_txt
このサイトには例があります: Using Powershell for MD5 Checksums。.NET フレームワークを使用して MD5 ハッシュ アルゴリズムのインスタンスをインスタンス化し、ハッシュを計算します。
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()
同様に右クリック メニュー オプションのサンプル:
[HKEY_CLASSES_ROOT\*\shell\SHA1 PS check\command]
@="C:\\Windows\\system32\\WindowsPowerShell\\v1.0\\powershell.exe -NoExit -Command Get-FileHash -Algorithm SHA1 '%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()
}
(
[System.Security.Cryptography.MD5CryptoServiceProvider]::new().ComputeHash(
[System.Text.UTF8Encoding]::new().GetBytes($yourText)
) `
| %{ [Convert]::ToString($_, 16) }
) -join ''
$yourText = 'hello'
収量5d41402abc4b2a76b9719d911017c592
これは、SHA256 フィンガープリントを検証しようとするかなり印刷された例です。PowerShell v4 (必須) を使用して gpg4win v3.0.3 をダウンロードしましGet-FileHash
た。
https://www.gpg4win.org/download.htmlからパッケージをダウンロードし、PowerShell を開き、ダウンロード ページからハッシュを取得して、次を実行します。
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