2014-09-11 32 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