我继承了一个使用ASP.NET成员资格提供程序进行用户管理的应用程序。作为各种修复和增强功能的一部分,我将使用散列密码替换纯文本密码的使用。在现有的重置密码页面上,用户需要再次输入正确的安全问题答案,当前密码,所需的新密码和所需的新密码。
我遇到了一个问题,似乎没有简单的方法来验证输入的安全问题答案是否正确。如果没有这个检查,用户可以在该字段中输入任何内容,只要他们输入了正确的当前密码,它就会被重置。
我无法调用GetPassword(),因为如果web.config中的passwordFormat =“Hashed”,该方法不可用。
我尝试手动解密散列安全问题答案,如here所述,但这仅适用于加密值而不是哈希值(逻辑我认为:))
我尝试手动散列用户输入的答案并将其与存储在数据库中的值进行比较,但两个散列字符串不同。我正在使用第三篇文章here中描述的算法,它在比较散列密码时有效,但不幸的是没有用于散列安全问题答案。
有没有人有更多建议?这看起来相当基础,所以我有一种感觉,我错过了一些明显的东西。
答案 0 :(得分:1)
我没有直接回答有关验证安全问题的问题,但我想强调安全问题在安全方面是一种非常糟糕的做法(请阅读“ PART III:使用秘密问题“here)。
相反,发送给用户的电子邮件(您在注册时已经确认过)的“重置密码链接”允许他们创建新密码,假设他们是唯一可以访问其电子邮件的人。
答案 1 :(得分:0)
var result = DataService.ExecuteScalar(cmd);
return result == null;
我应该拥有这个:
var result = DataService.ExecuteScalar(cmd);
return result != null;
当我认为安全问题答案的散列字符串不同时,我似乎错了。