除了之外,所有关于通过创建一个System.String来解除你的SecureString安全的保留意见,该怎么做呢?
如何将普通System.Security.SecureString转换为System.String?
我相信你们中许多熟悉SecureString的人都会回应说,永远不应该将SecureString转换为普通的.NET字符串,因为它会移除所有的安全保护。我认识。但是现在,我的程序使用普通字符串做所有的事情,我正在尝试增强它的安全性,尽管我将使用一个返回SecureString的API,但我并不打算用它来提高安全性。
我知道Marshal.SecureStringToBSTR,但我不知道如何利用它来创建一个System.String。
对于那些想知道我为什么要这样做的人来说,我从一个用户那里获取了一个密码,并将其作为html表单提交,以便将该用户登录到一个网站。所以..。这实际上必须使用托管的、未加密的缓冲区来完成。如果我甚至可以访问非托管的、未加密的缓冲区,我想我可以在网络流上进行逐字节流写入,并希望这样可以确保整个过程中密码的安全。我希望至少对其中一种情况有一个答案。
发布于 2009-05-04 11:21:15
使用System.Runtime.InteropServices.Marshal
类:
String SecureStringToString(SecureString value) {
IntPtr valuePtr = IntPtr.Zero;
try {
valuePtr = Marshal.SecureStringToGlobalAllocUnicode(value);
return Marshal.PtrToStringUni(valuePtr);
} finally {
Marshal.ZeroFreeGlobalAllocUnicode(valuePtr);
}
}
如果要避免创建托管字符串对象,可以使用Marshal.ReadInt16(IntPtr, Int32)
访问原始数据
void HandleSecureString(SecureString value) {
IntPtr valuePtr = IntPtr.Zero;
try {
valuePtr = Marshal.SecureStringToGlobalAllocUnicode(value);
for (int i=0; i < value.Length; i++) {
short unicodeChar = Marshal.ReadInt16(valuePtr, i*2);
// handle unicodeChar
}
} finally {
Marshal.ZeroFreeGlobalAllocUnicode(valuePtr);
}
}
发布于 2014-09-10 02:53:16
显然,您知道这与SecureString的全部目的背道而驰,但我还是要重申这一点。
如果你想要一行程序,试试这个:(仅限.NET 4和更高版本)
string password = new System.Net.NetworkCredential(string.Empty, securePassword).Password;
其中securePassword是一个SecureString。
发布于 2009-05-04 03:38:34
见鬼。在发布了这篇文章之后,我在this article中找到了答案。但是,如果有人知道如何访问此方法公开的非托管、未加密的IntPtr缓冲区,请一次访问一个字节,这样我就不必在其中创建托管字符串对象来保持高安全性,请添加答案。:)
static String SecureStringToString(SecureString value)
{
IntPtr bstr = Marshal.SecureStringToBSTR(value);
try
{
return Marshal.PtrToStringBSTR(bstr);
}
finally
{
Marshal.FreeBSTR(bstr);
}
}
https://stackoverflow.com/questions/818704
复制相似问题