Érdemes szétnézni a System.Security.Cryptography névtérben is, mert titkosítással, kriptográfiával kapcsolatban sok hasznos osztály található itt. Példaként álljon itt egy függvény, amellyel szövegből tudunk MD5 hasht készíteni:
function ConvertTo-MD5Hash {
param([string] $string)
$md5 = new-object -TypeName Security.Cryptography.MD5CryptoServiceProvider
$utf8 = new-object -TypeName System.Text.UTF8Encoding
$result = -join ($md5.ComputeHash($utf8.GetBytes($string)) |
ForEach-Object {$_.ToString("x2")})
$result
}
A függvény meghívásakor az átadott szöveg MD5 hash-e lesz a kimenet hexa szöveg formában:
PS C:\> ConvertTo-MD5Hash -string kakukk
c3cf61e6cb43dd962ff56b3bb0e0c766
A függvény ebben a formában kis-nagybetű érzékeny, azaz a nagybetűs „Kakukk”-nak más lesz a hash-e:
PS C:\> ConvertTo-MD5Hash -string Kakukk
c67e5b32a59dfd78b5754d4f264d31b2
Az alábbi ConvertTo-Hash függvény általánosabb megoldást ad, itt a -HashAlgorithm dinamikus paraméterrel meg lehet adni, hogy milyen hashalgoritmust szeretnénk használni. Ebben a példában további osztályokat is használtam a System.Security.Cryptography névtérből:
function ConvertTo-Hash {
[cmdletbinding()]
param([string] $string)
DynamicParam{
$ParameterName = 'HashAlgorithm'
$RuntimeParameterDictionary = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary
$AttributeCollection = New-Object System.Collections.ObjectModel.Collection[System.Attribute]
$ParameterAttribute = New-Object System.Management.Automation.ParameterAttribute
$ParameterAttribute.Mandatory = $false
$ParameterAttribute.Position = 1
$AttributeCollection.Add($ParameterAttribute)
$arrSet = @([System.Security.Cryptography.HashAlgorithmName] |
Get-Member -Static -MemberType Properties |
Select-Object -ExpandProperty name)
$arrSet += "RIPEMD160"
$ValidateSetAttribute = New-Object System.Management.Automation.ValidateSetAttribute($arrSet)
$AttributeCollection.Add($ValidateSetAttribute)
$RuntimeParameter = New-Object System.Management.Automation.RuntimeDefinedParameter($ParameterName, [string], $AttributeCollection)
$RuntimeParameterDictionary.Add($ParameterName, $RuntimeParameter)
return $RuntimeParameterDictionary
}
end{
if(!$PSBoundParameters.ContainsKey('hashalgorithm')){
$hashalgorithm = "MD5"
}
else{
$hashalgorithm = $PSBoundParameters.hashalgorithm
}
if($hashalgorithm -eq "RIPEMD160"){
$hash = [System.Security.Cryptography.RIPEMD160Managed]::Create()
}
else{
$hash = [System.Security.Cryptography.HashAlgorithm]::Create($hashalgorithm)
}
$utf8 = new-object -TypeName System.Text.UTF8Encoding
$result = -join ($hash.ComputeHash($utf8.GetBytes($string)) |
ForEach-Object {$_.ToString("x2")})
return $result
}
}
A különböző algoritmusok más bitszélességgel működnek:
PS C:\> ConvertTo-Hash -string kakukk -HashAlgorithm MD5
c3cf61e6cb43dd962ff56b3bb0e0c766
PS C:\> ConvertTo-Hash -string kakukk -HashAlgorithm RIPEMD160
074b6ceedf2ecbcf5ec661fb676b5e975f03fd38
PS C:\> ConvertTo-Hash -string kakukk -HashAlgorithm SHA1
4fe22e987c8aea83fa17c6dc0a3c7f6e571fa7bb
PS C:\> ConvertTo-Hash -string kakukk -HashAlgorithm SHA256
66e8a5fcb78175f055a8e8060004db813b3893f7dc7855c7b82e2833ef713082
PS C:\> ConvertTo-Hash -string kakukk -HashAlgorithm SHA384
0cb52360e3e2df32532bd5b75e219799e4f749a20d7c2a473fd39f4938738acded1dc0f93bf6da05d7342cc5e05c386d
PS C:\> ConvertTo-Hash -string kakukk -HashAlgorithm SHA512
0bd00c7c3af82b3749c3dc61da4d143780bc4a521fe2bdd07f2955622ca276889775803d2d4a9d5ada2a9bce9e6357b4bb322ec7ee5197d1cc4895f5746bcd6d