2013-01-14 75 views
2

我正在使用SimpleMembershipProvider作爲我的數據庫提供者。SimpleMembershipProvider - 密碼加密

我已經增加了新的功能來通過繼承來改進這個提供者。

現在我想創建一個像「ChangeEmail」這樣的函數,但在此之前檢查輸入的密碼是否正確。

所以我必須加密輸入的密碼,並將結果與​​我的數據庫中的條目進行比較。

的問題是:

以何種方式SimpleMembershipProvider加密密碼?

我想:

Crypto.HashPassword(currentPassword); 

結果是相似的,但不是在數據庫中的相同這樣的。

PasswordFormat屬性設置爲MembershipPasswordFormat.Hashed。經由Crypto.HashPassword

AIYlAKcmDaABMw1PVx1kheZq2KXkhVs4QjO7MnwfHPcTBjnmRobRqJzWYHYO/S4T7w== 

這:

例如,哈希值「123456」,而產生登記

AG+md+0W2EuV9BzUdohkYMK547jB5ochvxeVKYQTkls0UQ+3W0BWPHnFoffiIn2byw== 

它看起來像相同類型的編碼,但爲什麼結果是不同的?

+0

你對['PasswordFormat'](http://msdn.microsoft.com/en-us/library/system.web.security.membershipprovider.passwordformat.aspx)屬性設置了什麼?這決定了密碼的存儲方式。 – adrianbanks

+0

@adrianbanks MembershipPasswordFormat.Hashed – Never

+1

如果'Crypto.HashPassword'不完全吸引,它將在每次調用時返回不同的密碼。 – CodesInChaos

回答

6

Crypto.HashPassword爲每個調用產生一個新鹽,所以每次輸出都會有所不同。驗證使用Crypto.VerifyHashedPassword

或者直接使用Rfc2898DeriveBytes。這使您可以調整散列成本,並且可以避免使用大於本地大小(20字節)的散列。