2012-05-09 4 views

Antwort

239

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:

$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 ve rsion 4, das ist einfach für Dateien aus der Box mit dem Get-FileHash Cmdlets zu tun:

Get-FileHash <filepath> -Algorithm MD5 

Dies ist sicherlich vorzuziehen, da es die Probleme, die erste Lösung vermeidet, wie in den Kommentaren (verwendet einen Stream identifiziert bietet, schließt es und unterstützt große Dateien).

+9

'Exception ruft" ReadAllBytes "mit" 1 "Argument (en) auf:" Die Datei ist zu lang. Diese Operation ist zur Zeit auf die Unterstützung von Dateien mit weniger als 2 Gigabyte begrenzt. "'Als Linux-Neuling bei Powershell,' Ich bin sehr verärgert über die Kämpfe, die ich habe, um eine MD5-Summe zu bekommen, die unter Linux einfach 'md5sum file.ext' wäre. – StockB

+0

@StockB Keiths Antwort wird wahrscheinlich besser damit umgehen. Ich stimme zu, es gibt einige Mängel mit Powershell. – vcsjones

+4

Ich habe Vanille PowerShell installiert, ohne Erweiterungen, also habe ich einen Befehlszeilen-md5sum-Klon statt dessen heruntergeladen und heruntergeladen, was gut funktioniert. Ich möchte Microsofts Sachen mögen, aber ich kann es einfach nicht. – StockB

6

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-Hashalgorithmus zur Berechnung des Hash zu instanziieren.

Hier ist der Code aus dem Artikel, Stephen 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() 
+1

Gut, außer es funktioniert nicht für Readonly-Dateien! Es benötigt $ stream = New-Objekt System.IO.FileStream ($ Pfad, [System.IO.FileMode] :: Öffnen, [System.IO.FileAccess] :: Lesen) –

+1

Wenn der Link jemals stirbt, wird die Antwort ganz nutzlos sein. http://StackOverflow.com/Help/how-to-answer –

+1

Als Reaktion auf was ich vermutet war Ihr Downvote, habe ich den Code aus dem Artikel hier ausgeschnitten und eingefügt. Das habe ich letztes Jahr nicht gemacht, weil ich das als Plagiat empfand. Durch Stephen's Read-Only-Anpassung hatte ich das Gefühl, dass es sich lohnt, etwas zu veröffentlichen. – neontapir

14

Hier sind die beiden Linien, gerade ändern "Hallo" in Zeile # 2:

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

Das Ergebnis entspricht nicht der Ausgabe, die ich mit der akzeptierten Antwort erhalte.Es berechnet den Hash der STRING "Hallo", nicht von einer Datei, die durch einen Pfad definiert wäre, die ich "Hallo" durch ersetzen, richtig? – RobertG

49

Wenn Sie die PowerShell Community Extensions verwenden ein Get-Hash ist Commandlet, die dies leicht tun:

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


Algorithm: MD5 


Path  : 
HashString : E42B054623B3799CB71F0883900F2764 
+2

+1: Sehr nett! Ich wusste nichts davon. – vcsjones

+1

+1: Sa-weeeeeeet !! – D3vtr0n

+7

Get-Hash kommt von PowerShell Community Extensions. Wenn Sie das Paket nicht verwenden können oder wollen, haben Sie in der Vanilla PowerShell 4.0 ein Cmdlet 'Get-FileHash 'hinzugefügt. Vide [TechNet] (http://technet.microsoft.com/en-us/library/dn520872.aspx). –

9

Es gibt viele Beispiele online mit ComputeHash(). Meine Tests haben gezeigt, dass dies sehr langsam war, wenn Sie über eine Netzwerkverbindung laufen. Das Snippet unten läuft viel schneller für mich, aber 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 
+0

Ihre Methode überwindet die 2Gb-Grenze von ReadAllBytes von anderen Antworten, was genau das ist, was ich brauchte. – Jay

+0

Was macht der Backtick auf der Zeile 'write-progress'? Der Syntax Highlighter scheint es nicht zu mögen. – mwfearnley

+0

@mwfearnley Der Backtick aktiviert die Zeilenfortsetzung. https://blogs.technet.microsoft.com/heyscriptingguy/2015/06/19/powertip-line-continuation-in-powershell/ – cmcginty

14

Hier ist eine Funktion, die ich verwende, die Griffe relative und absolute Pfade:

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

Dank oben für den Vorschlag @davor öffnen zu verwenden () anstelle von ReadAllBytes() und nach @ jpmc26 für den Vorschlag, einen finally-Block zu verwenden.

+1

Dieser Ansatz ist IMHO besser als vcsjones und Keith, weil es die Eingabe von Dateien größer als nehmen kann 2GB und es benötigt keine Erweiterungen oder PowerShell 4.0. –

+1

Der 'Dispose'-Aufruf sollte in einem 'finally'-Block stehen. – jpmc26

1

Dies wird einen MD5-Hash für eine Datei auf einem Remote-Computer zurück:

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

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

Heruntergeladene Microsofts Datei Checksum Integrity Verifier von hier https://support.microsoft.com/en-us/kb/841290

Führen Sie den folgenden Befehl ein. Ich musste zehn Dateien überprüfen.

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

Beispiel für Rechtsklick-Menü-Option auch:

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

Diese Frage ist fast 3 Jahre alt, seitdem, wie es einige kommentierte ein wich Get-FileHash Funktion ist sehr praktisch, .

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.

The example is from the official documentation of PowerShell 5.1.

Ich denke, diese Antwort ist überflüssig von keith-Hill-Antwort und die Ausgabe der gewählten Antwort, aber es zeigt auf offizielle Dokumentation und es hat ein besseres Beispiel. Die Dokumentation enthält mehr Beispiele.