-2

我想获得未加密的用户密码。如何得到这个?

 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="
4

3 回答 3

6

为什么您希望能够获得未加密的密码?

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

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

于 2013-02-15T13:13:28.090 回答
4

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

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

要处理忘记密码的情况,请查看ResetPassword

于 2013-02-15T13:14:59.163 回答
3

文档MembershipUser.GetPassword ()说明了一切:

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

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

于 2013-02-15T13:21:02.100 回答