所以我有一些模型在默認視圖中顯示。我想弄清楚我是否想用Crypto.HashPassword()方法來散列密碼。我在控制器或模型中或在哪裏執行此操作?我研究瞭如何去做,但我只是找到了不同的方法,而不是發生在何處。初學者到MVC和asp.net,所以任何正確的方向將是主要幫助。先謝謝你。我在哪裏可以使用mvc4和EF在asp.net中散列密碼?
回答
我定義了用戶級是這樣的:
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
的硬編碼迭代計數值相當小。
有可能是做這件事的方法很多..
我最好我將標誌着一個自定義密碼屬性屬性名稱[加密(真)]。那麼當屬性保存到數據庫時,您需要分別跟蹤由Encrypt屬性標記的模型屬性(在DbContext Saving事件中)。然後你可以加密並將其保存到上述保存事件中的數據庫中。
當您想要加密其他任何您希望保存到數據庫中的敏感數據時,自定義屬性和這樣的通用解決方案也可能非常方便。
所以我會在公共字符串密碼上面加上[加密(true)] {get;組; }在我的用戶模型中。然後我會爲Encrypt創建另一個類並在其中編寫散列方法? – Shawn
是的,這是我會做..但請不要誤解..在自定義屬性中,你不能寫加密,但它必須在上下文保存事件內單獨完成。所以你有一個通用的解決方案來加密你的應用程序中的數據。 –
我認爲我做錯了什麼。我把[加密]放在公共字符串密碼的上面。下一步,我做了excrypt類,並填充 類加密屬性:屬性 { public string hashPassword(string Password) { string Passhash = Crypto.Hash(Password); return Passhash; } } } 當它存儲在數據庫中時它不起作用嗎? – Shawn
通常你會希望在控制器執行哈希運算和哈希結果值存儲在模型。
以例如一個簡單的用戶登錄到您的網站:
- 首次創建用戶帳戶,你會打電話給Crypto.HashPassword(PWD)計算出用戶密碼的哈希值組。您可以在控制器中執行此操作,在用戶註冊新帳戶的操作中執行此操作。
- 生成的散列值需要存儲在模型中(例如在數據庫中),以便稍後檢索。
- 當同一個用戶下次嘗試登錄時,您需要調用Crypto.VerifyHashedPassword(storedHash,submittedPwd)。 Crypto類使用相同的IV和Salt對提交的pwd進行散列,如果匹配(pwd正確),則返回True;如果不匹配(pwd錯誤),則返回False。
如果你是新的MVC和ASP.Net,你可能想看看ASP.Net窗體身份驗證(如this page on MSDN),你可以用它來驗證用戶,而不必推出自己的定製解決方案。
」當下一次同一用戶嘗試登錄時,您需要再次調用所提供的密碼上的「Crypto.HashPassword(pwd)」,然後將結果的哈希值與模型中存儲的值進行比較「因爲'HashPassword'不是確定性的。你需要使用'Crypto.VerifyHashedPassword'。 – CodesInChaos
謝謝@CodesInChaos,你是對的。我編輯了我的回覆以反映這一點。我也同意你的其他答案,即使用Rfc2898DeriveBytes更好,我自己使用它(所以在我自己的應用程序中,我實際上必須調用相同的散列方法w /存儲salt並將新結果與存儲的散列進行比較)。 – Whitzz
- 1. 在這裏使用哪種算法來散列密碼?
- 2. 哪種散列算法可以使用.NET,我可以使用java對這些散列執行密碼檢查
- 3. 我在哪裏可以獲得MVC4的源代碼
- 4. 在Silverstripe DB中,我可以在哪裏找到用戶表和密碼?
- 5. 我可以存儲散列密碼嗎?
- 6. 我在哪裏可以找到Vigenere密碼的Java源代碼?
- 7. 我在哪裏可以保存在Java代碼中使用
- 8. 我在哪裏可以找到Bigcommerce商店散列值
- 9. asp.net-MVC我在哪裏可以把我自己的代碼
- 10. 我在哪裏可以獲得可用命令和密鑰的列表?
- 11. 使用ASP.NET MVC 3散列密碼
- 12. 我在哪裏尋找PHP內置crypt的源碼,如在bcrypt密碼散列中使用的?
- 13. 在Codeigniter中使用PHPass散列密碼
- 14. 我在哪裏用鹽和散列我的密碼?在客戶端還是在主機上?
- 15. 我可以在哪裏使用?
- 16. Python - 我可以在哪裏使用它
- 17. 我們可以在哪裏使用AS3?
- 18. 我在哪裏將我的C#代碼放在MVC4中?
- 19. 我在哪裏可以在ASP.NET應用程序中註冊IMemoryCache?
- 20. 我在哪裏可以獲得新的TYPO3安裝密碼?
- 21. 我在哪裏可以在Realm Browser mac應用程序中輸入密碼?
- 22. 我可以在哪裏啓動陣列?
- 23. 我可以在哪裏找到ASP.NET Web Api Beta版的代碼?
- 24. 在cookies中散列密碼
- 25. 我在哪裏可以從
- 26. 哪裏可以存儲密碼?
- 27. 我在哪裏可以在此代碼中調用'.to_i'?
- 28. 哪裏是在MVC4
- 29. 我在哪裏可以爲if和elif添加通用代碼?
- 30. 如何在java中使用散列函數來散列密碼?
我會使用'Rfc2898DeriveBytes'來實現類似於'Crypto'類的API,但是具有更高的迭代次數。 – CodesInChaos