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 🙂