Som sikkert de fleste av oss har jeg diverse (windows)skript og greier liggende i mer eller mindre offentlig tilgjengelige git-repoer og slikt, som av og til trenger å vite passord for å autentisere mot ymse tjenester. Dersom man kjører skriptene med en dedikert bruker kan man enkelt ivareta passordsikkerheten ved å foreksempel dumpe et PSCredential-object, men det er kanskje ikke det mest elegante. I mange tilfeller ønsker man å la jobbene kjøres av task scheduler som en av de innebygde kontoene i windows (network system el.l.), og da kan man ikke lenger bruke PSCredential, siden den inneholder passord som securestring, som igjen er kryptert med en eller annen bruker-spesifik nøkkel (tror jeg).
Enter RSA Key Containers.
Opprett først en RSA Key Container:
PS C:\Windows\Microsoft.NET\Framework\v4.0.30319> aspnet_regiis -pc "MyContainer" -exp
exporter public key
PS C:\Windows\Microsoft.NET\Framework\v4.0.30319> aspnet_regiis -px "MyContainer" mykey.xml
For å kryptere noe hemmelig med denne nøkkelen:
PS M:\> $key = [xml](get-content .\mykey.xml) PS M:\> $rsa = New-Object System.Security.Cryptography.RSACryptoServiceProvider PS M:\> $rsa.FromXmlString($key) PS M:\> $enc = [System.Text.Encoding]::UTF8 PS M:\> $txt = "fjodor riktig blasert sørensen" PS M:\> $rsa.Encrypt($enc.GetBytes($txt), $true) | Out-File garble.foo -Encoding ascii
garble.foo skulle nå være trygg å putte på github eller whatever.
for å dekryptere:
PS M:\> $csp = New-Object System.Security.Cryptography.CspParameters PS M:\> $csp.KeyContainerName = "MyContainer" PS M:\> $csp.Flags = [System.Security.Cryptography.CspProviderFlags]::UseMachineKeyStore -bor [System.Security.Cryptography.CspProviderFlags]::UseExistingKey PS M:\> $rsa = [System.Security.Cryptography.RSACryptoServiceProvider]::new($csp) PS M:\> $enc = [System.Text.Encoding]::UTF8 PS M:\> $enc.GetString($rsa.Decrypt((Get-Content .\garble.foo), $true)) fjodor riktig blasert sørensen
Kool, hæ?
Logg inn for å kommentere
Ikke UiO- eller Feide-bruker?
Opprett en WebID-bruker for å kommentere