我在项目中实现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()并用非托管代码进行所有处理,您仍然可以保持某种安全性。

关于c# - 检索SecureString值后如何清理?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18582177/

10-13 07:39