我希望用戶能夠在我的網站上選擇一個「記住我」框,以便他們每次來都不需要登錄。所以,我需要在cookie中存儲一個唯一的ID來標識它們。使用sha512和PHP中的長鹽對他們的密碼進行哈希是安全的,並將該值存儲在cookie中? 如果cookie被盜,他們的密碼會有風險嗎? 顯然它必須以某種方式連接到他們的密碼,否則如果cookie值被猜測或被盜,用戶將無法阻止其他人登錄。建議在cookie中存儲散列密碼?
此外,是否建議使用GUID唯一標識符?
感謝, 本
我希望用戶能夠在我的網站上選擇一個「記住我」框,以便他們每次來都不需要登錄。所以,我需要在cookie中存儲一個唯一的ID來標識它們。使用sha512和PHP中的長鹽對他們的密碼進行哈希是安全的,並將該值存儲在cookie中? 如果cookie被盜,他們的密碼會有風險嗎? 顯然它必須以某種方式連接到他們的密碼,否則如果cookie值被猜測或被盜,用戶將無法阻止其他人登錄。建議在cookie中存儲散列密碼?
此外,是否建議使用GUID唯一標識符?
感謝, 本
有一個很好的算法和大型鹽低風險,但爲什麼採取任何不必要的風險?
如果你只需要識別用戶,然後存儲一些可以唯一標識用戶的東西,像guid以及其他一些存儲的驗證碼(不是他們的密碼,一些隨機的長字符串)。我不會單獨使用guid,因爲它不是一種安全的身份驗證方法。
建議在/更改密碼時刪除或修改此「隨機長字符串」,以免用戶(或具有上述cookie的人員)在密碼更改後一段時間提供這樣的cookie(或用戶取消選擇記住我,或者...) – mjv 2010-03-02 04:24:09
「隨機長字符串」應該比密碼更改時更頻繁地過期,理想情況是在每次登錄時。 – 2010-03-02 04:28:49
字符串指向用戶。它與認證無關。你可以刪除它,只要你想過期的緩存憑據,這是不是真的與更改密碼相關。 – 2010-03-02 04:29:22
在cookie中加入用戶ID(以防止用戶將uid更改爲另一個用戶的uid),不會傷害到cookie中的某種「密碼」,只是不要使「密碼」成爲與實際用戶的密碼相同。
只是因爲它是一個散列並不一定意味着它是單向的(好吧,根據定義,它確實存在,但有實用程序可以生成MD5明文,我猜這只是一個時間問題,纔會發生在其他人身上)。我會散列某種二級密碼。
這樣做的另一種方法可能是將cookie用作僅用於間接數據的加密存儲。您需要某種未加密的標識符作爲指向應用程序數據庫中的密鑰(或派生密鑰所需的信息)的指針,然後是由標識符獲得的密鑰加密的blob,該標識符本身將包含某種一次性可用的身份驗證會話的標識符。
考慮以下假設:
然後這將提供一種方法,通過該方法可以合理地確定會話不能以任何方式被劫持或被盜。也就是說,複製的cookie僅具有有限的用處,因爲用戶不能在被盜用和被攻擊者使用之間使用cookie。
雖然這樣可以防止重放,但這也意味着如果有人設法在恰當的時間竊取cookie,並且管理它也在原始的合法用戶使用之前使用它,攻擊者現在控制着會話。可以將會話限制爲IP地址以降低該風險(某種程度上,如果用戶和攻擊者都在相同的NAT後面(這是任何家庭或中小型企業網絡中最有可能發生的情況),那麼這一點是非常沒有意義的,因爲無論如何IP地址看起來都是一樣的。對於當前的用戶代理也是有用的(儘管如果用戶更新他們的瀏覽器並且會話在瀏覽器關閉時沒有過期,它可能會意外中斷),或者找到某種方法來識別用戶所在的計算機只需要足夠好,以確保用戶沒有將cookie從一個系統移到另一個系統。在使用一些二進制插件(Flash或Silver/Moonlight)之後,我不確定後者是否可行。
爲了防止永久會話劫持,要求用戶定期重新驗證自己(例如,限制允許的會話生存期或需要類似令牌/ FOB /加密狗的東西)並要求用戶重新驗證他 - 或自己進入應用程序的敏感區域,例如密碼更改和潛在危險的操作,模式或行爲(如刪除數據,異常使用模式,批量操作等)。
很難確保應用程序的安全性並保持其易用性。如果仔細做好,安全性可以以最低限度侵入性但仍然有效的方式實施 - 無論如何,對於大多數面向互聯網的應用程序。
你不需要存儲密碼來「記住」用戶,是嗎? – 2010-03-02 04:17:21
@ o.k.w:它用於重新認證用戶。 – Gumbo 2010-03-02 08:00:21