2011-12-20 49 views
1

我試圖創建所有密碼哈希和鹽漬的身份驗證。首先,爲了簡單起見,我試着不加鹽,這裏是我的LINQ:ASP.NET MVC/C# - Linq和哈希密碼

var CurrentUser = db.Users 
    .Single(u => u.UserName == form["username"] && u.Password.SequenceEqual 
       (
        MD5.Create().ComputeHash 
         (
          Encoding.UTF8.GetBytes(form["password"]) 
         ) 
       ) 
     ); 

不幸的是,這個錯誤發生:

查詢操作「SequenceEqual」不支持。

回答

5

這將有助於瞭解你的出發(即讓你的用戶記錄什麼是「db.Users」)。

無論LINQ提供您的使用(EF等)可能不支持在查詢中使用SequenceEqual,所以你需要獲取用戶記錄,然後檢查密碼:

var currentUser = db.Users.Single(u => u.UserName == form["username"]); 
var hash = MD5.Create().ComputeHash(Encoding.UTF8.GetBytes(form["password"])); 

var passwordCorrect = currentUser.Password.SequenceEqual(hash); 

您可能還希望在你的「u.UserName ==」比較中更加明確地表明它是否區分大小寫/有序等。

編輯:Flater的答案也可以正常工作,但是我個人寧願將記錄拉回並驗證它,因爲你可能想知道用戶是否真的存在(不僅僅是用戶名和密碼是否正確),這樣你就可以「鎖定出「帳戶或根據一些不正確的密碼嘗試採取其他(更有幫助)的操作。

+0

以前我從來沒有用過多的哈希函數,感謝信用;)你會得到讚揚,比我(如何,如何 :) – Flater 2011-12-20 08:58:07

1

LINQ不允許其lambda表達式中的每種函數/運算符。有時候可能會很煩人。我建議找到您可以在其中存儲您要檢查針對一個變量有什麼辦法,那麼就檢查

... && u.Password = myVariable); 
+0

那種可以工作,但是通常的密碼不只是散列也鹹,所以比較不會爲他們工作。更好的選擇是同時獲得哈希和鹽,並在那裏進行所有計算。 – 2011-12-25 21:10:15

+0

我的建議是做調查,然後檢查平等。它不能通過預先計算用戶輸入中的散列,將其存儲在'myVariable'中,然後根據現有散列檢查eqality?自從我使用哈希以來,這已經有一段時間了,這就是爲什麼我高舉史蒂芬羅賓斯來完成,正確和精細化的原因。^^ – Flater 2011-12-27 08:47:35

0

爲什麼不按名稱獲取用戶,然後將其與鹽的密碼進行比較?的

var CurrentUser = db.Users 
    .FirstOrDefault(u => u.UserName == form["username"]); 
if (CurrentUser == null || !CurrentUser.Password.SequenceEqual(
        MD5.Create().ComputeHash(
          Encoding.UTF8.GetBytes(form["password"])))) { ...user of password is incorrect.. }