将存储在文本文件中的SecureString转换回可读字符串

时间:2018-03-22 19:40:39

标签: .net string powershell security securestring

我无法将先前存储的SecureString转换回其原始字符串。我之所以这样做,是因为我相信最初输入密码时可能会出现拼写错误。

最初使用以下方法创建SecureString并将其存储在文本文件中:

$SecurePassword = Read-Host -Prompt "Enter password" -AsSecureString
$SecurePassword | ConvertFrom-SecureString > C:\TEMP\TEST_Secure.txt

对于我选择的应用程序(Veeam备份),我读取包含加密密码的文件并将其反馈给应用程序

$SecurePasswordPath = "C:\TEMP\TEST_Secure.txt"
$EncryptionKey = cat $SecurePasswordPath | ConvertTo-SecureString

Veeam备份脚本实际读取如下:

$EncryptionKey = Add-VBREncryptionKey -Password (cat $SecurePasswordPath | ConvertTo-SecureString)

我已尝试以下方法尝试恢复密钥:

$new1 = cat $SecurePasswordPath | ConvertTo-SecureString

$Ptr = [System.Runtime.InteropServices.Marshal]::SecureStringToCoTaskMemUnicode($new1)
$result = [System.Runtime.InteropServices.Marshal]::PtrToStringUni($Ptr)
[System.Runtime.InteropServices.Marshal]::ZeroFreeCoTaskMemUnicode($Ptr)

结果通常是一个空白字段。

我也尝试了更推荐的方法:

$new1 = cat $SecurePasswordPath | ConvertTo-SecureString
[System.Runtime.InteropServices.marshal]::PtrToStringAuto([System.Runtime.InteropServices.marshal]::SecureStringToBSTR($new1))

这些结果中的每一个都没有真正返回。

我担心的是,我在创建时没有遵循正确的语法,也无法恢复原始密钥,因此无法恢复备份。

绝望!任何帮助将不胜感激!!

1 个答案:

答案 0 :(得分:0)

以下是如何提示SecureString并将其作为加密标准字符串写入文本文件:

Read-Host "Enter password" -AsSecureString | 
  ConvertFrom-SecureString |
  Out-File "D:\Path\EncryptedStandardString.txt"

要反转此操作并获取SecureString对象:

$secureString = Get-Content "D:\Path\EncryptedStandardString.txt" |
  ConvertTo-SecureString

如果您想使用AES而不是DPAPI,则还需要向-Key-SecureKey cmdlet提供ConvertFrom-SecureStringConvertTo-SecureString参数。

如果要将SecureString解密为String对象,可以使用以下函数:

function ConvertTo-String {
  param(
    [Security.SecureString] $secureString
  )
  try {
    $bstr = [Runtime.InteropServices.Marshal]::SecureStringToBSTR($secureString)
    [Runtime.InteropServices.Marshal]::PtrToStringAuto($bstr)
  }
  finally {
    if ( $bstr -ne [IntPtr]::Zero ) {
      [Runtime.InteropServices.Marshal]::ZeroFreeBSTR($bstr)
    }
  }
}

警告:如果您使用此功能,则会绕过SecureString个对象提供的保护。