在SQL Server 2008中存儲用戶密碼的建議做法是什麼?在SQL Server中存儲密碼
我正在存儲內部網的用戶詳細信息,並希望獲得有關存儲用戶詳細信息(如名稱,密碼和用戶訪問權限等)的最佳方法的建議。我正在考慮創建一個nvarchar列,然後對其進行加密插入表格之前的文本。
在SQL Server 2008中存儲用戶密碼的建議做法是什麼?在SQL Server中存儲密碼
我正在存儲內部網的用戶詳細信息,並希望獲得有關存儲用戶詳細信息(如名稱,密碼和用戶訪問權限等)的最佳方法的建議。我正在考慮創建一個nvarchar列,然後對其進行加密插入表格之前的文本。
通常是這樣做的方式。
您的應用程序將處理加密(並可選地解密),數據庫將只存儲密碼。
我建議使用的東西比過時事實上的強 - MD5
大多數.NET開發人員似乎喜歡使用TDES
我會同意你可以使用比MD5更強的東西 – 2009-05-18 05:26:40
MD5不是一種加密算法,它是一種哈希算法。 http://en.wikipedia.org/wiki/MD5 – 2009-05-18 05:27:55
同意。我想我沒有明確,所以你得到了一個:) – 2009-05-18 05:36:59
T-SQL包括加密功能 - 4Guys有一個good article on it for SQL Server 2005 AA而回,但我認爲這全部仍適用於2008年。
敏感數據的加密是好的。但是,使用密碼時,您永遠不需要知道原始值,因爲任何已加密的內容都可以解密,所以您將該信息置於被發現的危險之中。
相反,你應該保持密碼的散列。這個過程取得了這個值,併產生了相當複雜的校驗和。鑑於這個數字,沒有辦法回到原來的密碼,這增加了這些信息的安全性。當你想知道某個人是否給了你正確的密碼時,你將他們給你的值散列並且比較散列值。
安全性是一個複雜的話題。即使使用哈希函數,您最終可能會遇到一個存在嚴重安全漏洞的系統。如果你的團隊中沒有人擁有這種知識,那麼獲得安全顧問的幫助並不是一個壞主意。
通常的存儲密碼的方法是在密碼上使用散列函數,但是事先給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次,這會產生類似的效果)。
如果它是一個AD域,你不能讓AD處理認證嗎? – Rytmis 2009-05-18 06:01:47
謝謝大家的建議。 Richard – Richard 2009-05-19 00:19:03