206

コンテンツのMD5チェックサムを計算したいと思います。PowerShell でこれを行うにはどうすればよいですか?

4

19 に答える 19

375

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)))
于 2012-05-09T17:32:52.043 に答える
58

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

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


Algorithm: MD5


Path       :
HashString : E42B054623B3799CB71F0883900F2764
于 2012-05-09T22:58:36.043 に答える
20

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

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 に感謝します。

于 2013-07-23T13:30:49.417 に答える
19

以下に 2 行を示します。2 行目の「hello」を変更するだけです。

PS C:\> [Reflection.Assembly]::LoadWithPartialName("System.Web")
PS C:\> [System.Web.Security.FormsAuthentication]::HashPasswordForStoringInConfigFile("hello", "MD5")
于 2012-05-09T17:39:42.640 に答える
10

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
于 2012-12-18T05:25:22.393 に答える
6

このサイトには例があります: 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()
于 2012-05-09T17:26:54.433 に答える
2

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

[HKEY_CLASSES_ROOT\*\shell\SHA1 PS check\command]
@="C:\\Windows\\system32\\WindowsPowerShell\\v1.0\\powershell.exe -NoExit -Command Get-FileHash -Algorithm SHA1 '%1'"
于 2016-10-12T11:16:47.407 に答える
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()
}
于 2014-12-16T05:14:40.577 に答える
0
(
    [System.Security.Cryptography.MD5CryptoServiceProvider]::new().ComputeHash(
        [System.Text.UTF8Encoding]::new().GetBytes($yourText)
    ) `
    | %{ [Convert]::ToString($_, 16) }
) -join ''

$yourText = 'hello'収量5d41402abc4b2a76b9719d911017c592

于 2021-11-09T00:19:06.773 に答える
0

これは、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
于 2018-04-10T14:20:00.280 に答える