2011-06-07 57 views
2

我正在嘗試爲用戶編寫一個簡單的HTTP記住我的身份驗證系統。HTTP記住我的身份驗證

我的用戶可以表示爲這種

{ 
"email" : "[email protected]", 
"password" : "8EC41F4334C1B9615F930270A4F8BBC2F5A2FCD3" // sha1 hash of password 
} 

所以我的想法是,我需要建立一個cookie,具有無限(很長)的到期時間,將持有某種類型的信息,使我從數據庫讀取用戶,因此登錄用戶。

我的第一個想法是隻是簡單的存儲email:password字符串作爲一個cookie。我認爲這樣會很好,因爲沒有人能真正生成除用戶本身之外的其他類型的信息,並且我可以通過簡單比較基於數據庫內容的usernamepassword來輕鬆檢索用戶。

但是後來我覺得這不太好。它將密碼摘要轉換爲第二個密碼,該密碼存儲在清除中,並在每個請求中通過網絡傳遞。

因此,我想也許我可以在用戶每次登錄時生成一個signature,這基本上是一個隨機散列,它直接存儲在數據庫的用戶對象中。

用戶登錄後,它生成存儲的簽名,並且cookie保存此簽名。無論您何時訪問網站,網站都會檢查哪個用戶擁有該特定簽名並登錄該用戶。登出將有效地清除cookie,新登錄將生成新的隨機簽名。

此方法是否考慮到任何其他漏洞?

我知道,我也許應該使用已經爲此做了一個庫,但是這僅僅是簡單地在網絡安全性的練習。

+1

沒有用戶永遠不會信任。甚至不信任用戶。 – mauris 2011-06-07 15:21:15

回答

1

實際上,這就是大多數網站,當你登錄。是的,餅乾應保持用戶的「會話」的唯一標識符。 Cookie應該基本上是隨機的。由您決定是否使其在瀏覽器會話中保持持久性。

隨着您的身份驗證數據庫的餅乾,還可以存儲在創建條目時的時間戳。早於N秒的餅乾應視爲無效(將N設爲您的口味)。每次使用cookie時都可以重置時間戳,以便空閒會話超時。

注意,同一個用戶可能希望有多個會話(你有沒有從家裏都登錄到您的電子郵件帳戶和工作?),所以這裏這個概念真的是「會話」,而不是用戶。

+0

但是不是爲了存儲特定會話的信息而進行的會話(不是很長時間)?實現或使用會話系統僅僅是爲了記住登錄的用戶似乎相當重要。 – 2011-06-07 16:40:50

+0

「會話」可以記住你想記住的任何事情,並且無論你多長時間指定......關鍵是,如果同一用戶從多個系統登錄,你會做什麼? – Nemo 2011-06-07 17:00:00

+0

只需重新生成'簽名'。所以他們將不得不在其他電腦上重新登錄。不是一個問題。但我不認爲會議應該用於這種類型的東西...對於短期的東西,如表格,或編輯在線文檔,是的會話是偉大的,但對於*記住我*認證系統的類型,他們不' t看起來非常多才多藝...所以你會保持一個會議開放2年?這真的很低效。 – 2011-06-07 17:07:16

0

漏洞的觀點都是一樣的! Cookie竊取和相關機制,但瀏覽器現在足夠聰明,所以你不應該擔心。

第二種方法在隱私方面也很好,因爲它不包括cookie中的電子郵件地址。而且它看起來更像類似於存儲sessionID,在你的情況下,你正在生成一個隨機哈希並將其存儲在數據庫中。

但我認爲使用第一種方法會更明智一些;您可以在摘要中添加另一個圖層,並使用您的某個算法或私鑰對其進行加密;在安全的一面。

+0

將哈希密碼存儲在cookie中的問題是,如果某人能夠嗅探到您的cookie,即使您註銷,他們也可以重新登錄爲您自己。簽名的想法是,每次登錄時都會重新生成簽名,因此即使您丟失了Cookie,攻擊者也無法對其執行任何操作。 – 2011-06-07 17:15:22