我已經閱讀了大量有關如何存儲和比較輸入密碼的文章,一些舊的和一些新的,但都不同。因此,我採取了我認爲是最佳選擇並實施了以下內容。我的MVC3密碼處理足夠
請注意,我創建了自己的身份驗證提供程序,我沒有使用也沒有從標準MS MembershipProvider繼承(太臃腫)。這是一個輕量級網站,不需要「超級安全」,但我想遵循最佳做法。我只是想驗證一下,我沒有做任何明顯的錯誤或打開安全漏洞。另外,我查看了每個用戶的密碼salting,但它似乎過於複雜,我的需求。這是一個有效的假設嗎?
首先,我把下面的的appSettings關鍵在我的web.config,這是我的configurationProvider類返回。
這裏是我的代碼是公開服務器驗證用戶和privatly 檢查反對什麼什麼被輸入以及進行編碼保存時的密碼存儲的密碼。我沒有顯示添加或更新密碼方法,因爲它們使用相同的私有方法。
public bool Authenticate(string emailAddress, string password, bool setAuthCookie = false)
{
bool isAuthenticated = false;
var member = _memberRepository.Find(m => m.Email == emailAddress).SingleOrDefault();
if (member != null)
{
if (CheckPassword(password, member.Password))
{
isAuthenticated = true;
FormsAuthentication.SetAuthCookie(emailAddress, setAuthCookie);
}
}
return isAuthenticated;
}
private bool CheckPassword(string providedPassword, string storedPassword)
{
return EncodePassword(providedPassword) == storedPassword;
}
private string EncodePassword(string password)
{
var hash = new HMACSHA1
{
Key = Encoding.ASCII.GetBytes(_configurationProvider.PasswordEncryptionKey)
};
string encodedPassword = Convert.ToBase64String(hash.ComputeHash(Encoding.Unicode.GetBytes(password)));
return encodedPassword;
}
我唯一的規則是:
- 密碼必須異步加密在數據庫中,無法解密。
- 的方法應該是合理的安全對詞典或其他攻擊(我不是開發一個FDIC保險的網站,只是一個基本的內部網)
有了這個,有什麼明顯的我失蹤?
如果您正在編寫一個Intranet站點,爲什麼不使用Windows安全? 你的提供者的方法是一個很好的方法。 MS的確是臃腫的。 瀏覽你的代碼它或多或少是我爲公共網站所做的,所以我認爲你對你寫的內容做得很好。記住,一旦它連接到一個網絡上,你就會展現出層層障礙,希望攻擊者感到無聊並消失,否則沒有什麼是真正安全的。 – Peter 2012-03-20 23:16:34
對不起彼得......我應該澄清一點。這是一個基於互聯網的網站,但對於<100名成員將登錄的慈善團體。我應該使用「門戶」這個詞。所以它不會有大量的流量,但是我正在開發它,用於練習我的技能,所以我只想知道最佳實踐。 – bigmac 2012-03-20 23:20:32
使用PBKDF2或bcrypt代替滾動自己的。 – 2012-03-21 01:02:10