2011-12-16 114 views
1

我有一個關於cookie安全性的簡單問題,我想在執行它之前我想由stackoverflow社區運行。這將是我第一次在網站上實現用戶登錄,並且我希望對安全性非常謹慎 - 所以不必擔心賬戶被破壞。Cookie安全

這裏是我的假設的安全解決方案:

  • 用戶註冊網站(無論是通過電子郵件的註冊,與Facebook等登錄),並分配一個用戶ID號。這個號碼是公開的,可以用來訪問用戶的個人資料,在帖子中引用他們,等等。
  • 在註冊時,用戶還會被分配一個隨機生成的ROWID,因爲他們的信息存儲在數據庫中(託管在Google Fusion Tables上)。此ROWID號碼對用戶保持隱藏狀態,永不泄露。
  • 用戶ID是針對ROWID號碼加密的,此號碼存儲在用戶計算機上的cookie中。這對其他用戶來說是不可見的,理論上這隻能由用戶查看。

該解決方案將允許「祕密」密鑰(ROWID號碼),「消費者」密鑰(保存在cookie中)和公共參考ID(用戶ID)。當然,所有這些都會彙集到一個數據庫中,網站可以快速訪問它們。這聽起來像一個提供適當安全級別的計劃,還是我應該考慮的其他事情?

回答

5

爲了通過類似XSS的其他保護措施防止cookie盜用,您可能需要考慮爲每個IP地址分配唯一的cookie,然後確保cookie只能從該IP地址使用。 如果您將Cookie存儲在數據庫中,事情會變得複雜,因爲您現在有多個映射到同一用戶的Cookie。

以下是如何避免這些問題:

Set-Cookie: userName=Alice; authCode=eeba95a4... 

其中:AUTHCODE = HMAC(ROWID,用戶名+ IPADDR)

當您收到此cookie,查找用戶數據庫,重新計算/使用請求的ROWID和IP地址驗證cookie中的authCode。無需在數據庫中存儲Cookie。

對於額外的加密點,扔掉salt參數到混合:

Set-Cookie: userName=Alice; salt=59843...; authCode=eeba9... 

其中:隨機地生成用於每餅乾AUTHCODE = HMAC(ROWID,用戶名+ IPADDR +鹽)

鹽值你生產。沒有必要保守祕密。

+0

謝謝!這非常有用!一般來說,我對編程還是很陌生的,所以我不知道甚至存在這樣的東西!肯定會努力實現這樣的事情! – 2011-12-31 02:22:44

1

這是一個很好的問題,既然你還沒有答案,我會放棄它。據我所知(我不是密碼專家),這似乎是合理的,至少在理論上是如此。 我看到一個問題,那就是如果一個惡意用戶獲得了用戶密鑰(並且沒有以任何方式保護),他可以嘗試強制ROWID,因爲他已經知道用戶ID。因此,在加密之前,至少應該在用戶標識中添加某種鹽。此外,「消費者」密鑰ccokie應該僅以安全方式傳遞,確保它永遠不會以未加密的連接傳播。

但這一切都取決於你計劃使用不同的鍵。

+0

這絕對聽起來像是要考慮的事情!實際上,在我發佈了這個內容並有更多時間考慮思考之後,我考慮將該用戶的用戶ID和來自注冊時間的時間戳的組合用作加密密鑰。這將(在我看來)增加了另一層安全性,因爲時間戳不會是公開信息。也許我甚至可以通過某種形式的計算來運行時間戳,以進一步防止蠻力被使用。感謝您的輸入! – 2011-12-31 02:17:51