Cum se obține o parolă de la pscredential, vr-online este un e-zine gratuit pentru toți

Ș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:

Cum se obține o parolă de la pscredential, vr-online este un e-zine gratuit pentru toți

Cum se obține o parolă de la pscredential, vr-online este un e-zine gratuit pentru toți

$ name = Read-Host -Prompt "Utilizator"
$ pass = Read-Host -Prompt "Parola" -AsSecureString

$ cred = New-Object -TypeName System.Management.Automation.PSCredential `
-ArgumentList $ name, $ pass

Cum se obține o parolă de la pscredential, vr-online este un e-zine gratuit pentru toți

Cum se obține o parolă de la pscredential, vr-online este un e-zine gratuit pentru toți

$ 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

Cum se obține o parolă de la pscredential, vr-online este un e-zine gratuit pentru toți

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.

Cum se obține o parolă de la pscredential, vr-online este un e-zine gratuit pentru toți

Citiți conținutul fișierului CSV.

$ csvPath = "$ env: USERPROFILE / cred.csv"
dacă (Test-Cale $ csvPath) Import-Csv -Path $ csvPath | Foreach-obiect
>

Cum se obține o parolă de la pscredential, vr-online este un e-zine gratuit pentru toți

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 ()>
>

Cum se obține o parolă de la pscredential, vr-online este un e-zine gratuit pentru toți

Ciudat, iar metoda ToString () este.

Cum se obține o parolă de la pscredential, vr-online este un e-zine gratuit pentru toți

Ș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 ()
>

Cum se obține o parolă de la pscredential, vr-online este un e-zine gratuit pentru toți

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.

Cum se obține o parolă de la pscredential, vr-online este un e-zine gratuit pentru toți

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.

Cum se obține o parolă de la pscredential, vr-online este un e-zine gratuit pentru toți

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ă.

Cum se obține o parolă de la pscredential, vr-online este un e-zine gratuit pentru toți

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.







Articole similare

Trimiteți-le prietenilor: