检索SecureString值后如何清理
本文关键字:何清理 SecureString 检索 | 更新日期: 2023-09-27 18:29:54
我正在一个项目中实现SecureString。读完它,看到很多基本上做同样事情的例子后,我一直认为有些地方出了问题。
以以下代码为例:
public static string ToUnsecureString(this SecureString secureString)
{
if(secureString == null)
throw new ArgumentNullException("secureString");
IntPtr unmanagedString = IntPtr.Zero;
try
{
unmanagedString = Marshal.SecureStringToGlobalAllocUnicode(secureString);
return Marshal.PtrToStringUni(unmanagedString);
}
finally
{
Marshal.ZeroFreeGlobalAllocUnicode(unmanagedString);
}
}
保护数据是件好事,但当它最终再次被设置为标准字符串时,真正的意义是什么?
我知道你可以将密码存储在char[]
中,然后在创建SecureString
后将其清零,但在检索字符串时我该怎么办?我没有找到将其作为char[]
检索的方法,难道仅仅调用.ToCharArray()
就不会将Marshal.PtrToStringUni(...)
返回的字符串留在内存中吗?
我只是错过了一些非常基本的东西吗?谢谢
您是对的——在托管代码中使用SecureString
的内容是非常愚蠢的。然而,对于P/Invoke API(如Windows Credential API),它只是为了让您的密码免受窥探。
另一种可能性是调用Marshal.SecureStringToBSTR()
并在非托管代码中进行所有处理,您仍然可以维护一些表面上的安全性。