登陸驗證之密碼處理

如今的應用系統中,大部分密碼存儲都是採用md5加密後存儲,經常使用的登陸基本流程以下:
  一、前端web頁面用戶輸入帳號、密碼,點擊登陸。
  二、請求提交以前,web端首先經過客戶端腳本如javascript對密碼原文進行md5加密。
  三、提交帳號、md5以後的密碼
  四、請求提交至後端,驗證帳號與密碼是否與數據庫中的一致,一致則認爲登陸成功,反之失敗。
 
上述流程看似安全,認爲傳輸過程當中的密碼是md5以後的,即便被監聽截取到,因爲md5的不可逆性,密碼明文也不會泄露。其實否則!監聽者無需解密出密碼明文便可登陸!監聽者只需將監聽到的url(如:http://****/login.do?method=login&password=md5以後的密碼&userid=登陸帳號)重放一下,便可冒充你的身份登陸系統。
 
較安全的登陸流程
  一、進入登錄頁面時,生成一個隨機碼(稱之爲鹽值),在客戶端頁面和session中各保存一份。
  二、客戶端提交登陸請求時,將md5以後的密碼與該隨機碼拼接後,再次執行md5,而後提交(提交的密碼=md5(md5(密碼明文)+隨機碼))。
  三、後端接收到登陸請求後,將從數據庫中查詢出的密碼與session中的隨機碼拼接後,md5運算,而後與前端傳遞的結果進行比較。
 
該登陸方式,即便登陸請求被監聽到,回放登陸URL,因爲隨機碼不匹配(監聽者的session中的隨機碼與被監聽者的session中的隨機碼相同機率可忽略),沒法登陸成功。
 
該登陸方式,因爲傳輸的密碼是原密碼md5以後與隨機碼再次md5以後的結果,即便監聽者採用暴力破解的方式,也很難解密出密碼明文。
 
更安全的登陸流程
  考慮到密碼輸入的方便性,好多用戶的密碼都設置的很短,而且不夠複雜,每每是6位數字字母組合,這樣的密碼md5以後保存到數據庫,一旦數據庫數據泄露,簡單密碼的md5結果很容易經過暴力破解的方式給解密出來!同時爲了方便用戶登陸的方便性,咱們的系統通常不可能要求用戶設置很長、很複雜的密碼!怎麼辦?加固定鹽值。
  一、系統設置一個固定的鹽值,該鹽值最好足夠複雜,如:1qaz2wsx3edc4rfv!@#$%^&**qqtrtRTWDFHAJBFHAGFUAHKJFHAJHFJHAJWRFA
  二、用戶註冊、修改密碼時,將用戶的原始密碼與咱們的固定鹽值拼接,而後作md5運算。
  三、傳遞至後端,保存進數據庫(數據庫中保存的密碼是用戶的原始密碼拼接固定鹽值後,md5運算後的結果)。
  四、登陸時,將用戶的原始密碼與咱們的固定鹽值進行拼接,而後作md5運算,運算後的結果再拼接上咱們的隨機碼,再次md5運算,而後提交。
  五、後端接收到登陸請求後,將從數據庫中查詢出的密碼與session中的隨機碼拼接後,md5運算,而後與前端傳遞的結果進行比較。
該登陸方式能夠認爲是很安全的登陸方式了。
 
進一步完善
一、加登陸驗證碼,可預防人爲地暴力登陸破解,爲方便合法用戶的正常登陸,可設置密碼輸入錯誤次數達到3次後再出現驗證碼。
二、帳戶鎖定,若是用戶密碼輸入錯誤次數達到必定量後(如6次),則能夠鎖定該帳號,爲了方便合法用戶的正常登陸,能夠設置成一小時後自動解鎖。
相關文章
相關標籤/搜索