【问题标题】:Get unencrypted password from MembershipProvider从 MembershipProvider 获取未加密的密码
【发布时间】:2013-02-15 13:06:02
【问题描述】:

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

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

【问题讨论】:

  • 我想不出任何好的理由这样做。您永远不应该知道您的用户密码。如果您知道,黑客可能会知道您是否被入侵。
  • @KingCronus,我想写“忘记密码”页面。如果用户忘记密码想发送电子邮件。
  • 所以您打算通过纯文本电子邮件向他们发送密码?坏主意 - 我会离开任何对我这样做的网站,删除我的帐户并且永远不会回去。为什么不给他们一种方法来重置它,而不是告诉他们它是什么。
  • @baros 当用户忘记密码时,应使用重置密码来保护他们免受外部攻击。如果用户的电子邮件被黑客入侵,那么黑客可以使用忘记密码链接来检索用户当前密码并访问该用户具有相同密码的任何其他站点。但是,如果它只是返回一个新密码,那将不是问题。
  • @KingCronus,是的,我打算用纯文本发送。如何创建您所指的结构?

标签: c# asp.net telerik


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    对于忘记密码的情况,请查看ResetPassword

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2011-06-27
        • 2010-11-06
        • 1970-01-01
        • 2010-10-23
        • 1970-01-01
        • 2023-02-03
        • 2016-07-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多