【问题标题】:Validate the answer to the Security Question when using hashed passwords使用散列密码时验证安全问题的答案
【发布时间】:2011-08-09 10:29:02
【问题描述】:

我继承了一个使用 ASP.NET 成员资格提供程序进行用户管理的应用程序。作为各种修复和增强功能的一部分,我将使用散列密码替换纯文本密码。在现有的重置密码页面上,用户需要输入安全问题的正确答案、当前密码、所需的新密码和所需的新密码。

我遇到了一个问题,似乎没有一种简单的方法可以验证输入的安全问题答案是否正确。如果没有此检查,用户可以在该字段中输入任何内容,只要他们输入了正确的当前密码,它将被重置。

我无法调用GetPassword(),因为如果 Web.config 中的 passwordFormat="Hashed" 则该方法不可用。

我尝试按照here 的描述手动解密散列安全问题答案,但这仅适用于加密值而不是散列值(我想是合乎逻辑的 :))

我尝试手动对用户输入的答案进行哈希处理,并将其与存储在数据库中的值进行比较,但两个哈希字符串不同。我正在使用第三篇帖子here 中描述的算法,它在比较散列密码时有效,但不幸的是不适用于散列安全问题的答案。

还有人有什么建议吗?这似乎相当基本,所以我觉得我错过了一些明显的东西。

【问题讨论】:

    标签: asp.net membership-provider


    【解决方案1】:

    我没有直接回答您关于验证安全问题的问题,但我想强调的是,就安全性而言,安全问题是一种非常糟糕的做法(请阅读“PART III:使用秘密问题here)。

    相反,向用户的电子邮件(您在之前注册时已确认)发送“重置密码链接”,允许他们创建新密码,假设他们是唯一可以访问其电子邮件的人。

    【讨论】:

    • Ofer,您说的完全正确,但不幸的是,我们受到了可用时间的限制。在此之前,密码以纯文本形式存储在数据库中,并通过电子邮件以纯文本形式传输,因此至少我们改进了用户管理功能的某些方面。
    • 你说的很对,事情一定要按部就班。我只是想强调(为了所有其他人会来到这个页面)安全问题是不好的做法......
    【解决方案2】:

    呸,再喝一杯咖啡,答案就很明显了。我的验证方法中有这个:

    var result = DataService.ExecuteScalar(cmd);
    return result == null;
    

    我应该有这个:

    var result = DataService.ExecuteScalar(cmd);
    return result != null;
    

    当我认为安全问题答案的散列字符串不同时,我似乎也错了。

    【讨论】:

      猜你喜欢
      • 2011-08-10
      • 2014-07-20
      • 1970-01-01
      • 1970-01-01
      • 2010-11-16
      • 1970-01-01
      • 2020-06-02
      • 2010-12-22
      • 2018-03-01
      相关资源
      最近更新 更多