2012-05-14 74 views
0

我閱讀存儲在數據庫中的密碼信息的最佳方式,而且大部分的例子說,我們不應該存儲在數據庫中的實際密碼的用戶憑據,但哈希和鹽值。在Web應用程序中,驗證用戶身份的代碼位於服務器端,因此我們通過線路發送用戶名和密碼,並在服務器上讀取salt值,然後使用salt接收我們收到的密碼,然後比較它用db存儲散列值。驗證的應用程序連接到數據庫直接(局域網)

如果什麼應用程序位於客戶端和應用程序連接到數據庫直接,而不是通過一些服務(本地網絡)?這意味着Hash類將暴露在客戶端上,並且我需要從客戶端的db讀取hash值和salt值,這種類型允許任何人創建幾行代碼並獲取客戶端上的所有用戶信息。

如何安全/認證在這樣的情況如何處理?

回答

0

Windows身份驗證

如果應用程序在Windows域之內運行,您可以使用身份驗證的Windows用戶信息。然後在數據庫中不需要存儲用戶名/密碼。您只需存儲Windows SID以在用戶表中標識用戶。然後,應用程序只需驗證當前用戶是否存在於數據庫用戶表中,如果不存在,則應用程序無法運行。

您可以通過使用WindowsIdentity.GetCurrent() (MSDN)和用戶屬性將讓你接觸到的SecurityIdentifier獲取當前用戶的信息。 Convert a username to a SID string in C#這個問題將告訴你如何將它轉換爲可以存儲在數據庫中的字符串。由於每個Windows用戶都有獨特的SID,因此可以輕鬆查找安全信息。

當走這條路線時,爲了提高安全性,最好爲SQL連接使用集成安全性,然後鎖定對查詢和表的訪問權限,以便只有特定的用戶組才能運行管理操作並添加用戶普通用戶只能執行相關表的讀取和數據插入/更新語句。

編輯:

由於Windows身份驗證不適合你,你可以有SQL做的哈希你在存儲過程中。通過使用HASHBYTES,您可以將用戶名/密碼傳遞給存儲過程,然後在SQL中進行驗證,以便最終用戶永遠不會看到邏輯。在存儲過程中,您可以從表格中提取Salt值或將其編碼。例如,我們使用用戶信息表中的用戶名,密碼和其他值創建獲取散列值。這可以防止不同的用戶使用相同的散列,即使他們具有相同的密碼。我們也使用SHA512來生成散列。然後,您只需要鎖定SQL訪問權限,以便用戶無法連接到SQL並對存儲過程執行右鍵單擊 - >修改以查看源代碼。這可能會對你的情況最好。

+0

,因爲應用程序需要允許不同的用戶登錄/註銷我無法使用驗證用戶信息,應用程序運行時。什麼是其他的選擇? – Goran

相關問題