web-dev-qa-db-ja.com

PowerShellでMD5チェックサムを取得する方法

内容の MD5 チェックサムを計算します。 PowerShellでこれを行うにはどうすればよいですか。

151
Luke101

内容が文字列の場合

$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 コマンドレットを使用すると、すぐに使用できるファイルに対して簡単に実行できます。

Get-FileHash <filepath> -Algorithm MD5

コメントで特定されているように最初の解決策が提供する問題を回避するので(ストリームを使用し、それを閉じ、そして大きなファイルをサポートする)、これは確かに望ましいです。

285
vcsjones

PowerShell Community Extensions を使用している場合は、これを簡単に実行できるGet-Hashコマンドレットがあります。

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


Algorithm: MD5


Path       :
HashString : E42B054623B3799CB71F0883900F2764
57
Keith Hill

これが2行です。2行目の "hello"を変更してください。

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

相対パスと絶対パスを処理する関数を次に示します。

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()を使用することを提案し、finallyブロックを使用することを提案するための@ jpmc26に、@ davorに感謝します。

14
David

ComputeHash()を使ったオンラインの例はたくさんあります。私のテストでは、ネットワーク接続を介して実行している場合、これは非常に遅いことがわかりました。下記のスニペットは私にとってはずっと速く動きますが、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
9
cmcginty

このサイトに例があります。 http://blog.brianhartsock.com/2008/12/13/using-powershell-for-md5-checksums/ 。 .NET Frameworkを使用して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()
6
neontapir

2003年までさかのぼってデフォルトでWindowsにインストールされてきたもう1つの組み込みコマンドはcertutilです。もちろん、これはpowershellからも呼び出すことができます。

CertUtil -hashfile file.foo MD5

(注意:最大の堅牢性を実現するためにMD5はすべて大文字にする必要があります)

5
danekan

この質問はほぼ3歳です、それ以来、ある人がコメントしたように、とても便利なGet-FileHash関数があります。

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

SHA3​​84をMD5と交換するだけです。

例はPowerShell 5.1の公式文書からのものです

私はこの答えがキースヒルの答えと選ばれた答えの版の冗長であると思います、しかしそれは公式文書を指していて、そしてそれはより良い例を持っています。ドキュメントにはもっと例があります。

3

MicrosoftからFCIVをダウンロードすると、これはワンライナーになります。

ここからMicrosoftのFile Checksum Integrity Verifierをダウンロードしました https://support.Microsoft.com/ja-jp/kb/84129

次のコマンドを実行してください。確認するファイルが10個ありました。

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

右クリックメニューオプションのサンプル:

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

私の解決策を争いに加えます。受け入れられた答えで述べられているようにGet-FileHashはファイルと一緒に使うのが簡単ですが、文字列と一緒に使うことは可能です:

$s = "asdf"
Get-FileHash -InputStream ([System.IO.MemoryStream]::New([System.Text.Encoding]::ASCII.GetBytes($s)))
1
wensveen

これにより、リモートコンピュータ上のファイルの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()
}
1
YetiSized

PowerShell v4を使用してダウンロードしたgpg4win v3.0.3のSHA256フィンガープリントを検証しようとするきれいな印刷例(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
0
Thomas

これは、ダウンロードしたばかりのファイルの適切なチェックサムを計算し、それを公開されている元の。

例えば、私は Apache Jmeterプロジェクトからのダウンロード の例を書きました。この場合あなたが持っています:

  1. ダウンロードしたバイナリファイル
  2. フォーマットの1つの文字列としてfile.md5に公開されているオリジナルのチェックサム。

3a84491f10fb7b147101cf3926c4a855 * Apache-jmeter-4.0.Zip

その後、このpowershellコマンドを使用して、ダウンロードしたファイルの整合性を確認できます。

PS C:\Distr> (Get-FileHash .\Apache-jmeter-4.0.Zip -Algorithm MD5).Hash -eq (Get-Content .\Apache-jmeter-4.0.Zip.md5 | Convert-String -Example "hash path=hash")

出力:

True

説明:

-eq演算子の最初のオペランドは、ファイルのチェックサムを計算した結果です。

(Get-FileHash .\Apache-jmeter-4.0.Zip -Algorithm MD5).Hash

2番目のオペランドは公開チェックサム値です。最初に1つの文字列であるfile.md5の内容を取得してから、文字列形式に基づいてハッシュ値ベースを抽出します。

Get-Content .\Apache-jmeter-4.0.Zip.md5 | Convert-String -Example "hash path=hash"

filefile.md5の両方がこれと同じフォルダになければなりませんコマンド作業。

0
Egor B Eremeev