日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

C# 我有一個WPF應(yīng)用程序有兩個Passwo

 牛人的尾巴 2016-03-22

C# 我有一個WPF應(yīng)用程序有兩個Passwo



c# 密碼passwords equals passwordbox securestring
我有一個WPF應(yīng)用程序有兩個PasswordBoxes,一個是密碼,另一個用于密碼輸入第二個確認(rèn)的目的。我是想PasswordBox.SecurePassword得到SecureString密碼的,但我需要能夠在兩個PasswordBoxes的內(nèi)容,以確保平等之前,我接受密碼。然而,兩個相同的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該P(yáng)asswordBoxes物業(yè)有違僅訪問點SecurePassword安全性? 編輯:基于這個問題 CodeGo.net,我檢查了關(guān)于“使用Marshal類來轉(zhuǎn)換的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); 
  } 
 } 
} 
我已經(jīng)修改了它下面沒有不安全的代碼工作(但是請注意,你可以在調(diào)試的時候看到的字符串以純文本):
 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.
本文標(biāo)題 :C# 我有一個WPF應(yīng)用程序有兩個Passwo
本文地址 :CodeGo.net/1705583/ 

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多