2010-05-20 39 views
6

在Web應用程序中尋找最安全(但也是可行)的密碼管理方式。WebApp密碼管理 - 散列,醃製等

現在,我將密碼保存爲散列。應用程序的數據庫帳戶僅限於存儲過程的執行,我通過將用戶名和散列密碼提供給返回1(true)或0(false)的存儲過程來對用戶進行身份驗證。

因此,即使您擁有應用程序的數據庫帳戶,也無法從服務器獲取密碼。這就是我喜歡這個解決方案。但爲了使用它,客戶必須通過網絡提交他的密碼,或者至少可以捕獲一個靜態散列。

所以我就用握手這樣的想法:

  • 客戶端請求服務器鹽。
  • 隨機鹽給客戶端並存儲在服務器上爲這個單一客戶端。
  • 客戶端發出哈希(鹽+密碼),然後返回這個哈希服務器
  • 服務器使得哈希(鹽+密碼),並檢查自己的相同,然後從客戶端

使用此握手使得它可以檢查密碼不發送它或它的靜態哈希。只是一個動態的哈希散列,每次用戶登錄時都是不同的=>高度安全。

但是,對於這種握手,我需要密碼或至少從數據庫散列的密碼。但是,這使得某人至少可以獲得哈希密碼並將其暴露在應用程序之外。

你更喜歡什麼?在DB內部保存密碼並在那裏做任何事情(安全服務器),或者從DB中取出密碼並在外部進行(安全傳輸)?

由於提前, 商標

回答

3

你提出的解決方案並不能真正解決問題。然而,服務器必須知道密碼,所以它必須在某個時刻以簡單的方式傳送,這正是你想要首先避免的。這樣您每次只能避免重新發送密碼,但是如果有人在第一次轉移密碼時發現密碼?

我認爲你不應該重新發明輪子:-)對所有連接使用SSL,然後你的第一個解決方案正常工作。你甚至可以在客戶端執行哈希,所以只有哈希通過安全通道發送。你的服務器永遠不會知道密碼,也不需要。

+1

同意,SSL應該足夠安全。當然也可以在數據庫中散列密碼,儘管現在MD5已經被懷疑了,所以我可以使用更安全的散列算法來做到這一點。您建議的握手過程與MS-CHAP類似,這也是可疑的。 – 2010-05-20 14:40:23

+0

你是對的,但我認爲這個密碼被嗅探的可能性小於用戶登錄後的數百或數千次中的一次。我的連接是SSL nether更少,我只是想要一些額外的安全。現在我使用SHA1哈希構建的FormsAuthentications,但是我需要在另一個地方使用SHA-256,所以我想我會切換到這個。 你認爲存儲過程GetUser應該返回哈希密碼?或者只是返回null而不是? – Marks 2010-05-20 16:22:32

+1

當你談論「安全」時,你總是假設一種最壞的情況。你認爲攻擊者總是存在並且利用你的系統中的每一個弱點,並且最大的有效性。從這個意義上說,他是否可以讀取你的密碼一次或一百次都沒關係,事實上他可以讀取它。您的客戶不希望聽到您說「攻擊者讀取密碼的可能性不大」:-) 您的存儲過程是否返回哈希或「null」取決於您,應該使用其他方式保護服務器無論如何阻止遠程訪問(防火牆,安全補丁,...) – 2010-05-21 11:13:52