如何設計一個安全的登入流程

大括號啊發表於2017-12-26

登入是系統中最重要的一個功能之一,登入成功就能擁有系統的使用權利,所以設計一個安全的登入流程是十分必要的,那在一般登入中需要考慮哪些重要因素呢?我們一一列表一下。

使用https協議進行傳輸,雖然麻煩,但是很強的保護措施。

強制使用者使用有一定強度且複雜的密碼,必須要有大小寫加數字,長度在8位以上,杜絕像123456之類的弱密碼。

密碼不要明文儲存到資料庫,CSDN當年使用明文儲存密碼導致使用者密碼被完全暴露,這個事件影響十分嚴重。所以造成不要使用明文儲存密碼,要使用像MD5之類的雜湊演算法加密儲存,加密之前密碼同時還要加上一個不固定的salt值一起拼接加密,一般md5(md5(password) + salt)就可以了,這個salt是鹽,一起加密增加密碼的長度也增加了破解的難度,鹽一般設計為64位隨機生成的字串,最好分開存放,假如使用者資訊庫被攻擊了黑客也拿不到鹽的庫。不能使用可逆的演算法,如果可逆,那如何儲存金鑰是個非常棘手的問題,一般使用明文加密與資料庫中的密文對比就能確定密碼正確與否,我們不需要知道使用者的明文是什麼,如果使用者忘了可以通過重置或者密碼保護問題修改密碼,這也比總明文儲存要好一萬倍。

MD5現在已經不是十分安全了,最好使sha256,sha512之類安全強度更高的雜湊加密演算法。

使用者名稱密碼錯誤不要單方面提示,如果密碼錯誤提示使用者說密碼錯誤這樣攻擊者就知道使用者名稱是對的,下次攻擊密碼,所以不管是使用者名稱還是密碼錯誤都給出同樣的提示:使用者名稱或密碼錯誤,或者別的不具體的提示的錯誤都可以。

前端禁止使用者輸入導致sql注入的字元,後臺也要做sql注入的防護。

儲存歷史密碼,一段時間沒登入的使用者再次登入時提示要修改密碼才能登入,這時新密碼不能和歷史密碼一樣,蘋果就是這麼做的。

儲存每次的登入資訊日誌,如果登入的IP與以往有很大差別,要引導使用者重置密碼方可登入。

不要在cookie中保留使用者密碼,如果一定要使用cookie實現自動登入,切記不要使用簡單的使用者名稱+密碼MD5儲存到cookie,要把使用者ID、使用者名稱、過期時間、IP、不固定的salt等一起考慮進去,這個當然要可逆,服務端要進行解密才能難是否使用者自動登入有效。另外,cookie要設定為http only,這樣就不能通過指令碼訪問cookie,保證cookie的安全性。

不要讓瀏覽器記住密碼,雖然記住密碼很方便,但也不安全,所以前端最好做控制。

一段時間類的嘗試登入失敗次數達到某個值,要鎖定使用者登入,如失敗5次鎖定24小時。或者間隔性鎖定,如失敗3次後鎖定半小時,再失敗1次鎖定1小時,再失敗1次鎖定24小時。

設定會話有效期,比如登入後10分鐘不操作就失效,要重新登入。

驗證碼使用,加上干擾線,防止計算機能夠輕易識別,這樣也可以防止黑客以程式的方式來嘗試登入。

手機登入的一般使用簡訊驗證碼的,控制驗證碼的時效性,即驗證碼一次有效,一分鐘內只能傳送一次。

有必要的要採用單點登陸,如果允許使用者多處登入的要給使用者安全提醒。

重置密碼最好通過郵箱傳送一定時間內生效的重置連結,或者手機簡訊驗證碼,或者兩者相結合的方法。像一般的大公司都有設計一個動態密碼的東西,手機即一切,所以也要妥善保管自己的動態加密的APP,最好加上指紋或手勢。

設定使用者可以登入的IP,即IP白名單。像比如財務系統,限制財務人員只能在辦公室登入系統。

先總結到這,沒有真正安全的登入機制,正所謂道高一尺魔高一丈,我們要做到與時俱進。


相關文章