自動登入的設計思路

hipilee發表於2017-12-07
       很多網站登入的時候,都會有一個“記住我”功能,使用者可以在限定時間段內免登入,比如豆瓣、人人、新浪微博等都有這種設計。這種技術其實就是基於 cookie的自動登入,使用者登入的時候會把需要驗證的token寫到cookie裡面,當使用者session失效的時候,token會通過cookie 傳送給伺服器端,伺服器端解析token判斷是否已經登入;
       這裡面的token如何設計是關鍵,到底存什麼資料才能保證系統的安全性呢?有些新手可能會想,把使用者id和password直接md5加密存到cookie,這樣做是最糟糕的設計,使用者的敏感資訊直接暴露出來,黑客可以偽造別人的id進行嘗試性登入,可以想象黑客知道了管理員許可權賬號的id,試過幾千幾萬次,密碼和加密演算法很可能破解出來。token要相對安全,不應該是簡單的使用者名稱和密碼md5加密,使用者密碼其實完全可以不用存進去,分兩步來做:

----token 是一些資訊的組合,使用者id+使用者名稱+expires過期時間+ip地址+salt,具體加密演算法最好自己寫,不能使是常見的加密函式(md5),當然這 個加密函式必須可逆,這個token我們同時要儲存在使用者表資料庫裡面,set cookie的時候記得http only; 

----伺服器端拿到cookie之後,進行逆解析,

這個時候我們要驗證如下資訊:cookie是否過期、ip地址是否發生變化、使用者id和使用者名稱是否存在;
使用者 存在之後,我們再拿這個token跟第一步存在資料庫中的token進行比較,
看是否相等,如果不等說明token已經過期,這樣做可保證每次使用者登入之 後token值都不一樣,
之前用過的token都會失效;


所謂加Salt,就是加點“佐料”。當使用者首次提供密碼時(通常是註冊時),由系統自動往這個密碼里加一些“Salt值”,這個值是由系統隨機生成的,並且只有系統知道。然後再雜湊。而當使用者登入時,系統為使用者提供的程式碼撒上同樣的“Salt值”,然後雜湊,再比較雜湊值,已確定密碼是否正確。   

這樣,即便兩個使用者使用了同一個密碼,由於系統為它們生成的salt值不同,他們的雜湊值也是不同的。即便黑客可以通過自己的密碼和自己生成的雜湊值來找具有特定密碼的使用者,但這個機率太小了(密碼和salt值都得和黑客使用的一樣才行)。

相關文章