場景:
某個App使用手機號注冊并設(shè)置密碼,成功后該用戶即開戶成功。我們登錄密碼傳輸?shù)胶笈_基本上都使用md5處理。但是僅僅簡單的md5對于那些簡單的密碼(比如123456)還是容易破解,所以我們一般還會加鹽處理。
第一種情況:前端,app端都使用一個固定的鹽(定義一個很復(fù)雜的字符串,還可以將該字符串先md5后的值當(dāng)作鹽),這種處理確實已經(jīng)非常安全了,但是會不會就完美了呢?NO,使用固定的鹽那么不同的用戶如果設(shè)置的密碼相同(比如明文:123456),那么在數(shù)據(jù)庫中存儲的密文就會是一樣的,那么公司內(nèi)部管理數(shù)據(jù)庫的人,假如他也使用的密碼是123456,那么他就可以使用他的密文去數(shù)據(jù)庫去查找有沒有其他用戶的密文跟他的相同,如果有就說明該用戶跟他一樣設(shè)置的都是123456。
第二種情況:上面第一種情況分析可知md5的鹽首先要盡可能的復(fù)雜一點,二每個用戶使用的鹽最好是唯一的,不相同的。那么簡單點很多app都是用的手機號碼當(dāng)作登錄賬號,手機號碼絕對是唯一的可以很好的滿足前面的需求,那就用手機號碼(即登錄賬號)先md5得到的值當(dāng)作鹽。是不是又完美了呢? NO, 使用這種方式可能會遇到下面的問題:
??????????? 問題:app上一定有更換手機號的功能,一般更換手機號操作都是輸入舊手機號,發(fā)短信,輸入新號碼,再輸入登錄密碼(用舊手機號當(dāng)鹽值加密處理),然后提交到后臺校驗這4要素。這里就有問題了,這4個參數(shù)檢驗成功了,賬號就換了,以后就再也不可能登錄成功了。
?????????? 分析:假設(shè)原來的手機號132****??? 設(shè)置的登錄密碼 123456,更換的新號碼為187****
首先? : ?????????????? md5( md5(132***) + "123456" )? = abcd****(真實的肯定不是這個值,暫當(dāng)作這個值)
換手機號后:? ??? md5( md5(187***) + "123456" )? = qwer****(反正和之前的一定不相同的)
發(fā)現(xiàn)問題了吧,你還能登錄才怪呢!!!
那如何解決這個問題?
我們在更換手機號那里再穿一個參數(shù),因為現(xiàn)在頁面本來就已經(jīng)輸入了新手機號,那么我們可以將用新手機號作鹽的到的登錄密碼md5值也傳進(jìn)去,那么后臺開始在比對以前的登錄密碼md5值一致后,就將數(shù)據(jù)庫中存的登錄密碼替換成這個新的就ok了!