【发布时间】:2018-09-01 09:23:47
【问题描述】:
我在将以前存储的 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))
这些中的每一个都不会真正返回任何内容。
我担心我在创建时没有遵循正确的语法,将无法恢复原始密钥,因此无法恢复我的备份。
在这里绝望!任何帮助将不胜感激!
【问题讨论】:
-
SecureString 最初是在您尝试解密它的同一台计算机上加密的吗?
-
是的。同一台机器。
-
和同一个用户帐号?
-
最初可能使用了不同的用户帐户。我的问题是,我可以逐步完成上述步骤,但仍然无法产生所需的输出。因此,我可以在同一台机器、同一用户上重新创建一个新的 SecureString 文本文件,并运行这两种方法来尝试检索密码,但它仍然失败,结果相同。这就是为什么我质疑我是否正确设置它。
-
ConvertTo-SecureString仅适用于使用 DPAPI 的同一台计算机和同一用户帐户(即,没有-Key或-SecureKey参数)。
标签: .net string powershell security securestring