c# SecureString在COM DLL中的用法

本文关键字:用法 DLL COM SecureString | 更新日期: 2023-09-27 18:18:50

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

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

Fortify建议我将字符串更改为SecureString。这修复了加固问题,但在此之后,我无法使用此创建COM对象。

c# SecureString在COM DLL中的用法

我将这样定义这个类:

[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接口,如果他真的想,但它提高了标准。