2010-02-02 68 views
1

我有一個網站(其基本要點描述在this question),我想有一些方法可以在用戶使用網站(即上傳和下載數據)時一直存儲用戶名和用戶信息。我應該如何管理用戶名/密碼會話信息?

現在,如果登錄成功,我將返回密碼的散列以及任何相關信息。任何時候用戶嘗試一些東西,他們的用戶名,散列等都必須與數據庫中的內容相匹配。如果用戶註銷,他們的本地Sinatra會話將刷新所有信息。

我意識到這是一種非常幼稚的做法。有沒有更好的方法來處理用戶會話信息?關於cookie的維基百科條目提到使用會話uid而不是其他信息;這種方法的優點是什麼?我懷疑這種方法也容易受到其他攻擊的影響,但是由於我對所做的所有事情都進行了驗證,所以我不確定自己打開的是什麼樣的攻擊。另外,如果/當我執行ssl時,這些事務是否會'自動'加密,還是我需要做其他事情來確保字符串受到保護,如果它們需要的話?

回答

4

這實際上是一個非常複雜的問題。只是爲了說明,您存在帳戶鎖定問題:如果基於失敗的嘗試鎖定,攻擊者對您的網站的DOS有多容易?

我將列出一些最佳實踐,讓您開始:

  1. 存儲密碼鹹魚和散列旁邊的用戶名和用戶ID。 (你也應該存儲旁邊散鹽。)

  2. 不允許頻繁錯誤密碼嘗試。 (每幾秒更頻繁一次)。

  3. 如果嘗試失敗的任何給定的用戶或任何給定的IP地址(一個微小的3倍以上)需要某種形式的人類驗證的,像一個CAPTCHA。這可以讓您防止總DOS攻擊。

  4. 如果實施自動登錄系統,使用令牌認證系統。

  5. 對於令牌認證系統,使用安全隨機數生成器,發送平原令牌的用戶,但鹽和散列在數據庫中的令牌

  6. 如果可能,請使用TLS/SSL,但一旦數據無線傳輸,不要依賴其安全性。

+0

什麼是一個好的起始鹽值?例如,我應該讓我的數據庫從當前系統時間生成一個隨機數,然後密碼密碼哈希值,然後將其作爲會話哈希值返回?下次用戶登錄時,鹽是不同的,所以哈希是不同的,但它是持久的特定登錄? – mmr 2010-02-02 04:14:34

+0

使用安全的隨機數生成器,如.NET中的'RNGCryptoServiceProvider'。您可以安全地將salt存儲在數據庫中,其中alnong位於known-hash。 – 2010-02-02 04:16:21

0

如果你的網站是在asp.net中建立的,那麼你可以使用點網絡證券..這是非常好的。你也可以使用原理類來使它更安全..

+0

我使用的是Sinatra和ruby,但對於其他asp.net開發人員來說,這是一個很好的提示。不過謝謝。 – mmr 2010-02-02 04:18:36

相關問題