2014-09-11 81 views
3

我们正在使用Identity Framework 2.1.0并计划将安全问题和答案添加到用户注册页面。我们将有问题一个单独的表,并希望2个列添加到AspNetUsers将哈希安全列添加到ASP.NET身份(MVC 5)

  1. SecurityQuestionId
  2. SecurityAnswer

我想要保持“SecurityAnswer”列散列,因为我们已经有这个表中的SecurityStamp列,我们可以使用它来进行哈希和去哈希?

如果是,如何?如果否,有什么选择?

您的帮助是非常感谢,任何参考,指针赞赏。

+0

你问你是否可以使用SecurityStamp作为盐来散列SecurityAnswer?我不会推荐这个,因为SecurityStamp可以在任何时候改变,当它发生改变时,你基本上失去了你的食盐,并且在将来验证SecurityAnswer的能力都会消失。 – trnelson 2015-03-18 11:17:47

回答

3

哈希安全的回答,您可以使用UserManager.PasswordHasher

var manager = // get instance of UserManager 

var hashedAnswer = manager.PasswordHasher.HashPassword("Very secret Answer to my secrect question"); 

// ... here store you hashed answer in database 

当用户返回并尝试重置您的密码得到答案的存储的哈希并将其与用户新提供的答案:

PasswordVerificationResult isValid = manager.PasswordHasher.VerifyHashedPassword(hashedAnswer, "Hello, this is the wrong answer"); 

if(PasswordVerificationResult.Success) 
{ 
    // reset password, answer is correct 
} 

就像这样。

但是,我不是秘密问题/答案的粉丝。从安全角度来看,它们本质上是有缺陷的。你的答案变成另一个密码,这个密码比你的普通密码更易猜出,因为这个问题提供了一个提示。我建议通过Troy Hunt about password resetting的优秀文章阅读 - 它涉及秘密问题/答案的主题。

+1

关于安全问题/答案的好处。 TSV或双因素是安全性更好的选择。 – Shoe 2014-09-11 14:26:12

+0

太棒了,我将它标记为答案,这正是我所寻找的,并为这个建议竖起大拇指,我一定会尝试一下替代方案。干杯:) – 2014-09-12 10:41:24

3

没有“去散列”,因为散列是一个单向过程。

我会做的是从UserManager背负身份密码哈希函数。散列您的安全答案并将其存储在新列中。

var hashedAnswer = UserManager.PasswordHasher.HashPassword("My Secret Answer"); 

然后,当你需要验证对用户提供的输入真正安全的答案...

var result = UserManager.PasswordHasher.VerifyHashedPassword(hashedValue, userInput); 

如果两个答案都相同的哈希将是相同的。

+0

3分钟打我 - - – trailmax 2014-09-11 14:18:02