2010-03-02 68 views
16

我希望用戶能夠在我的網站上選擇一個「記住我」框,以便他們每次來都不需要登錄。所以,我需要在cookie中存儲一個唯一的ID來標識它們。使用sha512和PHP中的長鹽對他們的密碼進行哈希是安全的,並將該值存儲在cookie中? 如果cookie被盜,他們的密碼會有風險嗎? 顯然它必須以某種方式連接到他們的密碼,否則如果cookie值被猜測或被盜,用戶將無法阻止其他人登錄。建議在cookie中存儲散列密碼?

此外,是否建議使用GUID唯一標識符?

感謝, 本

+4

你不需要存儲密碼來「記住」用戶,是嗎? – 2010-03-02 04:17:21

+0

@ o.k.w:它用於重新認證用戶。 – Gumbo 2010-03-02 08:00:21

回答

3

有一個很好的算法和大型鹽低風險,但爲什麼採取任何不必要的風險?

如果你只需要識別用戶,然後存儲一些可以唯一標識用戶的東西,像guid以及其他一些存儲的驗證碼(不是他們的密碼,一些隨機的長字符串)。我不會單獨使用guid,因爲它不是一種安全的身份驗證方法。

+0

建議在/更改密碼時刪除或修改此「隨機長字符串」,以免用戶(或具有上述cookie的人員)在密碼更改後一段時間提供這樣的cookie(或用戶取消選擇記住我,或者...) – mjv 2010-03-02 04:24:09

+4

「隨機長字符串」應該比密碼更改時更頻繁地過期,理想情況是在每次登錄時。 – 2010-03-02 04:28:49

+1

字符串指向用戶。它與認證無關。你可以刪除它,只要你想過期的緩存憑據,這是不是真的與更改密碼相關。 – 2010-03-02 04:29:22

21

請記住,密碼的散列與其密碼實際上是相同的。有人偷走了哈希將有相同的權限訪問用戶的帳戶,就好像他們盜用了密碼一樣。因此,建議將而不是存儲在cookie中,除非存儲有與用於認證的cookie(即2因素認證)一起存儲的一些其他信息而不是

+0

+1,否則最初甚至將密碼散列在哪裏呢?它旨在延緩攻擊者! – rook 2010-03-02 07:37:42

+2

我想知道爲什麼有人投票拒絕這個答案。 – Gabe 2010-03-02 09:20:30

+0

這當然假設攻擊者知道使用了什麼哈希算法以及是否涉及鹽......仍然不可取 – zzzzBov 2010-12-09 22:03:30

2

在cookie中加入用戶ID(以防止用戶將uid更改爲另一個用戶的uid),不會傷害到cookie中的某種「密碼」,只是不要使「密碼」成爲與實際用戶的密碼相同。

只是因爲它是一個散列並不一定意味着它是單向的(好吧,根據定義,它確實存在,但有實用程序可以生成MD5明文,我猜這只是一個時間問題,纔會發生在其他人身上)。我會散列某種二級密碼。

12

Here是關於這個話題的優秀文章。您的問題的許多答案都是按照其中列出的技術進行的。

+0

謝謝Chris,那真的是一篇很棒的文章 – 2011-08-09 16:18:53

2

這樣做的另一種方法可能是將cookie用作僅用於間接數據的加密存儲。您需要某種未加密的標識符作爲指向應用程序數據庫中的密鑰(或派生密鑰所需的信息)的指針,然後是由標識符獲得的密鑰加密的blob,該標識符本身將包含某種一次性可用的身份驗證會話的標識符。

考慮以下假設:

  • 你的數據庫是安全的(例如,您的應用程序可以訪問它,但你的用戶不能直接這樣做,而且還假設應用程序已經校對針對SQL注入)
  • 你的鹽很濃;即相當高的熵,試圖破解鹽漬密碼是不可行的,即使密碼是已知的

然後這將提供一種方法,通過該方法可以合理地確定會話不能以任何方式被劫持或被盜。也就是說,複製的cookie僅具有有限的用處,因爲用戶不能在被盜用和被攻擊者使用之間使用cookie。

雖然這樣可以防止重放,但這也意味着如果有人設法在恰當的時間竊取cookie,並且管理它也在原始的合法用戶使用之前使用它,攻擊者現在控制着會話。可以將會話限制爲IP地址以降低該風險(某種程度上,如果用戶和攻擊者都在相同的NAT後面(這是任何家庭或中小型企業網絡中最有可能發生的情況),那麼這一點是非常沒有意義的,因爲無論如何IP地址看起來都是一樣的。對於當前的用戶代理也是有用的(儘管如果用戶更新他們的瀏覽器並且會話在瀏覽器關閉時沒有過期,它可能會意外中斷),或者找到某種方法來識別用戶所在的計算機只需要足夠好,以確保用戶沒有將cookie從一個系統移到另一個系統。在使用一些二進制插件(Flash或Silver/Moonlight)之後,我不確定後者是否可行。

爲了防止永久會話劫持,要求用戶定期重新驗證自己(例如,限制允許的會話生存期或需要類似令牌/ FOB /加密狗的東西)並要求用戶重新驗證他 - 或自己進入應用程序的敏感區域,例如密碼更改和潛在危險的操作,模式或行爲(如刪除數據,異常使用模式,批量操作等)。

很難確保應用程序的安全性並保持其易用性。如果仔細做好,安全性可以以最低限度侵入性但仍然有效的方式實施 - 無論如何,對於大多數面向互聯網的應用程序。