2009-06-12 140 views
1

我正在使用.net 3.5。這裏的問題是,我似乎無法得到匹配的密碼。我曾嘗試在兩者上使用ComputeHash方法,但它會生成不同的散列。因爲他們現在的陣列是不同的大小。 (顯然它們基於相同的字符串)。我做錯了什麼? (「密碼」是字節[]由用戶輸入參數)比較散列密碼

object dataPassword = database.ExecuteScalar("GetUserPassword", new object[] {userName}); 
if(dataPassword != null && !(dataPassword is DBNull)) 
{ 
    SHA1Managed hashProvider = new SHA1Managed(); 
    byte[] hashedPassword = (byte[])dataPassword;      
    byte[] hash = hashProvider.ComputeHash(password); 
    result = hashedPassword.Equals(hash); 

} 

回答

14

你不能比較這樣的byte[]。它只是比較參考。您應該使用一個循環或使用IEnumerable<T>.SequenceEqual擴展方法:

result = hashedPassword.SequenceEqual(hash); 

老辦法(預LINQ):

static bool ArrayEquals<T>(T[] first, T[] second) { 
    if (first == null && second == null) return true; 
    if (first == null || second == null) return false; 
    if (first.Length != second.Length) return false; 
    for (int i = 0; i < first.Length; ++i) 
     if (first[i] != second[i]) return false; 
    return true; 
} 
+0

如何擴展字節,因此可以使用它? – JonasB 2009-06-12 10:26:57

0

如何被存儲在數據庫中的密碼,也通過SHA1Managed被創建後?

0

在這兩種情況下都打印哈希輸入的內容。我的意思是打印字節[],而不是字符串。如果它們匹配,散列也應該如此。我對.net一無所知,但是對於字符串也許有不同的編碼,就像使用ASCII和另一個UTF-8的編碼一樣?