Și salvați-l într-un fișier pentru o utilizare ulterioară. De ce este necesar? Cel puțin pentru a nu introduce parola de fiecare dată cu mâinile. Aș prefera un fișier CSV. Și este de dorit să criptați parola folosind un algoritm criptografic de încredere. Mai întâi, salvați numele de utilizator și parola în câmpurile corespunzătoare ale instanței obiectului PSCredential.
Luați în considerare câteva modalități de introducere a datelor:
- în caseta de dialog:
$ name = Read-Host -Prompt "Utilizator"
$ pass = Read-Host -Prompt "Parola" -AsSecureString
$ cred = New-Object -TypeName System.Management.Automation.PSCredential `
-ArgumentList $ name, $ pass
$ name = 'numele meu' # nume de utilizator
$ pass = ConvertTo-SecureString-String "mypass" -AsPlainText -Force # parola
$ cred = New-Object -TypeName System.Management.Automation.PSCredential `
-ArgumentList $ name, $ pass
Fiți atenți la ieșirea din consolă a proprietăților obiectului: numele de utilizator este numele meu, parola este System.Security.SecureString.
Se pare că parola noastră este protejată în siguranță.
Trimiteți datele într-un fișier CSV pentru stocare.
$ name = 'numele meu' # nume de utilizator
$ pass = ConvertTo-SecureString-String "mypass" -AsPlainText -Force # parola
$ cred = New-Object -TypeName System.Management.Automation.PSCredential `
-ArgumentList $ name, $ pass
Obiect nou-Obiect-TypeName PSObject -Property @<`
'UserName' = $ cred.UserName; `
'Parola' = (ConvertFrom-SecureString $ cred.Password) `
> | Export-Csv -Path "$ env: USERPROFILE / cred.csv" -Encodare UTF8 -NoTypeInformation -Append
Vom executa codul de câteva ori.
Citiți conținutul fișierului CSV.
$ csvPath = "$ env: USERPROFILE / cred.csv"
dacă (Test-Cale $ csvPath) Import-Csv -Path $ csvPath | Foreach-obiect
>
Se pare ca o herring - parola este criptata.
Transformați datele de la CSV fișier într-un obiect PSCredential cazuri, de ce a crea obiecte folosind un constructor, și să încerce să transforme proprietatea parolei fiecare obiect într-un șir de caractere.
$ csvPath = "$ env: USERPROFILE / cred.csv"
dacă (Test-Cale $ csvPath) Import-Csv -Path $ csvPath | ForEach-Object New-Object -TypeName System.Management.Automation.PSCredential `
-ArgumentList $ _. Nume utilizator, (ConvertTo-SecureString $ _. Password) `
) .Password.ToString ()>
>
Ciudat, iar metoda ToString () este.
Și acum atenție, priviți-vă mâinile.
$ csvPath = "$ env: USERPROFILE / cred.csv"
dacă (Test-Cale $ csvPath) Import-Csv -Path $ csvPath | ForEach-Object New-Object -TypeName System.Management.Automation.PSCredential `
-ArgumentList $ _. Nume utilizator, (ConvertTo-SecureString $ _. Password) `
). Parola> GetNetworkCredential ()
>
Concluzie - parola din această formă nu este sigură pentru stocare.
"Ce ar trebui să fac?", Mă întrebați.
Să acordăm atenție sistemului [System.Security.SecureString] la șirul criptat [System.String] - ConvertFrom-SecureString.
Am folosit-o în procesul de pregătire a unei parole pentru export într-un fișier CSV.
'Parola' = (ConvertFrom-SecureString $ cred.Password)
Cmdlet oferă câteva opțiuni pentru criptare: Key și SecureKey.
Vă sugerăm să utilizați ca cheie o serie de octeți, constând din 16, 24 sau 32 (implicit) elemente - 128, 192 sau 256-biți respectiv.
Amintiți-vă toate elementele matricei - supărătoare.
Simplificați: vom scrie o funcție care va primi 4 cifre (ca un cod PIN - puteți să-l amintiți cel puțin) și să returnați o matrice de octeți de o anumită lungime.
funcția Get-Key [CmdletBinding ()]
param (
[Parametru (Obligatoriu = $ Adevărat, Poziție = 0, HelpMessage = "Patru caractere ale codului PIN")]
[byte []] $ pin,
[Parametru (Poziție = 1, HelpMessage = "Lungimea cheii este de 16, 24 sau 32 octeți")]
[int] $ len = 32
)
Scrie-verbose $ pin.Length
dacă ($ pin.Length -ne 4) Write-Error "Numărul de caractere din codul PIN trebuie să fie de 4"
>
Scrieți ("$ len -ne 16)" și ($ len -ne 24) și ($ len -ne 32)) Write-Error "Lungimea cheii trebuie să fie 16, 24 sau 32 octeți"
>
$ len = $ len / 4
[octet []] $ cheie = @ ()
($ j = 0; $ i -lt $ len; $ i ++) pentru ($ j = 0; $ j -lt $ pin.Length; $ j ++) $ cheie + = $ pin [$ j]
>
>
Scriere-ieșire $ cheie
>
(Get-Key 1,2,3,8-Verbose) -join ""
Simplu algoritmul sa dovedit, puteți (chiar trebuie să) construi propriul dvs. - cât de mult imaginația permite.
Testăm funcția.
Scriem un script nou: înainte de a exporta datele într-un fișier CSV, criptează parola cu algoritmul AES, apoi după câteva secunde încercăm să o citim.
funcția Get-Key [CmdletBinding ()]
param (
[Parametru (Obligatoriu = $ Adevărat, Poziție = 0, HelpMessage = "Patru caractere ale codului PIN")]
[byte []] $ pin,
[Parametru (Poziție = 1, HelpMessage = "Lungimea cheii este de 16, 24 sau 32 octeți")]
[int] $ len = 32
)
dacă ($ pin.Length -ne 4) Write-Error "Numărul de caractere din codul PIN trebuie să fie de 4"
>
Scrieți ("$ len -ne 16)" și ($ len -ne 24) și ($ len -ne 32)) Write-Error "Lungimea cheii trebuie să fie 16, 24 sau 32 octeți"
>
$ len = $ len / 4
[octet []] $ cheie = @ ()
($ j = 0; $ i -lt $ len; $ i ++) pentru ($ j = 0; $ j -lt $ pin.Length; $ j ++) $ cheie + = $ pin [$ j]
>
>
Scriere-ieșire $ cheie
>
$ key = Get-Key 1,2,3,8
$ name = 'numele meu' # nume de utilizator
$ pass = ConvertTo-SecureString-String "mypass" -AsPlainText -Force # parola
$ cred = New-Object -TypeName System.Management.Automation.PSCredential `
-ArgumentList $ name, $ pass
Obiect nou-Obiect-TypeName PSObject -Property @<`
'UserName' = $ cred.UserName; `
'Password' = (ConvertFrom-SecureString -SecureString $ cred.Password -Key $ cheie) `
> | Export-Csv -Path "$ csvPath" -Encodare UTF8 -NoTypeInformation -Append
Start-Sleep -Seconds 2
dacă (Test-Cale $ csvPath) Import-Csv -Path $ csvPath | ForEach-Object New-Object -TypeName System.Management.Automation.PSCredential `
-ArgumentList $ _. Nume utilizator, (ConvertTo-SecureString $ _. Password -Key $ key) `
). Parola> GetNetworkCredential ()
>
Pare bine.
Să ne schimbăm codul PIN și să executăm din nou scriptul.
Evident: parola, criptată pentru prima dată (cu altă cheie), nu am putut obține.
Vom reveni la valoarea inițială a "codului PIN" și pentru a ne asigura că totul funcționează conform destinației, vom executa scenariul a treia oară.
Rezultatul - prima și a treia parolă, în al doilea rând - o eroare, după cum este necesar.
Pentru asta îți spun rămas bun. Toată lumea.
P.S. În opinia mea, soluția de aproape orice problemă, inclusiv hacking algoritmul criptografic, este o chestiune de timp și de buget.