我正在考虑为此正则表达,但没有任何运气..
假设您的网站上有安全问题,以便此人可以恢复密码。人们经常忘记他们如何输入信息。例如,考虑到“你为哪家公司工作?”这个问题,用户可能会回答“微软公司”。但一个月后,当他们被提示回答这个问题时,他们可能会输入“Microsoft”,即使他们明确回答正确,也不会与原来的答案相符。
“微软公司”或“微软公司”或“微软公司”将匹配“微软”,“questar gas”将匹配“Questar Gas Co.”。 “美国银行公司”不会与“美国银行”匹配,因为“公司”这个词不在字符串的末尾。
实现这一目标的最佳方法是什么?
答案 0 :(得分:4)
我不会太担心人们改变他们的答案。人们在如何回答这些问题方面非常一致。如果我知道你的第一份工作是在微软,那么我输入的方式略有不同可能表明我是攻击者。
避免在您的数据库中放置明文答案。这类似于存储明文密码,这绝对是一个坏主意。如果您的数据库或数据库的备份不受控制,那么您的客户的私人信息就会泄漏。也许它不会落入坏人之手,但想想你必须发送给用户的电子邮件。 “以同样的方式更改您回答此问题的所有网站。”
相反,采取答案的盐渍哈希,并将其存储在数据库中。当用户稍后回答问题时,使用相同的算法来散列他们的答案,并与存储的值进行比较。
您可以使用一些规范化来最小化拼写错误的影响。您可以转换为小写,并删除空格和标点符号。例如,“微软公司”将成为“microsoftcorp”。这样,如果用户决定不使用期间或添加其他空格,它仍会匹配。
答案 1 :(得分:3)
正则表达式匹配可能不是最好的方法。我说你可能想要使用“字符串距离”算法,比如Levenshtein或Jaro-Winkler来决定用户的输入与预期的接近程度。
虽然为了解决Victor关于不太灵活的观点,但请确保要求一个非常高的匹配阈值。
答案 2 :(得分:2)
提供两个安全问题,而不只是一个。我宁愿给用户提供许多选项,而不是灵活安全。
大声思考:你也可能会发出一个警告,上面写着“如果你忘记了密码就会提示这个答案,如果字符串中有太多的空格或标点符号,你必须用同样的方式写出来”; )
答案 3 :(得分:1)
这是一个常见的计算机科学问题。
您应该阅读有关字符串距离的文章,例如Levenshtein distance然后决定如何(以及如果)实施解决方案。
答案 4 :(得分:0)
老实说,我认为实现这一目标的更好方法之一是限制用户的输入;而不是接受“微软公司”,只是允许用户输入一个单词(即“微软”)并在向他们询问密码检索信息时提醒他们这只是一个单词。这是我认为最好的解决方案是限制输入的情况之一。
答案 5 :(得分:0)
为了给出不同的观点,我认为一个秘密的问题/答案对会破坏密码的目的 - 攻击者更容易猜到它们。
另一种方法是允许重置密码并将重置的密码通过电子邮件发送给用户。这样,如果他们忘记了密码,您就会将应用的安全性委托给他们的电子邮件/密码组合的安全性。