एक सुरक्षित स्ट्रिंग को सादे पाठ में बदलें


87

मैं PowerShell में काम कर रहा हूं और मेरे पास कोड है जो एक उपयोगकर्ता द्वारा दर्ज किए गए पासवर्ड को सादे पाठ में सफलतापूर्वक परिवर्तित करता है:

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

मुझे इसे वापस बदलने के कई तरीके आजमाए गए हैं, लेकिन उनमें से कोई भी ठीक से काम नहीं करता है। हाल ही में, मैंने निम्नलिखित के साथ कोशिश की है:

$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

यह मुझे एक त्रुटि देता है।

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

क्या कोई ऐसे तरीके के बारे में जानता है जो इसके लिए काम करेगा?

जवाबों:


115

आप करीब हैं, लेकिन आपके द्वारा पास किया जाने वाला पैरामीटर SecureStringToBSTRहोना चाहिए SecureString। आप इसका परिणाम देखते हैं ConvertFrom-SecureString, जो एक एन्क्रिप्टेड मानक स्ट्रिंग है। इसलिए ConvertTo-SecureStringपास होने से पहले इस पर कॉल करें SecureStringToBSTR

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

4
मुझे खुशी है कि यह काम करता है। अपनी स्ट्रिंग से सावधान रहें, अब, यह एक असुरक्षित स्ट्रिंग वैरिएबल है जिसमें संभवतः पासवर्ड की तरह कुछ महत्वपूर्ण है - यह अब आपकी प्रक्रिया मेमोरी में सुरक्षित नहीं है, आदि
मैथ्यू

19
Marshal.SecureStringToBSTR प्रलेखन के लिए रिकॉर्डिंग : क्योंकि यह विधि एक स्ट्रिंग के लिए आवश्यक अप्रबंधित मेमोरी को आवंटित करती है, हमेशा ZSTR को मुक्त करें जब ZeroFreeBSTR विधि को कॉल करके समाप्त हो जाए । तो, आपको अंत में निम्नलिखित को निष्पादित करना होगा [Runtime.InteropServices.Marshal]::ZeroFreeBSTR($BSTR):।
रोसबर्ग लिन्हारेस

@RosbergLinhares - जब से हम (संभवत:) शक्तियां केंद्रित हैं, क्या कोई कारण है जो आप अभी नहीं कर सकते हैं $BSTR = $null?
ओरंगुतेच

3
@ ऑरेंज्यूट आप केवल चर को सेट नहीं कर सकते $null, क्योंकि यहां हम अप्रबंधित वस्तुओं के साथ काम कर रहे हैं। आपको तुरंत कोई त्रुटि नहीं मिलेगी, लेकिन मुझे लगता है कि समय बीतने के साथ आपको समस्या हो सकती है।
रोसबर्ग लिन्हारेस

1
याददाश्त रिसाव के अलावा, मिस कॉल के परिणामस्वरूप ZeroFreeBSTR(), जैसा कि कहा PtrToStringAuto()गया था , का उपयोग हमेशा वैचारिक रूप से त्रुटिपूर्ण था, और - अब जब PowerShell क्रॉस-प्लेटफ़ॉर्म है - यूनिक्स जैसे प्लेटफार्मों पर विफल रहता है। यह हमेशा होना चाहिए था PtrToStringBSTR() - यह उत्तर देखें ।
अप्रैल को mklement0

81

आप PSCredential.GetNetworkCredential () का भी उपयोग कर सकते हैं:

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

मैंने दोनों विधियों का परीक्षण किया है और वे दोनों अभी भी सही हैं।
मैक्सिमिलियन बर्सले

10
इस समाधान को अपग्रेड किया गया क्योंकि यह अधिक पॉवर्सली है।
जिम

1
System.Management.Automation.PSCredentialपुराने पीएस संस्करणों में उपयोग करें जब छोटे प्रकार के नाम को मान्यता नहीं दी जाती है।
1919

1
शॉर्टर:[PSCredential]::new(0, $SecurePassword).GetNetworkCredential().Password
मजकिनेटोर

शॉर्टर:[System.Net.NetworkCredential]::new("", $SecurePassword).Password
। फ्रैंक

36

इसे PowerShell में वापस बदलने का सबसे आसान तरीका है

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

1
वास्तव में, PSCredential के माध्यम से जाने की कोई जरूरत नहीं है।
निकोलस मेले

मुझे यह तरीका पसंद है। संगतता नशेड़ियों के लिए FYI करें, यह कंस्ट्रक्टर ओवरलोड लेना SecureString.Net फ्रेमवर्क 4.0 में पेश किया गया था। PowerShell v2 पर मैंने कोशिश की (New-Object -TypeName System.Net.NetworkCredential -ArgumentList "u",$SecureString).Passwordलेकिन दुर्भाग्य SecureStringसे चुपचाप a में परिवर्तित हो गया है String। कॉल सफल होता दिख रहा है, लेकिन Passwordसंपत्ति तब शाब्दिक मान "System.Security.SecureString" है। सावधान रहे।
जॉन रीस

17

PS 7 में, आप उपयोग कर सकते हैं ConvertFrom-SecureStringऔर -AsPlainText:

 $UnsecurePassword = ConvertFrom-SecureString -SecureString $SecurePassword -AsPlainText

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.security/ConvertFrom-SecureString?view=powershell-7#parameters

ConvertFrom-SecureString
           [-SecureString] <SecureString>
           [-AsPlainText]
           [<CommonParameters>]

3
यह मुझे पागल कर रहा था। मैं v5 में इस सिंटैक्स का उपयोग करने की कोशिश कर रहा था कोई फायदा नहीं हुआ।
टोनी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.