it-swarm.com.de

So erhalten Sie eine MD5-Prüfsumme in PowerShell

Ich möchte eine MD5 Checksumme einiger Inhalte berechnen. Wie mache ich das in PowerShell?

145
Luke101

Wenn der Inhalt eine Zeichenfolge ist:

$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)))

Wenn der Inhalt eine Datei ist:

$someFilePath = "C:\foo.txt"
$md5 = New-Object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider
$hash = [System.BitConverter]::ToString($md5.ComputeHash([System.IO.File]::ReadAllBytes($someFilePath)))

Ab PowerShell Version 4 ist dies für Dateien mit dem Get-FileHash cmdlet einsatzbereit:

Get-FileHash <filepath> -Algorithm MD5

Dies ist sicherlich vorzuziehen, da dadurch die in den Kommentaren genannten Probleme der ersten Lösung vermieden werden (verwendet einen Stream, schließt ihn und unterstützt große Dateien).

279
vcsjones

Wenn Sie die PowerShell Community Extensions verwenden, gibt es ein Get-Hash-Kommando, das dies problemlos tun kann:

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


Algorithm: MD5


Path       :
HashString : E42B054623B3799CB71F0883900F2764
56
Keith Hill

Hier sind die zwei Zeilen, ändern Sie einfach "Hallo" in Zeile 2:

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

Ich verwende hier eine Funktion, die relative und absolute Pfade behandelt:

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

Vielen Dank an @davor für den Vorschlag, Open () anstelle von ReadAllBytes () zu verwenden, und an @ jpmc26 für den Vorschlag, einen finally-Block zu verwenden.

14
David

Es gibt viele Beispiele online, die ComputeHash () verwenden. Meine Tests haben gezeigt, dass dies sehr langsam war, wenn ich über eine Netzwerkverbindung laufe. Der Ausschnitt unten läuft für mich viel schneller, jedoch 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

Diese Site hat ein Beispiel: http://blog.brianhartsock.com/2008/12/13/using-powershell-for-md5-checksums/ . Es verwendet das .NET-Framework, um eine Instanz des MD5-Hash-Algorithmus zu instanziieren, um den Hash zu berechnen.

Hier ist der Code aus dem Artikel, der Stephens Kommentar enthält:

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

Ein weiterer integrierter Befehl, der seit langem standardmäßig in Windows installiert ist und aus dem Jahr 2003 stammt, ist certutil, das natürlich auch von Powershell aus aufgerufen werden kann.

CertUtil -hashfile file.foo MD5

(Achtung: MD5 sollte für maximale Robustheit in allen Kappen sein)

5
danekan

Diese Frage ist fast 3 Jahre alt, seitdem gibt es, wie einige kommentierten, eine Get-FileHash-Funktion, die sehr praktisch ist.

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

Ändern Sie einfach SHA384 mit MD5.

Das Beispiel stammt aus der offiziellen Dokumentation von PowerShell 5.1 .

Ich denke, diese Antwort ist überflüssig für die Antwort von Keith-Hill und die Ausgabe der gewählten Antwort, aber sie weist auf offizielle Dokumentation hin und hat ein besseres Beispiel. Die Dokumentation enthält weitere Beispiele.

3

Dies wird zu einem Einzeiler, wenn Sie FCIV von Microsoft herunterladen.

Microsoft hat den File Checksum Integrity Verifier von hier heruntergeladen https://support.Microsoft.com/en-us/kb/841290

Führen Sie den folgenden Befehl aus. Ich hatte zehn Akten zu prüfen.

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

Beispiel für Rechtsklick-Menüoption:

[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

Hinzufügen meiner Lösung zum Kampf. Wie in der akzeptierten Antwort angegeben, ist Get-FileHash einfach mit Dateien zu verwenden, aber es ist möglich, ihn mit Zeichenfolgen zu verwenden:

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

Dadurch wird ein MD5-Hash für eine Datei auf einem Remote-Computer zurückgegeben:

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

Ziemlich gedrucktes Beispiel beim Versuch, den SHA256-Fingerabdruck des heruntergeladenen gpg4win v3.0.3 mithilfe von Powershell v4 zu überprüfen (erfordert Get-FileHash)

Laden Sie das Paket von https://www.gpg4win.org/download.html herunter, öffnen Sie die Powershell, nehmen Sie den Hash von der Downloadseite und führen Sie Folgendes aus:

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

Ausgabe: 

Hash matches for file gpg4win-3.0.3.exe
0
Thomas

Hier ist ein einzeiliger Befehlsbeispiel, bei dem sowohl die korrekte Prüfsumme der Datei file, wie Sie sie gerade heruntergeladen haben, als auch die veröffentlichte Prüfsumme des Originals verglichen wird.

Zum Beispiel habe ich ein Beispiel für Downloads von Apache Jmeter Project geschrieben. In diesem Fall haben Sie:

  1. heruntergeladene binäre Datei
  2. prüfsumme des Originals, das in file.md5 als eine Zeichenfolge im Format veröffentlicht wird:

3a84491f10fb7b147101cf3926c4a855 * Apache-jmeter-4.0.Zip

Anschließend können Sie mit diesem Powershell-Befehl die Integrität der heruntergeladenen Datei überprüfen:

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")

Ausgabe:

True

Erläuterung:

Der erste Operand des -eq-Operators ergibt sich aus der Berechnung der Prüfsumme für die Datei:

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

Der zweite Operand ist der veröffentlichte Prüfsummenwert. Wir erhalten zuerst den Inhalt der Datei file.md5, die eine Zeichenfolge ist, und extrahieren dann die Hashwertbasis aus dem Zeichenfolgenformat:

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

Sowohl file als auch file.md5 müssen sich im selben Ordner befinden, damit dieser Befehl ausgeführt werden kann.

0
Egor B Eremeev