2013-02-15 37 views
-2

獲取未加密的密碼我想獲得用戶密碼加密。如何得到這個?從的MembershipProvider

public static string GetCurrentUserPassword(string userName) 
{ 
    MembershipProvider p = (MembershipProvider)Membership.Providers["Default"]; 
    MembershipUser obj = Membership.GetUser(userName); 
    return obj.GetPassword();    
} 


obj type : [Telerik.Sitefinity.Security.Model.User] = User "user1", Id={59d9813c-f88e-4790-9f19-3145ba8347d1}, Provider="Default" 

password : "+HmReh/mzvIIuvYsM7+XdEoeQhI=" 
+3

我想不出有什麼好的理由來做到這一點。你永遠不應該知道你的用戶密碼。如果你知道,黑客可以知道你是否受到攻擊。 – KingCronus 2013-02-15 13:23:40

+0

@KingCronus,我想寫'忘記密碼'頁面。如果用戶忘記密碼要發送電子郵件。 – baros 2013-02-15 13:27:06

+4

因此,你要通過純文本電子郵件將密碼發送給他們?壞主意 - 我會離開任何網站,這樣做對我來說,刪除我的帳戶,永遠不會回去。爲什麼不給他們一個重置它的方法,而不是告訴他們它是什麼。 – KingCronus 2013-02-15 13:28:12

回答

6

爲什麼你會期望能夠得到未加密的密碼?

唯一覺得你應該能夠存儲的密碼做的是用它來檢查用戶輸入的密碼的有效性。對於單向散列(以及類似的技術),它涉及對剛輸入的密碼應用相同的轉換(在適當的情況下使用相同的鹽),並查看最終是否使用相同的散列。

您應該而不是存儲可逆的密碼的任何表示形式。這意味着如果攻擊者獲得了訪問數據庫(以及任何私鑰)的權限,他們將直接訪問您的用戶密碼 - 這基本上是不可接受的。 (這也不會這麼糟糕,如果每個人都用他們保護每個資源使用不同的密碼,但很多人並不知道。)

4

如果密碼被配置爲被散列和不加密的,你不能這樣做。如果您將成員資格提供程序配置爲使用加密密碼,那麼GetPassword應該做到這一點。見PasswordFormat

話雖這麼說,我當然不能與飛碟雙向先生的答覆不同意。如果可能的話,你應該真的使用單向散列密碼。

對於處理忘記密碼的情況下,看看ResetPassword

3

documentation for MembershipUser.GetPassword()說,這一切:

如果EnablePasswordRetrieval是假的,成員資格提供程序將返回一個例外。如果提供商支持使用密碼格式爲Hash的密碼,您將無法檢索成員用戶的密碼,並且應該考慮在用戶忘記密碼時使用ResetPassword方法。

我想不出你會想閱讀密碼任何其他方式。