WPF的PasswordBox返回SecureString的,其中隐藏窥探者的密码。
问题是,你最终要得到密码的值,并建议我在网上所有涉及到的值复制到一个字符串,它可以让你回到窥探者的发现问题。
IntPtr bstr = Marshal.SecureStringToBSTR(secureString);
string password = Marshal.PtrToStringBSTR(bstr);
Marshal.FreeBSTR(bstr);
但如果你真的仔细想想,你并不真正需要的价值,作为一个字符串。 我的意思是,你有密码吗? 你哈希它,然后将结果比较保存的哈希值,看看它们是否相同。
换句话说,你不需要到SecureString的转换为字符串,你只需要能够在单个字符遍历的字符串中。
怎么会呢?
我如何遍历所有的单个字符的BSTR,在C#中,无需将其转换为托管字符串?
编辑:该解决方案,在情况下,链接消失:
马歇尔类提供了可以从一个IntPtr提取单个字节或整数,在给定偏移的方法。 甲BSTR对象包含的16位字符的数组,由两个空字节终止。 所以,你可以通过循环访问它们:
byte b = 1;
int i = 0;
while ((char)b != '\0')
{
b = Marshal.ReadByte(bstr, i);
// ...
i += 2;
}
(我不喜欢那种流量控制。我会用一个做...同时,而不是预填充B,其中A虚拟值,或者我会使用的(;;)循环,内部断裂,或者我会环绕在长,我解释如何得到,下文)。
另外,我可能会使用:
short b = Marshal.ReadInt16(bstr, i);
阅读整个Unicode字符,而不是仅仅每个字节低。
你可以得到BSTR以长度:
int len = Marshal.ReadInt32(bstr, -4);
这是字节包括空值的数量,而不是,不字符的数目。
此外 - 使用:
Marshal.ZeroFreeBSTR(bstr);