2014-02-13 65 views
3

所以我有一些模型在默認視圖中顯示。我想弄清楚我是否想用Crypto.HashPassword()方法來散列密碼。我在控制器或模型中或在哪裏執行此操作?我研究瞭如何去做,但我只是找到了不同的方法,而不是發生在何處。初學者到MVC和asp.net,所以任何正確的方向將是主要幫助。先謝謝你。我在哪裏可以使用mvc4和EF在asp.net中散列密碼?

+1

我會使用'Rfc2898DeriveBytes'來實現類似於'Crypto'類的API,但是具有更高的迭代次數。 – CodesInChaos

回答

2

我定義了用戶級是這樣的:

public class User 
{ 
    private string PasswordHash {get; set;} //assuming your db supports serializing private properties. If not increase visibility as necessary. 

    public void SetPassword(string newPassword) 
    { 
     PasswordHash = PasswordHasher.CreateHash(newPassword); 
    } 

    public bool VerifyPassword(string passwordCandidate) 
    { 
     return PasswordHasher.Verify(PasswordHash, passwordCandidate); 
    } 
} 

我不會有User.Password的性質,因爲你永遠不儲存,且有密碼和哈希之間不存在簡單的映射。

PasswordHash屬性應該只能由數據庫序列化程序和這兩個函數訪問。控制器應該獲取用戶,然後調用這些方法來驗證/更改密碼。


我也推薦使用自定義散列器類似API的Crypto類。 Crypto的硬編碼迭代計數值相當小。

0

有可能是做這件事的方法很多..

我最好我將標誌着一個自定義密碼屬性屬性名稱[加密(真)]。那麼當屬性保存到數據庫時,您需要分別跟蹤由Encrypt屬性標記的模型屬性(在DbContext Saving事件中)。然後你可以加密並將其保存到上述保存事件中的數據庫中。

當您想要加密其他任何您希望保存到數據庫中的敏感數據時,自定義屬性和這樣的通用解決方案也可能非常方便。

+0

所以我會在公共字符串密碼上面加上[加密(true)] {get;組; }在我的用戶模型中。然後我會爲Encrypt創建另一個類並在其中編寫散列方法? – Shawn

+1

是的,這是我會做..但請不要誤解..在自定義屬性中,你不能寫加密,但它必須在上下文保存事件內單獨完成。所以你有一個通用的解決方案來加密你的應用程序中的數據。 –

+0

我認爲我做錯了什麼。我把[加密]放在公共字符串密碼的上面。下一步,我做了excrypt類,並填充 類加密屬性:屬性 { public string hashPassword(string Password) { string Passhash = Crypto.Hash(Password); return Passhash; } } } 當它存儲在數據庫中時它不起作用嗎? – Shawn

3

通常你會希望在控制器執行哈希運算哈希結果值存儲在模型

以例如一個簡單的用戶登錄到您的網站:

  • 首次創建用戶帳戶,你會打電話給Crypto.HashPassword(PWD)計算出用戶密碼的哈希值組。您可以在控制器中執行此操作,在用戶註冊新帳戶的操作中執行此操作。
  • 生成的散列值需要存儲在模型中(例如在數據庫中),以便稍後檢索。
  • 當同一個用戶下次嘗試登錄時,您需要調用Crypto.VerifyHashedPassword(storedHash,submittedPwd)。 Crypto類使用相同的IV和Salt對提交的pwd進行散列,如果匹配(pwd正確),則返回True;如果不匹配(pwd錯誤),則返回False。

如果你是新的MVC和ASP.Net,你可能想看看ASP.Net窗體身份驗證(如this page on MSDN),你可以用它來驗證用戶,而不必推出自己的定製解決方案。

+0

」當下一次同一用戶嘗試登錄時,您需要再次調用所提供的密碼上的「Crypto.HashPassword(pwd)」,然後將結果的哈希值與模型中存儲的值進行比較「因爲'HashPassword'不是確定性的。你需要使用'Crypto.VerifyHashedPassword'。 – CodesInChaos

+0

謝謝@CodesInChaos,你是對的。我編輯了我的回覆以反映這一點。我也同意你的其他答案,即使用Rfc2898DeriveBytes更好,我自己使用它(所以在我自己的應用程序中,我實際上必須調用相同的散列方法w /存儲salt並將新結果與存儲的散列進行比較)。 – Whitzz

相關問題