記住密碼”功能的正確設計

nicenelly發表於2017-11-22

這個功能簡直就是一個安全隱患,我覺得並不是所有的程式設計師都知道怎麼設計這個事。一般的設計
是——一時使用者勾選了這個功能,系統會生成一個cookie,cookie包括使用者名稱和一個固定的雜湊值,這個固定的雜湊值一直使用。這樣,你就可以在所有的裝置和客戶上都可以登入,而且可以有多個使用者同時登入。這個並不是很安全。下面是一些更為安全的方法供你參考:

1)在cookie中,儲存三個東西——使用者名稱登入序列登入token

使用者名稱:明文存放。
登入序列:一個被MD5雜湊過的隨機數,僅當強制使用者輸入口令時更新(如:使用者修改了口令)
登入token:一個被MD5雜湊過的隨機數,僅一個登入session內有效,新的登入session會更新它

2)上述三個東西會存在伺服器上,伺服器的驗證使用者需要驗證客戶端cookie裡的這三個事。

3)這樣的設計會有什麼樣的效果,會有下面的效果,

a)登入token是單例項登入。意思就是一個使用者只能有一個登入例項。

b)登入序列是用來做盜用行為檢測的。如果使用者的cookie被盜後,盜用者使用這個cookie訪問網站時,我們的系統是以為是合法使用者,然後更新“登入token”,而真正的使用者回來訪問時,系統發現只有“使用者名稱”和“登入序列”相同,但是“登入token
不對,這樣的話,系統就知道,這個使用者可能出現了被盜用的情況,於是,系統可以清除並更改登入序列 登入token,這樣就可以令所有的cookie失效,並要求使用者輸入口令。並給警告使用者系統安全。

4)當然,上述這樣的設計還是會有一些問題,比如:同一使用者的不同裝置登入,甚至在同一個裝置上使用不同的瀏覽器保登入。一個裝置會讓另一個裝置的登入token登入序列失效,從而讓其它裝置和瀏覽器需要重新登入,並會造成cookie被盜用的假象。所以,你在伺服器服還需要考慮- IP
地址

a)
如果以口令方式登入,我們無需更新伺服器的“登入序列”和 “登入token”(但需要更新cookie)。因為我們認為口令只有真正的使用者知道。

b)
如果 IP相同 ,那麼,我們無需更新伺服器的“登入序列”和 “登入token”(但需要更新cookie)。因為我們認為是同一使用者有同一IP(當然,同一個區域網裡也有同一IP,但我們認為這個區域網是使用者可以控制的。網咖內並不推薦使用這一功能)。

c)
如果
IP不同 && 沒有用口令登入),那麼,“登入token
就會在多個IP間發生變化(登入token在兩個或多個ip間被來來回回的變換),當在一定時間內達到一定次數後,系統才會真正覺得被盜用的可能性很高,此時系統在後臺清除“登入序列”和“登入token“,讓Cookie失效,強制使用者輸入口令(或是要求使用者更改口令),以保證多臺裝置上的cookie一致。

我覺得這是一種不錯的方案,cookies被盜的假象甚至可以“弄巧成拙”地實現——QQ的後來登入使用者擠掉之前的登入使用者這樣的功能。

本文轉載自:http://coolshell.cn/articles/5353.html(你會做Web上的使用者登入功能嗎)


原文釋出時間為:2011-12-25
本文來自雲棲社群合作伙伴CSDN部落格,瞭解相關資訊可以關注CSDN部落格。


相關文章