来自COM DLL的C#SecureString用法

时间:2014-08-20 06:04:05

标签: c# com

我正在尝试修复一些Fortify错误。 我的code()中的一个类将密码存储在一个字符串中。

 public class Foo: IDisposable
 {
 public string Password
  {
     get;
     set;
  }
 }

Fortify建议我将字符串更改为SecureString。 这解决了Fortify问题但在此之后我无法使用它创建COM对象。

1 个答案:

答案 0 :(得分:0)

我会像这样定义类:

[ComVisible(true)]
public class TestSecureString : IUnsecurePassword
{
    public SecureString Password
    {
        get;
        set;
    }

    string IUnsecurePassword.Password
    {
        get
        {
            if (Password == null)
                return null;

            IntPtr ptr = Marshal.SecureStringToBSTR(Password);
            string bstr = Marshal.PtrToStringBSTR(ptr);
            Marshal.ZeroFreeBSTR(ptr);
            return bstr;
        }
        set
        {
            if (value == null)
            {
                Password = null;
                return;
            }

            Password = new SecureString();
            foreach (char c in value)
            {
                Password.AppendChar(c);
            }
        }
    }
}

[ComVisible(true)]
public interface IUnsecurePassword
{
    string Password { get; set; }
}

然后在C ++中,IUnsecurePassword接口将像这样导出:

  virtual HRESULT __stdcall get_Password (/*[out,retval]*/ BSTR * pRetVal ) = 0;
  virtual HRESULT __stdcall put_Password (/*[in]*/ BSTR pRetVal ) = 0;

如果他真的想要,它不会阻止某人使用IUnsecurePassword界面,但它会提高标准。