打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
C# 我有一个WPF应用程序有两个Passwo

C# 我有一个WPF应用程序有两个Passwo



c# 密码passwords equals passwordbox securestring
我有一个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
我是Password该PasswordBoxes物业有违仅访问点SecurePassword安全性? 编辑:基于这个问题 CodeGo.net,我检查了关于“使用Marshal类来转换的SecureString为ANSI或Unicode或一个BSTR”,那么也许我的这个博客帖子。
本文地址 :CodeGo.net/1705583/
-------------------------------------------------------------------------------------------------------------------------
1.它看起来像你这样两SecureStrings。 不安全的代码来遍历字符串:
bool SecureStringEqual(SecureString s1, SecureString s2) {  if (s1 == null)  {   throw new ArgumentNullException("s1");  }  if (s2 == null)  {   throw new ArgumentNullException("s2");  }  if (s1.Length != s2.Length)  {   return false;  }  IntPtr bstr1 = IntPtr.Zero;  IntPtr bstr2 = IntPtr.Zero;  RuntimeHelpers.PrepareConstrainedRegions();  try  {   bstr1 = Marshal.SecureStringToBSTR(s1);   bstr2 = Marshal.SecureStringToBSTR(s2);   unsafe   {    for (Char* ptr1 = (Char*)bstr1.ToPointer(), ptr2 = (Char*)bstr2.ToPointer();     *ptr1 != 0 && *ptr2 != 0;      ++ptr1, ++ptr2)    {     if (*ptr1 != *ptr2)     {      return false;     }    }   }   return true;  }  finally  {   if (bstr1 != IntPtr.Zero)   {    Marshal.ZeroFreeBSTR(bstr1);   }   if (bstr2 != IntPtr.Zero)   {    Marshal.ZeroFreeBSTR(bstr2);   }  } } 
我已经修改了它下面没有不安全的代码工作(但是请注意,你可以在调试的时候看到的字符串以纯文本):
 Boolean SecureStringEqual(SecureString secureString1, SecureString secureString2) {  if (secureString1 == null)  {  throw new ArgumentNullException("s1");  }  if (secureString2 == null)  {  throw new ArgumentNullException("s2");  }  if (secureString1.Length != secureString2.Length)  {  return false;  }  IntPtr ss_bstr1_ptr = IntPtr.Zero;  IntPtr ss_bstr2_ptr = IntPtr.Zero;  try  {  ss_bstr1_ptr = Marshal.SecureStringToBSTR(secureString1);  ss_bstr2_ptr = Marshal.SecureStringToBSTR(secureString2);  String str1 = Marshal.PtrToStringBSTR(ss_bstr1_ptr);  String str2 = Marshal.PtrToStringBSTR(ss_bstr2_ptr);  return str1.Equals(str2);  }  finally  {  if (ss_bstr1_ptr != IntPtr.Zero)  {   Marshal.ZeroFreeBSTR(ss_bstr1_ptr);  }  if (ss_bstr2_ptr != IntPtr.Zero)  {   Marshal.ZeroFreeBSTR(ss_bstr2_ptr);  }  } }

2.这不会有不安全的块并不会以明文显示密码:
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); }}
编辑:固定泄漏的由Alex J.
本文标题 :C# 我有一个WPF应用程序有两个Passwo
本文地址 :CodeGo.net/1705583/ 
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
海康SDK编程指南
C# 读取ARP缓存
VB.NET自动操作其他程序(3)
运用C#编程通过OPC方式实现PC机与西门子PLC通讯
UAC 提权
c#进程外Com服务(exe)编写调用
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服