3

我正在一个项目中实现 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(...)在内存中吗?

我只是错过了一些非常基本的东西吗?谢谢。

4

1 回答 1

1

你是对的——SecureString在托管代码中使用 a 的内容非常愚蠢。但是,对于诸如 Windows Credential API 之类的 P/Invoke API,它只是为了让您的密码远离窥探。

另一种可能性是在非托管代码中调用Marshal.SecureStringToBSTR()并执行所有处理,您仍然可以保持一些安全性。

于 2013-09-03T06:23:59.073 回答