HTTP協(xié)議下保證登錄密碼不被獲取最健壯方式
說到在http協(xié)議下用戶登錄如何保證密碼安全這個(gè)問題:
小白可能第一想法就是,用戶在登錄頁面輸入密碼進(jìn)行登錄時(shí),前臺(tái)頁面對用戶輸入的密碼進(jìn)行加密,然后把加密后的密碼作為http請求參數(shù)通過網(wǎng)絡(luò)發(fā)到服務(wù)器。
這樣做是無法保證用戶的賬戶安全的,因?yàn)樯晕⒍稽c(diǎn)編程知識的人就可以通過你發(fā)送的http請求知道了你的密碼,小白又說了,我密碼加密了,它拿到的也是加密后的密碼,它不知道我的原始密碼它是無法從登錄頁面登錄的。
但是小白啊,你有沒有想過,有時(shí)候我僅僅知道你加密后的明文就夠了,我可以自己偽造http請求,把明文加在請求參數(shù)里面,一樣可以登錄系統(tǒng)的。
大白這時(shí)候有話說了,大白:我可以對密碼進(jìn)行加鹽。好,我們先看加鹽是什么,加鹽簡單說就是程序?qū)τ脩粼O(shè)置的原始密碼后面追加隨機(jī)數(shù)來加強(qiáng)用戶密碼的復(fù)雜性,然后再對組合后的密碼進(jìn)行加密進(jìn)行存儲(chǔ),用戶每一次登錄,前端先對用戶輸入密碼進(jìn)行加密傳輸?shù)胶蠖耍缓蠛蠖双@得用戶賬號到數(shù)據(jù)庫找到該用戶的鹽,再和傳來的明文組合一起進(jìn)行一次加密后與數(shù)據(jù)庫中的密碼進(jìn)行對比來判斷是否是符合用戶。但是啊,大白,你看,這樣做,并無法控制其他人通過你http請求獲得明文,獲得后,人家照樣大搖大擺使用你的身份登錄系統(tǒng)進(jìn)行操作。
好,大白讓我跟你講講加鹽的真正意義:加鹽的意義不是為了保證密碼在網(wǎng)絡(luò)傳輸?shù)陌踩?,而是防止?shù)據(jù)庫被人入侵后,由于原始密碼太過簡單,被人分析出來,進(jìn)而知道了密碼。直接對密碼進(jìn)行MD5處理后,反向解密確實(shí)難度很大,但還是可以找出破綻的 例如:兩個(gè)人或多個(gè)人的密碼相同,通過md5加密后保存會(huì)得到相同的結(jié)果。破一個(gè)就可以破一片的密碼。如果用戶可以查看數(shù)據(jù)庫,那么他可以觀察到自己的密碼和別人的密碼加密后的結(jié)果都是一樣,那么,別人用的和自己就是同一個(gè)密碼,這樣,就可以利用別人的身份登錄了。那么我們以前的加密方法是否對這種行為失效了呢?其實(shí)只要稍微混淆一下就能防范住了,這在加密術(shù)語中稱為“加鹽”。具體來說就是在原有材料(用戶自定義密碼)中加入其它成分(一般是用戶自有且不變的因素),以此來增加系統(tǒng)復(fù)雜度。當(dāng)這種鹽和用戶密碼相結(jié)合后,再通過摘要處理,就能得到隱蔽性更強(qiáng)的摘要值。
小黑說:你說的這些我都懂,我來告訴你最終的方案吧:在用戶輸入完賬號后,后臺(tái)ajax發(fā)送用戶的賬號到服務(wù)器,這個(gè)時(shí)候服務(wù)器為該賬號生成一個(gè)隨機(jī)數(shù)驗(yàn)證碼,響應(yīng)給前端登錄頁面。
當(dāng)用戶輸入密碼后,前端頁面對用戶輸入的密碼進(jìn)行加密,然后把加密后的明文和獲得服務(wù)器返回的驗(yàn)證碼組合在一起再一次進(jìn)行加密。然后把該信息發(fā)送到服務(wù)器,服務(wù)器session中保存這這個(gè)賬號的驗(yàn)證碼,服務(wù)器會(huì)從數(shù)據(jù)庫獲取該用戶的密碼和驗(yàn)證碼進(jìn)行組合再次加密與前端傳來的明文進(jìn)行對比判斷。
好,接著讓我們分析為什么安全,因?yàn)轵?yàn)證碼是一次性的,, 所以,你在網(wǎng)絡(luò)層拿到本次的請求之后,無法做 重放攻擊, 因?yàn)轵?yàn)證碼是不正確的.而當(dāng)你獲取新的驗(yàn)證碼, 但你并不知道 組合之前的內(nèi)容[md5(md5(密碼) + 用戶的QQ號)] 是什么 , 所以你無法重新發(fā)送本次請求實(shí)現(xiàn)登陸的目的.32位MD5 + 4位驗(yàn)證碼 總計(jì) 36位的字符串, 你去破解吧. 估計(jì)等你掛了你也破解不出來.至于服務(wù)端的校驗(yàn), 只要將記錄下來的MD5值(而不是記錄的明文), 進(jìn)行同樣的運(yùn)算, 得到的結(jié)果與提交上來的一樣, 即密碼正確.驗(yàn)證碼的內(nèi)容是服務(wù)器下發(fā)的,而且是一