보안 문자열을 일반 텍스트로 변환


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

가까이 있지만 전달하는 매개 변수 SecureStringToBSTRSecureString. 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
나는 그것이 작동해서 기쁘다. 문자열에주의하십시오. 이제 암호와 같이 중요한 것을 포함하는 보안되지 않은 문자열 변수입니다. 더 이상 프로세스 메모리 등에서 안전하지 않습니다.
MatthewG

19
Marshal.SecureStringToBSTR 설명서 에 따르면 : 이 메서드는 문자열에 필요한 관리되지 않는 메모리를 할당하기 때문에 ZeroFreeBSTR 메서드를 호출하여 완료되면 항상 BSTR을 해제합니다 . 따라서 결국 다음을 실행해야합니다 [Runtime.InteropServices.Marshal]::ZeroFreeBSTR($BSTR)..
Rosberg Linhares

@RosbergLinhares-우리가 (아마도) powershell에 초점을 맞추고 있기 때문에 당신이 할 수없는 이유가 $BSTR = $null있습니까?
Orangutech

3
@Orangutech $null여기서는 관리되지 않는 개체를 다루기 때문에 변수를로 설정할 수 없습니다 . 즉시 오류가 발생하지는 않지만 시간이 지남에 따라 문제가 발생할 수 있다고 생각합니다.
Rosberg Linhares

1
ZeroFreeBSTR()언급했듯이에 대한 호출 누락으로 인한 메모리 누수를 제외하고 PtrToStringAuto()는 항상 개념적으로 결함이 있었으며 이제 PowerShell은 크로스 플랫폼이므로 Unix와 유사한 플랫폼에서 실패합니다. 항상 그랬어 야했습니다 PtrToStringBSTR() - 이 대답을보십시오 .
mklement0

81

PSCredential.GetNetworkCredential () 사용할 수도 있습니다.

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

두 가지 방법을 모두 테스트했으며 둘 다 여전히 정확합니다.
Maximilian Burszley 2017-06-20

10
Powershelly가 더 많기 때문에이 솔루션을 찬성했습니다.
Jim

1
System.Management.Automation.PSCredential짧은 유형 이름이 인식되지 않는 경우 이전 PS 버전에서 사용하십시오 .
marsze

1
[PSCredential]::new(0, $SecurePassword).GetNetworkCredential().Password
짧게

더 짧게 :[System.Net.NetworkCredential]::new("", $SecurePassword).Password
K. Frank

36

PowerShell에서 다시 변환하는 가장 쉬운 방법

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

1
실제로 PSCredential을 통과 할 필요가 없습니다.
Nicolas Melay

나는이 접근 방식을 좋아합니다. 참고로 호환성을 좋아하는 사람들을위한이 생성자 오버로드 SecureString는 .Net Framework 4.0에서 도입되었습니다. PowerShell v2에서 시도 (New-Object -TypeName System.Net.NetworkCredential -ArgumentList "u",$SecureString).Password했지만 불행히도 SecureString자동으로 String. 호출이 성공한 것처럼 보이지만 Password속성은 리터럴 값 "System.Security.SecureString"입니다. 조심해.
John Rees

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 에서이 구문을 사용하려고 시도했습니다.
Tony
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.