作者-上善若水
首先介紹我所考慮使用的MD5 + Salt方案的具體設計:
數據庫中不應該存儲密碼明碼應該是一個基本安全常識,通常的方案是采用MD5算法對密碼進行Hash,再存入數據庫,從而避免數據庫泄露之后,用戶的敏感數據也隨之泄露,但是隨著時間發(fā)展,人們存儲的MD5的字典已經越來越龐大,對于一些弱口令(例如12345678、passw0d,不足夠長的純數字或字母串),即便是在不可逆算法MD5 Hash過后再入庫,對于擁有字典的人而言,仍然與明文無異,對于有經驗的人而言,可能看到25d55ad283aa400af464c76d713c07ad,腦子里就已經浮現了12345678這串數字了。于是對密碼加Salt的想法就孕育而生,如果說用戶自己設定的密碼很簡單,那么不妨讓系統(tǒng)來幫他進行加強,而Salt就是在原來的密碼上加的那一點“佐料”,只要能夠保證無論曾經的密碼多么簡單,只要加完Salt之后,字典中就無法直接找到這個Hash對應的原文,那么這個方案就算是成功了。
首先,用戶數據庫我們需要兩個字段:
psw_hash:用來存儲Hash過后的密碼 psw_salt:用來存儲幫助Hash的的附加串
在加入這兩個字段后,我們來考慮兩個情景:
第一個情景就是注冊(或是修改密碼)的時候, 第二個情景是驗證的時候,這兩個情景的流程如下圖所示:
左側是情景一的圖示,右側是情景二的圖示,由于在數據庫中不存儲密碼的明文,同時采用了每個用戶一種單獨Salt的方案,在數據庫被攻破后,竊密者必須付出極大的成本才可能破解出用戶的密碼明文,并且方法只能是為每種Salt都重新建立一份字典,在這樣的成本下,我們可以認為這種方案是非常安全的。
基于laravel做password+salt驗證算法可參考http://blueve.me/archives/898?utm_source=tuicool&utm_medium=referral