1 Verschlüsselung von Strings

Beispiel 1: Ver- und Entschlüsseln eines Strings

Set-StrictMode -Version "2.0"
Clear-Host

$String = "Hallo Karl Napf"
$Key = (3,4,7,3,77,2,12,1,2,3,22,4,166,1,32,2)

#---- SecureString aus Klartext erzeugen ------------------

#Moeglichkeit 1 einen Securestring zu ertellen
#$SecureString = New-Object Security.SecureString
#$String.ToCharArray() | % { $secureString.AppendChar($_) }

#Moeglichkeit 2 einen Securestring zu ertellen
$SecureString = ConvertTo-SecureString $String -AsPlainText -Force

#Moeglichekeit 3 einen Securestring zu ertellen
#$SecureString = Read-Host -prompt "String eingeben:" -AsSecureString

#---- verschlüsselten StandardString aus SecureString erzeugen -------------------
$EncryptedStandardString = ConvertFrom-SecureString -securestring $SecureString -key $Key
Write-Host "Hash des eingegeben Passworts: $EncryptedStandardString"

#-----SecureString aus verschlüsseltem StandardString erzeugen------------------
$SecureString = ConvertTo-SecureString -string $EncryptedStandardString -key $Key

#-----Klartext aus SecureString erzeugen------------------
$CleartextString  =  [Runtime.Interopservices.Marshal]::PtrToStringAuto([Runtime.Interopservices.Marshal]::SecureStringToBStr($SecureString))
Write-Host "Entschlüsselter Hash: $CleartextString"
#Ausgabe

Hash des eingegeben Passworts: 76492d1116743f0423413b16050a5345MgB8AEoAVQBjAFIAVgBCAHEAUgBQAEcAbQByADIAZQA4AGsATAA...
Entschlüsselter Hash: Hallo Karl Napf

die cmdlets ConvertTo-SecureString und ConvertFrom-SecureString verwenden drei Sorten (zwei Klassen) von Strings:

  • System.Object.String: "Hallo Karl Napf"
  • System.Security.SecureString: $SecureString
  • System.Object.String: $EncryptedStandardString

der zur Verschlüsselung verwendete Key $key besteht in diesem Skript aus 128 Bits (16 Bytes). Weitere gültige Werte sind 192 Bits (24 Bytes) und 256 Bits (32 Bytes)

Den Hintergrund zur Verwendung des Securestrings erklärt Lee Holmes hier: Lee Holmes: HowTo: Use ConvertTo-SecureString and ConvertFrom-SecureString
Möchte man einen String beispielsweise für eine Passworteingabe nutzen, so weigern sich aus Securitygründen die Powershell und .Net einen String zu benutzen, der unverschlüsselt im Memory des RAMs liegt. Daher muß der String zuerst in einen SecureString der Klasse System.Security.SecureString kopiert werden, was mit der Powershell einfach über das cmdlet ConvertTo-SecureString geschieht.

oder MSDN: SecureString-Klasse
"Stellt Text dar, der vertraulich behandelt werden soll. Aus Datenschutzgründen wird der Text bei Verwendung verschlüsselt und, wenn er nicht mehr benötigt wird, aus dem Computerspeicher gelöscht. Diese Klasse kann nicht vererbt werden."