我有一个带有两个密码框的 WPF 应用程序,一个用于密码,另一个用于第二次输入密码以进行确认。我本来想用PasswordBox.SecurePassword
得到SecureString
的密码,但我需要能够比较两个密码框的内容,以确保在接受密码之前相等。但是,两个相同的 SecureString 不被视为相等:
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
我在想比较Password
密码框的属性将破坏仅访问的点SecurePassword
因为我会读取纯文本密码。我应该怎么做才能比较两个密码而不牺牲security https://stackoverflow.com/questions/141203/when-would-i-need-a-securestring-in-net?
Edit: 基于这个问题 https://stackoverflow.com/questions/978350, 我正在结账这篇博文 http://bartdesmet.net/blogs/bart/archive/2006/03/31/3851.aspx关于“使用 Marshal 类将 SecureString 转换为 ANSI 或 Unicode 或 BSTR”,那么也许我可以比较它们。
这没有不安全的块,并且不会以明文形式显示密码:
public static bool IsEqualTo(this SecureString ss1, SecureString ss2)
{
IntPtr bstr1 = IntPtr.Zero;
IntPtr bstr2 = IntPtr.Zero;
try
{
bstr1 = Marshal.SecureStringToBSTR(ss1);
bstr2 = Marshal.SecureStringToBSTR(ss2);
int length1 = Marshal.ReadInt32(bstr1, -4);
int length2 = Marshal.ReadInt32(bstr2, -4);
if (length1 == length2)
{
for (int x = 0; x < length1; ++x)
{
byte b1 = Marshal.ReadByte(bstr1, x);
byte b2 = Marshal.ReadByte(bstr2, x);
if (b1 != b2) return false;
}
}
else return false;
return true;
}
finally
{
if (bstr2 != IntPtr.Zero) Marshal.ZeroFreeBSTR(bstr2);
if (bstr1 != IntPtr.Zero) Marshal.ZeroFreeBSTR(bstr1);
}
}
Edit:按照 Alex J. 的建议修复了泄漏。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)