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对象。
我将这样定义这个类:
[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接口,如果他真的想,但它提高了标准。