我无法将先前存储的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))
这些结果中的每一个都没有真正返回。
我担心的是,我在创建时没有遵循正确的语法,也无法恢复原始密钥,因此无法恢复备份。
绝望!任何帮助将不胜感激!!
答案 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-SecureString
或ConvertTo-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
个对象提供的保护。