You are currently viewing PowerShell – Checksummen von Dateien errechnen

PowerShell – Checksummen von Dateien errechnen

Wer kennt es nicht: Man lädt sich ein Programm aus dem Internet und möchte es installieren. Doch wie kann man sich sicher sein, dass nach dem Download die richtige Datei unbeschadet und ohne Datenmanipulation einer eventuellen „Man-in-the-middle-Attacke“ auf der eigenen Festplatte liegt?

 

Hat man sich schließlich dennoch durchgerungen die Datei auszuführen kann es passieren, dass der in Windows 8 standardmäßig eingebaute SmartScreen Filter anschlägt und einem förmlich ins Gesicht zu brüllen scheint „NICHT AUSFÜHREN! GEFAHR! HIER WILL DICH EINER ÜBER’S OHR HAUEN!“. Dieses Verhalten verunsichert verständlicherweise nur noch mehr und mahnt zur Vorsicht, was natürlich auch genau so gewollt und prinzipiell eine gute Sache ist.

Doch oft kennt man die Quelle bzw. den Softwarehersteller, von dessen Seite man das Executable heruntergeladen hat und weiß, dass man diesem eigentlich vertrauen kann. Dann kann es entweder sein, dass dieser die Datei gerade mit einem neuen Zertifikat bestückt hat, welches vom Microsoft SmartScreen Filter noch nicht als ausreichend vertrauenswürdig eingestuft wurde, oder aber die Datei nicht korrekt heruntergeladen wurde, bzw. vielleicht wirklich ein Angreifer die Datei manipuliert hat.

 

Um überprüfen zu können, ob man lokal nun das richtige File vor sich hat, geben viele Hersteller einen oder mehrere Hash-Werte (meist MD5 oder SHA1) auf ihrer Homepage für den Download mit an. Dieser Wert ist eindeutig, also quasi der Fingerabdruck der Datei und kann dann mit dem heruntergeladenen File verglichen werden. Unterscheiden sich die Werte kann man sich sicher sein, dass etwas nicht stimmt. (Oder aber der Hersteller hat aus versehen einen falschen Wert angegeben. Darauf würde ich es jedoch dann nicht ankommen lassen.)

 

Doch wie kann ich mir den Hashwert meines Downloads anzeigen lassen?

 

Zum errechnen eines Hash-Werts kann unter Windows z.B. die PowerShell herangezogen werden.

Ab PowerShell Version 4, die ab Windows 8 und Server 2012 standardmäßig installiert ist, gibt es hierfür auch gleich ein extra Commandlet namens „Get-FileHash“. Mit dem Parameter „-Algorithm“ kann dann noch der gewünschte Algorithmus gewählt werden. Zur Auswahl stehen hier unter Anderem auch MD5 und SHA1.

Möchte man also z.B. den MD5 Hash der inote.exe errechnet haben verwendet man folgenden Befehl:

				
					Get-FileHash -Path C:PfadzurDatei.exe -Algorithm MD5
				
			

Hinter dem Parameter „-Path“ muss der Pfad zur gewünschten Datei angegeben werden, sowie der gewünschte Algorithmus hinter dem Parameter „-Algorithm“. In diesem Beispiel wurde die inote.exe in Version 2.6.716 verwendet.

Mit folgender Zeile kann die errechnete Checksumme der Datei gleich mit dem Hash der Homepage verglichen werden. Erfolgt in der PowerShell kein Output sind die Hashes identisch. „Compare-Object“ arbeitet dabei standardmäßig caseinsensitive.

				
					Get-FileHash -Path C:executablesinote.exe -Algorithm MD5 | Compare-Object -ReferenceObject "2F9296722Cd04054566D98F97649B09E" -DifferenceObject {$_.Hash}
				
			

Ist hingegen ein Output wie auf dem nächsten Bild zu sehen stimmen die Werte nicht überein.

In PowerShell Version 3 und geringer ist das Commandlet „Get-FileHash“ noch nicht vorhanden. Somit muss man sich eines kleinen Umwegs bedienen, wenn man die Checksumme einer Datei mit der PowerShell errechnen möchte.


Hierfür habe ich in einem anderen Blog ein kleines Skript gefunden.


Ich habe es etwas angepasst und erweitert, sodass sich nun auch verschiedene Algorithmen damit verwenden lassen und ein mit angegebener Referenz-Hashwert sofort (caseinsensitive) verglichen wird.


Dank Parametern kann das Skript quasi wie ein Commandlet verwendet werden.

				
					param

(

[Parameter(Mandatory=$true)]

[String]

$Path,



[ValidateSet("MD5", "SHA1", "SHA256", "SHA512")]

$Algorithm = "MD5",



[Parameter(Mandatory=$true)]

[String]

$Hash

)



# Calculate hash of given file with given algorithm

$algo = [System.Security.Cryptography.HashAlgorithm]::Create("$Algorithm")

$stream = New-Object System.IO.FileStream($path, [System.IO.FileMode]::Open)

$StringBuilder = New-Object System.Text.StringBuilder

$algo.ComputeHash($stream) | % { [void] $StringBuilder.Append($_.ToString("x2")) }

$fileHash = $StringBuilder.ToString()

$stream.Dispose()



# Case insensitive comparison. If variable $compared is 0 the hashes are equal.

$compared = [string]::Compare($fileHash, $Hash, $True)



Write-Host ""

Write-Host Algorithm : $Algorithm

Write-Host File Hash : $fileHash

Write-Host Given Hash: $Hash

# Check if hashes are equal

if ($compared -eq "0"){

    Write-Host "The hashes are equal." -ForegroundColor Green}

else{

    Write-Warning "The hashes are NOT equal."}

Write-Host ""
				
			

Und so funktioniert das Skript:

 

Rufen Sie das Skript mit dem Parameter „-Path“ auf und geben Sie dort den Pfad zur gewünschten Datei an.

 

Verwenden Sie den Parameter „-Algorithm“ um zwischen MD5, SHA1, SHA256 und SHA512 zu wählen. Wird der Parameter nicht definiert wird automatisch die MD5 Checksumme errechnet.

 

Hinter dem Parameter „-Hash“ muss anschließend noch die Referenz-Checksumme angegeben werden, mit der der errechnete Hash verglichen werden soll.

 

Das Ergebnis sieht dann folgendermaßen aus:

 

Bei gleichen Checksummen…

oder bei unterschiedlichen Checksummen…