2009-05-18 55 views
39

在SQL Server 2008中存儲用戶密碼的建議做法是什麼?在SQL Server中存儲密碼

我正在存儲內部網的用戶詳細信息,並希望獲得有關存儲用戶詳細信息(如名稱,密碼和用戶訪問權限等)的最佳方法的建議。我正在考慮創建一個nvarchar列,然後對其進行加密插入表格之前的文本。

+2

如果它是一個AD域,你不能讓AD處理認證嗎? – Rytmis 2009-05-18 06:01:47

+0

謝謝大家的建議。 Richard – Richard 2009-05-19 00:19:03

回答

2

通常是這樣做的方式。

您的應用程序將處理加密(並可選地解密),數據庫將只存儲密碼。

我建議使用的東西比過時事實上的強 - MD5

大多數.NET開發人員似乎喜歡使用TDES

+0

我會同意你可以使用比MD5更強的東西 – 2009-05-18 05:26:40

+3

MD5不是一種加密算法,它是一種哈希算法。 http://en.wikipedia.org/wiki/MD5 – 2009-05-18 05:27:55

+0

同意。我想我沒有明確,所以你得到了一個:) – 2009-05-18 05:36:59

7

敏感數據的加密是好的。但是,使用密碼時,您永遠不需要知道原始值,因爲任何已加密的內容都可以解密,所以您將該信息置於被發現的危險之中。

相反,你應該保持密碼的散列。這個過程取得了這個值,併產生了相當複雜的校驗和。鑑於這個數字,沒有辦法回到原來的密碼,這增加了這些信息的安全性。當你想知道某個人是否給了你正確的密碼時,你將他們給你的值散列並且比較散列值。

安全性是一個複雜的話題。即使使用哈希函數,您最終可能會遇到一個存在嚴重安全漏洞的系統。如果你的團隊中沒有人擁有這種知識,那麼獲得安全顧問的幫助並不是一個壞主意。

53

通常的存儲密碼的方法是在密碼上使用散列函數,但是事先給salt。 「密碼」是非常重要的,以防禦自己對抗rainbow table攻擊。

所以,你的表應該是這個樣子的是

._______._________________.______________. 
|user_id|hash    |salt   | 
|-------|-----------------|--------------| 
|12  |[email protected]|13%!#tQ!#3t...| 
|  |...    |...   | 

檢查時,如果給定的密碼的用戶相匹配,你應該串聯的鹽,以給定的密碼,並計算出結果字符串的哈希函數。如果散列函數輸出匹配hash列 - 它是正確的密碼。

然而,瞭解salt-hash思路有一個特定的原因是非常重要的 - 防止任何訪問數據庫的人知道任何密碼(這被認爲是難以顛倒散列函數輸出的問題)。例如,銀行的DBA即使可以訪問所有列,也無法登錄到您的銀行帳戶。

如果您認爲您的用戶將使用敏感密碼(例如他們的Gmail帳戶的密碼)作爲您網站的密碼,您還應該考慮使用它。

恕我直言,它並不總是需要的安全功能。所以你應該考慮你是否想要它。

請參閱this article以便對此機制進行很好的總結。

更新:值得一提的,是針對扭轉個人密碼的哈希針對性的攻擊額外的安全,你應該use bcrypt,可以任意難以計算。 (但是除非你真的害怕神祕的黑人瞄準你的特定數據庫,否則我認爲sha1足夠好了,我不會爲我的項目引入另一個依賴項來實現這種額外的安全性,也就是說,沒有理由不使用sha1 100次,這會產生類似的效果)。