从MembershipProvider获取未加密的密码

时间:2013-02-15 13:06:03

标签: c# asp.net telerik

我想获取未加密的用户密码。怎么弄这个?

 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 个答案:

答案 0 :(得分:6)

为什么期望能够获取未加密的密码?

唯一认为您应该能够使用存储的密码来使用它来检查用户输入的密码的有效性。对于单向散列(和类似技术),涉及将相同的转换应用于刚刚输入的密码(在适当的地方使用相同的盐),并查看是否最终使用相同的散列。

您应该存储任何可逆的密码表示。这意味着如果攻击者获得了对您的数据库(以及任何私钥)的访问权限,他们就可以直接访问您的用户密码 - 这基本上是不可接受的。 (如果每个人都为他们保护的每个资源使用不同的密码,那就不会那么糟糕,但很多人没有。)

答案 1 :(得分:4)

如果密码配置为哈希且未加密,则无法执行此操作。如果您将成员资格提供程序配置为使用加密密码,那么GetPassword应该可以解决问题。见PasswordFormat

话虽如此,我当然不能不同意Skeet先生的回答。如果可能的话,你应该真的使用单向散列密码。

要处理忘记的密码方案,请查看ResetPassword

答案 2 :(得分:3)

documentation for MembershipUser.GetPassword ()说明了一切:

  

如果EnablePasswordRetrieval为false,则成员资格提供程序将返回异常。如果提供商支持使用Hashed的PasswordFormat的密码,您将无法检索成员资格用户的密码,并且应该考虑在用户忘记密码时使用ResetPassword方法。 < / p>

我想不出你想要读取密码的任何其他方式。