我正在一个项目中实现 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);
}
}
保护数据非常好,但最终它再次被设置为标准字符串的真正意义何在?
我知道您可以将密码存储在 a 中char[]
,然后在创建后将其归零SecureString
,但是在检索字符串时我应该怎么做?我没有看到将其检索为 a 的方法,char[]
并且不会只是调用.ToCharArray()
仍将返回的字符串留Marshal.PtrToStringUni(...)
在内存中吗?
我只是错过了一些非常基本的东西吗?谢谢。