2009-03-03 52 views
3

我正在構建一個網站,該網站允許用戶創建帳戶並訪問該網站的內容。我不希望用戶在每次訪問該網站時登錄,因此我打算將用戶名和密碼存儲在cookie中 - 但是,我聽說這是不好的做法,即使密碼被哈希cookie。在網站訪問之間安全地存儲憑據

我應該遵循什麼「最佳實踐」來安全記住訪問我網站之間的用戶憑據?

回答

2

千萬不要這樣做。在公開場合投入密碼。

最安全的方法:

存儲的用戶名在數據庫中,在同一行隨機生成鹽值中,同一行中的密碼,包括該鹽的散列的校驗和。對使用用戶憑證引用表的會話使用另一個表。當用戶登錄您希望會話過期的日期時(例如15天后),您可以插入會話表中。將會話ID存儲在cookie中。

下一次用戶登錄時,您將獲得密碼,爲用戶添加鹽,填充散列,將其與您擁有的密碼進行比較。如果它們匹配,則通過在會話表中插入一行並在cookie中發送會話ID來打開會話。您可以檢查用戶是否通過此cookie登錄以及它是哪個用戶。

編輯:

此方法是大多數網站上最流行的方法。它在安全和實用之間取得了良好的平衡。

您不會簡單地爲會話ID使用自動增量值。通過使用一些難以重複的複雜校驗和來製作它。例如,連接用戶名,時間戳,鹽和另一個隨機鹽,並從中創建一個md5或sha校驗和。

爲了實現涉及網站/服務中用戶憑證的功能,大多數客戶端與服務器之間的憑證都需要進行一些數據交換。這將數據暴露給中間人等中的人。另外,cookie存儲在用戶硬盤驅動器中。沒有任何方法可以100%安全。

如果你想要額外的安全性,你可以讓你的網站通過https。這將防止人們在中間人攻擊中竊取cookie和密碼。

注意:

在混合中涉及IP地址不是一個好主意。大多數情況下,多個客戶端將來自NAT上的相同IP地址等。

2

您不應該需要存儲密碼,只需要您的應用程序可以解釋爲它們的用戶的標識符。

事情你需要注意的:如果cookie被複制

  • ,將其他用戶能夠冒充該用戶
  • 用戶不應該能夠構建一個Cookie,將以另一個用戶的身份對其進行身份驗證

解決這些問題的一種可能的解決方案是爲每個用戶創建一次性密鑰,並在下一次使用該應用程序時對其進行更改。

您可能永遠無法完全安全地記住用戶,因此只有在沒有涉及敏感數據的情況下才能使用。

+0

-1,您可以使用客戶端證書來安全地標識經過身份驗證的用戶。 – 2009-03-03 14:40:45

+0

,除非證書被破壞.... – cjk 2009-03-03 15:08:31

0

在cookie中存儲用戶名的散列可以提供這種「記住我」的功能。

但是,對於系統的敏感區域,您需要知道用戶通過緩存憑據進入系統,以便您在提供用戶名/密碼提示之前讓它們造成任何實際損害。這可以作爲基於會話的標誌來保存。

1

任何形式的密碼不應存儲在cookie中。餅乾很容易被盜。

某些瀏覽器已經支持保存密碼。爲什麼不讓用戶使用它呢?