2010-02-26 62 views
7

我試圖登錄時,驗證別人的密碼。等於2字節[]沒有返回true

我把輸入的口令和檢索用戶保存的哈希密碼和密碼鹽。

然後我用已保存的鹽對輸入的密碼進行哈希以查看它是否與保存的密碼相同。

但是,即使byte [] storedPassword與byte [] enteredPassword完全相同,它在bool中也不會返回true,因此不會驗證用戶。這是爲什麼?

public static bool VerifyPassword(byte[] newPassword, byte[] storedPassword, byte[] storedSalt) 
    { 
     byte[] password = CreateHashedPassword(newPassword, storedSalt); 

     if (!password.Equals(storedPassword)) 
      return false; 

     return true; 
    } 

回答

3

等於不比較兩個byte []數組的字節數。您必須自己比較兩個陣列中的每個字節。

2

你必須迭代數組的元素來看它們是否相同。使用.Equals()方法只會告訴您兩個變量是否引用相同的數組。

 for (int i = 0; i < password.Length; i++) 
      if (password[i] != storedPassword[i]) 
       return false; 
     return true; 
+0

此代碼之前,我會比較密碼和storedPassword的長度。如果storedPassword小於密碼,則可以讀取數組的末尾。另一方面,如果密碼較短,則僅比較前幾個字節。如果您可以將密碼設置爲較短的尺寸,則可以使用存儲的密碼的前綴進行匹配。 Jacob – TheJacobTaylor 2010-02-26 06:05:34

+0

一般來說,密碼哈希算法總是產生相同數量的字節。例如,MD5散列總是16個字節,所以不需要檢查散列的長度。 – Gabe 2010-02-26 06:10:03

13

你應該比較您的陣列的每個字節,你可以做一個簡單的循環,或使用LINQ的SequenceEqual擴展方法(如果可用):

public static bool VerifyPassword(byte[] newPassword, byte[] storedPassword, 
            byte[] storedSalt) 
{ 
    byte[] password = CreateHashedPassword(newPassword, storedSalt); 

    return password.SequenceEqual(storedPassword); 
} 
0

的System.Array.Equals方法看起來測試僅用於對象標識,就像object.Equals一樣。

你必須編寫一個循環並自己比較元素。

0

Array.Equals就像object.Equals,它測試的是實例的相等性,而不是「值」的相等性。

你需要的東西,如:

public static boolean ByteArrayEquals(byte[] a, byte[] b) { 
    if (a.Length != b.Length) 
    return false; 
    for (int i = 0; i < a.Length; i++) 
    { 
     if (a[i] != b[i]) 
     return false; 
    } 
    return true; 
} 
相關問題