检索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值后如何清理

您是对的——在托管代码中使用SecureString的内容是非常愚蠢的。然而,对于P/Invoke API(如Windows Credential API),它只是为了让您的密码免受窥探。

另一种可能性是调用Marshal.SecureStringToBSTR()并在非托管代码中进行所有处理,您仍然可以维护一些表面上的安全性。