检索SecureString值后如何清理?

时间:2013-09-02 23:50:20

标签: c# .net security securestring

我正在项目中实现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(...)在内存中返回的字符串?

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

1 个答案:

答案 0 :(得分:1)

你是对的 - 在托管代码中使用SecureString的内容非常愚蠢。但是,对于P / Invoke API,例如Windows Credential API,它只是让您的密码远离窥探的目的。

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