Calculer un hash MD5 avec Powershell
Bonjour,
Qui ne s’est pas retrouvé avec des fichiers corrompus, après les avoir téléchargé où je ne sais. Il m’est arrivé pour le boulot de devoir vérifier l’intégrité de certains fichiers sur ‘un OS Windows. Je me suis donc mis en quête d’une solution toute faite intégrée dans Powershell (ce qui n’existe pas), du moins pas en natif, car il existe ça mais si l’on ne souhaite pas installer des “librairies” il va nous falloir utiliser des classes .NET.
Après une petite recherche sur MSDN ici pour la création de l’algorythme
[powershell]$algo = [System.Security.Cryptography.HashAlgorithm]::Create(“MD5”)[/powershell]
Si je regarde les méthodes disponibles pour le nouvel objet $algo que je créé, je remarque ComputeHash
PS C:PS> $algo | gm TypeName: System.Security.Cryptography.MD5CryptoServiceProvider Name MemberType Definition ---- ---------- ---------- Clear Method System.Void Clear() ComputeHash Method byte[] ComputeHash(System.IO.Stream inputStream), byte[] ComputeHash(byte[] buffer), byte[] ComputeHash(byte[] buffer, int offset,...
Il va donc nous falloir lire le fichier dont nous voulons le hash MD5, pour se faire nous allons créer un objet qui contiendra les bytes du fichier.
$stream = New-Object System.IO.FileStream(C:test.exe, [System.IO.FileMode]::Open)
La classe StringBuilder va nous permettre de créer un objet qui va retourner une chaîne de caractères
$md5StringBuilder = New-Object System.Text.StringBuilder
PS C:PS> $md5StringBuilder | gm TypeName: System.Text.StringBuilder Name MemberType Definition ---- ---------- ---------- Append Method System.Text.StringBuilder Append(char value, int repeatCount), System.Text.StringBuilder Append(char[] value, int startIndex, int c...
La méthode Append va nous permettre de passer chaque valeur retourner par le ComputeHash au format String.
$algo.ComputeHash($stream) | % { [void] $md5StringBuilder.Append($_.ToString("x2")) }
Il ne reste plus qu’à convertir le contenu de $md5StringBuilder au bon format et de rendre le fichier disponible.
$MD5Hash = $md5StringBuilder.ToString() $stream.Dispose()
Une fois tout mis bout à bout, la fonction crée donne ceci:
function Get-MD5 { # Cette fonction va permettre de calculer le hash md5 d'un fichier qu'on lui passe en argument. # La variable $file doit être de type String param( [Parameter(Position=0,Mandatory=$true,ValueFromPipeline=$true)] [ValidateNotNull()] [string]$file) $algo = [System.Security.Cryptography.HashAlgorithm]::Create("MD5") $stream = New-Object System.IO.FileStream($file, [System.IO.FileMode]::Open) $md5StringBuilder = New-Object System.Text.StringBuilder $algo.ComputeHash($stream) | % { [void] $md5StringBuilder.Append($_.ToString("x2")) } $MD5Hash = $md5StringBuilder.ToString() $stream.Dispose() return $MD5Hash }
Vous pourrez l’utiliser comme bon vous semble
$file = "C:TempremoveIIS6.txt" $file | Get-MD5
Ou bien
$hash = Get-MD5 -file "C:TempremoveIIS6.txt"
Voilà, en espérant que cela puisse vous servir un jour 🙂