Güvenli bir dizeyi düz metne dönüştürme


90

PowerShell'de çalışıyorum ve kullanıcı tarafından girilen parolayı başarıyla düz metne dönüştüren bir kodum var:

$SecurePassword = Read-Host -AsSecureString  "Enter password" | convertfrom-securestring | out-file C:\Users\tmarsh\Documents\securePassword.txt

Onu geri dönüştürmek için birkaç yol denedim, ancak hiçbiri düzgün çalışmıyor. Son zamanlarda aşağıdakileri denedim:

$PlainPassword = Get-Content C:\Users\tmarsh\Documents\securePassword.txt

#convert the SecureString object to plain text using PtrToString and SecureStringToBSTR
$BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($PlainPassword)
$PlainPassword = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)
[Runtime.InteropServices.Marshal]::ZeroFreeBSTR($BSTR) #this is an important step to keep things secure

Bu da bana bir hata veriyor.

Cannot convert argument "s", with value: "01000000d08c9ddf0115d1118c7a00c04fc297eb0100000026a5b6067d53fd43801a9ef3f8ef9e43000000000200000000000366000
0c0000000100000008118fdea02bfb57d0dda41f9748a05f10000000004800000a000000010000000c50f5093f3b87fbf9ee57cbd17267e0a10000000833d1d712cef01497872a3457bc8
bc271400000038c731cb8c47219399e4265515e9569438d8e8ed", for "SecureStringToBSTR" to type "System.Security.SecureString": "Cannot convert the "01000000
d08c9ddf0115d1118c7a00c04fc297eb0100000026a5b6067d53fd43801a9ef3f8ef9e430000000002000000000003660000c0000000100000008118fdea02bfb57d0dda41f9748a05f10
000000004800000a000000010000000c50f5093f3b87fbf9ee57cbd17267e0a10000000833d1d712cef01497872a3457bc8bc271400000038c731cb8c47219399e4265515e9569438d8e8
ed" value of type "System.String" to type "System.Security.SecureString"."
At C:\Users\tmarsh\Documents\Scripts\Local Admin Script\PlainTextConverter1.ps1:14 char:1
+ $BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($PlainPassw ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodException
    + FullyQualifiedErrorId : MethodArgumentConversionInvalidCastArgument

Cannot find an overload for "PtrToStringAuto" and the argument count: "1".
At C:\Users\tmarsh\Documents\Scripts\Local Admin Script\PlainTextConverter1.ps1:15 char:1
+ $PlainPassword = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodException
    + FullyQualifiedErrorId : MethodCountCouldNotFindBest

Cannot convert argument "s", with value: "", for "ZeroFreeBSTR" to type "System.IntPtr": "Cannot convert null to type "System.IntPtr"."
At C:\Users\tmarsh\Documents\Scripts\Local Admin Script\PlainTextConverter1.ps1:16 char:1
+ [Runtime.InteropServices.Marshal]::ZeroFreeBSTR($BSTR) #this is an important ste ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodException
    + FullyQualifiedErrorId : MethodArgumentConversionInvalidCastArgument

Password is:  01000000d08c9ddf0115d1118c7a00c04fc297eb0100000026a5b6067d53fd43801a9ef3f8ef9e430000000002000000000003660000c0000000100000008118fdea02bfb57d0dda41f97
48a05f10000000004800000a000000010000000c50f5093f3b87fbf9ee57cbd17267e0a10000000833d1d712cef01497872a3457bc8bc271400000038c731cb8c47219399e4265515e9569
438d8e8ed

Bunun için işe yarayacak bir yol bilen var mı?

Yanıtlar:


117

Yakınsınız, ancak geçtiğiniz parametre SecureStringToBSTRbir SecureString. ConvertFrom-SecureStringŞifrelenmiş standart bir dize olan sonucunu iletiyorsunuz. O yüzden ConvertTo-SecureStringgeçmeden önce bunu arayın SecureStringToBSTR.

$SecurePassword = ConvertTo-SecureString $PlainPassword -AsPlainText -Force
$BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($SecurePassword)
$UnsecurePassword = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)

4
Çalıştığına sevindim. Dizinize dikkat edin, şimdi, bu, muhtemelen parola gibi önemli bir şey içeren güvenli olmayan bir dize değişkeni - artık işlem belleğinizde güvenli değil, vb.
MatthewG

19
Acording Marshal.SecureStringToBSTR belgelerine: Bu yöntem, bir dize için gerekli yönetilmeyen bellek ayırır Çünkü ZeroFreeBSTR yöntemini çağırarak bittiğinde, hep BSTR serbest . Yani, sonunda aşağıdaki yürütmek zorunda: [Runtime.InteropServices.Marshal]::ZeroFreeBSTR($BSTR).
Rosberg Linhares

@RosbergLinhares - Powershell'e (muhtemelen) odaklandığımıza göre, bunu yapamamanızın bir nedeni var $BSTR = $nullmı?
Orangutech

3
@Orangutech Değişkeni sadece olarak ayarlayamazsınız $null, çünkü burada yönetilmeyen nesnelerle uğraşıyoruz. Hemen bir hata almayacaksınız, ancak zaman geçtikçe sorun yaşayabileceğinizi düşünüyorum.
Rosberg Linhares

1
Eksik çağrıdan kaynaklanan bellek sızıntısının yanı sıra, ZeroFreeBSTR()belirtildiği gibi, kullanımı PtrToStringAuto()her zaman kavramsal olarak kusurluydu ve - şimdi PowerShell çapraz platform olduğundan - Unix benzeri platformlarda başarısız oluyor. Her zaman olmalıydı PtrToStringBSTR() - bu yanıta bakın .
mklement0

84

Ayrıca PSCredential.GetNetworkCredential () öğesini de kullanabilirsiniz:

$SecurePassword = Get-Content C:\Users\tmarsh\Documents\securePassword.txt | ConvertTo-SecureString
$UnsecurePassword = (New-Object PSCredential "user",$SecurePassword).GetNetworkCredential().Password

Her iki yöntemi de test ettim ve ikisi de hala doğru.
Maximilian Burszley

10
Bu çözüme daha fazla Powershelly olduğu için oy verildi.
Jim

1
System.Management.Automation.PSCredentialKısa tür adı tanınmadığında eski PS sürümlerinde kullanın .
marsze

1
Daha kısa:[PSCredential]::new(0, $SecurePassword).GetNetworkCredential().Password
majkinetor

Daha kısa:[System.Net.NetworkCredential]::new("", $SecurePassword).Password
K. Frank

37

PowerShell'de geri dönüştürmenin en kolay yolu

[System.Net.NetworkCredential]::new("", $SecurePassword).Password

1
Aslında, PSCredential'dan geçmeye gerek yok.
Nicolas Melay

Bu yaklaşımı beğendim. Bilginize, uyumluluk bağımlıları için bu yapıcı aşırı yüklemesi SecureString.Net Framework 4.0'da tanıtıldı. PowerShell v2'de denedim (New-Object -TypeName System.Net.NetworkCredential -ArgumentList "u",$SecureString).Passwordama ne yazık ki SecureStringsessizce bir String. Çağrı başarılı görünüyor, ancak bu durumda Passwordözellik "System.Security.SecureString" değişmez değeridir. Dikkatli ol.
John Rees

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.