2013-08-23 96 views
1

有沒有一種方法可以使用SimpleMembership使用密碼來散列明文密碼而不實際設置或更改密碼的相同散列算法?我只想要密碼的哈希版本進行比較。如何訪問SimpleMembershipProvider散列算法

我正在使用MVC 4構建一個新站點,並選擇使用SimpleMembershipProvider處理大多數帳戶相關數據。我的一個要求是保存密碼歷史記錄。我不需要能夠檢索實際的密碼,所以單向哈希就沒有問題。

我已經想出了一個解決方案,它使用單獨的單向散列算法保留一個單獨的密碼錶,但它對我來說似乎相當笨拙。如果我可以使用新密碼,使用SimpleMembership的算法對其進行哈希處理,將其與我存儲的密碼進行比較,然後只有在有效時才進行更改,那麼這將更加清潔。當我從舊網站遷移密碼時,這也會有所幫助。

現在我可以找到生成密碼哈希版本的唯一方法是更改​​密碼,然後從SQL讀取散列版本。

回答

3

SimpleMembershipProvider.SetPasswordprivate方法),使用System.Web.Helpers.Crypto.HashPassword,所以你可以使用它來散列密碼。它也爲您處理鹽,它包含在返回值中。

這反過來方法會返回一個RFC 2898的散列,所以你也可以使用System.Security.Cryptography.Rfc2898DeriveBytes,這是什麼HashPassword方法uses.security.cryptography.rfc2898derivebytes.aspx,但你需要擔心的醃製。

使用HashPassword方法應該完美地滿足您的安全需求;當我被要求執行新的密碼不符合最近5次的任何一個(不管這是否是一個好的安全要求,它的工作原理)時,我都會使用它。您需要使用Crypto.VerifyHashedPassword方法來查看輸入的密碼是否與任何歷史記錄相匹配,因爲這也會爲您處理鹽。