我有一个WPF应用程序,其中有两个PasswordBoxes,一个用于密码,另一个用于再次输入密码以进行确认。 我想使用
PasswordBox.SecurePassword
来获取密码的SecureString
,但在接受密码之前,我需要能够比较两个PasswordBoxes的内容以确保它们相等。 但是,两个相同的SecureStrings被视为不相等:var secString1 = new SecureString();
var secString2 = new SecureString();
foreach (char c in "testing")
{
secString1.AppendChar(c);
secString2.AppendChar(c);
}
Assert.AreEqual(secString1, secString2); // This fails
我认为比较 PasswordBoxes 的 Password 属性将会破坏访问仅限 SecurePassword 的目的,因为这样我将读取明文密码。那么,在不牺牲安全性的情况下,如何比较这两个密码呢?
编辑:根据这个问题,我正在查看这篇博客文章,了解如何“使用 Marshal 类将 SecureString 转换为 ANSI 或 Unicode 或 BSTR”,然后也许我就可以比较它们了。
SecureString.Equals(secstringone, secstringtwo);
这样的更加“兄弟化”的功能,做得不错。 - stackuser83int result = 0;
,将循环体更改为result |= Marshal.ReadByte(bstr1, x) ^ Marshal.ReadByte(bstr2, x);
并返回result == 0
来缓解这种情况。这将使比较成为恒定时间,因为它总是访问字符串中的每个字符 - 它仍然会泄漏长度,但这是不可避免的。 - DaveRandomMarshal.SecureStringToBSTR
确实会解密SecureString
的内容,并将解密后的副本加载到返回的内存地址中,这就是MS所谓的“非托管内存中的明文字符串” https://msdn.microsoft.com/en-us/library/system.security.securestring(v=vs.110).aspx#interop - Gregor y