2011-08-09 41 views
0

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

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

我不能调用GetPassword(),因为如果在Web.config中passwordFormat =“Hashed”,该方法不可用。

我试图手动解密哈希的安全性问题的答案描述here但只适用于加密的值,而不是那些散列(逻辑我想:))

我已经手动尝试散列用户输入的答案和比较即存储在数据库中的值,但两个散列字符串不同。我正在使用第三篇文章here中描述的算法,它在比较散列密码时可行,但不幸的是,不适用于哈希安全问题答案。

有没有人有更多的建议?这似乎相当基本,所以我有一种感觉我错过了一些明显的东西。

回答

0

Bah,稍后一杯咖啡,答案很明显。我在我的验证方法具有这样的:

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

我应该有这样的:

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

它还看来,我错了,当我考虑安全问题答案的散列字符串是不同的。

1

我不会直接回答你的问题有关验证的安全性问题,但我想强调的是,安全问题是一个非常不好的做法在安全性方面(读“第三部分:使用保密问题here)。

取而代之,发送给用户的电子邮件(他们在注册时已经确认过了)一个“重置密码链接”,允许他们创建一个新密码,假设他们是唯一可以访问他们电子邮件的密码。

+0

Ofer,你是绝对正确的,但不幸的是,我们可以用我们能做的时间来限制我们。在此之前,密码以纯文本形式存储在数据库中,并通过电子邮件以纯文本形式传输,因此至少我们改进了用户管理功能的某些方面。 – Malice

+0

你是绝对正确的,事情必须按顺序完成。我只是想强调(为了所有其他人将通过这个页面)安全问题是不好的做法... –