2009-06-08 191 views
1

我试图想为这个正则表达式,但没有任何运气部分字符串..匹配的密码恢复

比方说,你对你的网站的安全性问题,所以人可以恢复密码。人们经常忘记他们是如何输入信息的。例如,考虑到“您为哪家公司工作?”这个问题,用户可能会回答“微软公司”。但一个月后,当他们被提示回答这个问题时,他们可能会输入“微软”,即使他们的回答正确,他们也不会与原来的答案相匹配。

“Microsoft Corp.”或“微软公司”或“微软公司”将匹配“微软”,“questar gas”将匹配“Questar Gas Co.”。 “美国银行公司”不会匹配“美国银行”,因为“公司”不在字符串的末尾。

完成此操作的最佳方法是什么?

回答

4

我不会太担心人们改变他们的答案。人们在回答这些问题方面非常一致。如果我知道你的第一份工作是在微软,那么我输入它的方式稍有不同就可能表明我是攻击者。

避免将明文答案放置在您的数据库中。这类似于存储明文密码,这绝对是一个坏主意。如果您的数据库或数据库的备份超出了您的控制范围,那么您的客户的私人信息就会泄露。也许它不会落入不法之徒的手中,但想想你必须发送给用户的电子邮件。 “以同样的方式更改您回答此问题的所有网站。”

取而代之,取出答案的盐渍散列,并将其存储在数据库中。当用户稍后回答问题时,使用相同的算法来散列他们的答案,并与存储值进行比较。

您可以使用一些规范化来最小化拼写错误的影响。您可以转换为小写,并删除空格和标点符号。例如,“微软公司”将成为“microsoftcorp”。这样,如果用户决定离开期间或添加另一个空间,它仍然会匹配。

+1

这里非常合理的建议。 – 2009-06-09 00:49:38

0

说实话,我认为一个更好的方法来完成这个是限制用户的输入;而不是接受“微软公司”,只要允许用户输入一个单词(即“微软”),并在询问他们密码检索信息时提醒他们它只是一个单词。这是我认为最好的解决办法是限制输入的情况之一。

2

提供两个安全问题,而不是一个。我宁愿给用户许多选项,而不是安全的flexible

大声思考:如果字符串中有太多空格或标点符号,您也可能会显示一条警告,说明如果您忘记了密码并且必须以完全相同的方式写入此答案;)

3

正则表达式匹配可能不是最好的方法。我说你可能想使用“字符串距离”算法,如LevenshteinJaro-Winkler来决定用户的输入与预期输入有多接近。

虽然,为了解决Victor关于不太灵活灵活,请确保要求非常高的匹配阈值。

+1

我同意;如果你给予用户太多的帮助,你就会挫败安全系统的全部目的。 – 2009-06-09 00:56:32

1

这是一个常见的计算机科学问题。

您应该阅读有关字符串距离的文章,例如Levenshtein distance,然后决定如何(以及如果)您应该实施解决方案。

0

只给一个不同的角度,我认为一个秘密的问题/答案对击败密码的目的 - 他们更容易被攻击者猜测。

另一种方法是允许重置密码并将重设的密码通过电子邮件发送给用户。这样,如果您的应用程序的安全性忘记了密码,那么您将其安全性委派给其电子邮件/密码组合的安全性。