更新時間:2020-10-15 來源:黑馬程序員 瀏覽量:
1、首先介紹一下常規(guī)的登錄認(rèn)證(非安全性)
·數(shù)據(jù)庫表如下所示:
<form action="index.jsp" method="post"> 賬 號:<input type="text" name="username"/><br/> 密 碼:<input type="password" name="password"><br/><br/> <input type="submit" value="提交"><br/> </form>
·用戶通過表單提交用戶名,密碼兩個字段查詢數(shù)據(jù)庫匹配,實(shí)現(xiàn)登錄認(rèn)證功能,但存在的安全隱患問題太多:
(1)數(shù)據(jù)庫密碼以明文的形式進(jìn)行存儲。
(2)數(shù)據(jù)傳輸?shù)倪^程中未對數(shù)據(jù)進(jìn)行加密處理。
2、針對以上兩個問題進(jìn)行分析和解決
·安全加密:首先對數(shù)據(jù)庫表的password字段進(jìn)行摘要md5處理,sql語句如下:
·md5加密后的數(shù)據(jù)
·數(shù)據(jù)庫密碼加密后,校驗(yàn)的邏輯就發(fā)生了些變化,需要對提交的密碼進(jìn)行加密之后再做對比,但是這樣子還是不安全。
(1)通過以上步驟,我們只對數(shù)據(jù)庫的password明文字段進(jìn)行了簡單的MD5加密,進(jìn)入http://www.cmd5.com/ 輸入加密后的密文進(jìn)行解密后可以得到明文密碼
(2)容易根據(jù)密文位數(shù)推測算法,從而使用工具破解。
(3)真實(shí)密碼相同,加密過的密碼也相同。
3、接下來我們介紹一下對其進(jìn)行加鹽處理
在表中添加一列salt字段(鹽),內(nèi)容隨意輸入23sd2,然后和原來的明文密碼123456結(jié)合,再進(jìn)行md5加密。
說明:所謂的salt字段就是一個隨機(jī)的字段,具體隨機(jī)算法就不討論了,每當(dāng)用戶注冊賬戶時,后臺就給它隨機(jī)生成一個不同的字段,然后根據(jù)password和salt字段結(jié)合進(jìn)行摘要處理,存在數(shù)據(jù)庫表中的password字段,這樣一來,原來明文都是123456生成的密文就不一樣了。
以上的步驟我們只是對數(shù)據(jù)庫進(jìn)行了加密,為了防止用戶輸入密碼在傳輸?shù)倪^程中被抓包工具獲取,我們還要在密碼傳輸?shù)倪^程中進(jìn)行加密,這樣可以使得獲取到的也是密文。
4、最后介紹下BCrypt加鹽加密
·經(jīng)過BCryptPasswordEncoder加密后的內(nèi)容,不需要專門的salt字段存儲鹽,而是在密文中。
·BCrypt密碼圖解
·Bcrypt有四個變量:
saltRounds: 正數(shù),代表hash雜湊次數(shù),數(shù)值越高越安全,默認(rèn)10次。
myPassword: 明文密碼字符串。
salt: 鹽,一個128bits隨機(jī)字符串,22字符
myHash: 經(jīng)過明文密碼password和鹽salt進(jìn)行hash
·如何校驗(yàn)正確性
在校驗(yàn)時,從密文中取出鹽salt,salt跟password進(jìn)行hash,得到的結(jié)果跟保存在DB中的hash進(jìn)行比對。
總結(jié):
·對于用戶的密碼保護(hù),數(shù)據(jù)庫對敏感的字符內(nèi)容一定要進(jìn)行加密之后存儲。
·如果只是單純的對密碼進(jìn)行加密,密碼字符一樣會導(dǎo)致加密后的內(nèi)容也一樣,會出現(xiàn)破解一個就可以破解一片的情況。
·通過對密碼加鹽(混入隨機(jī)字符拼接在密碼明文中)之后加密,可以增加系統(tǒng)復(fù)雜度,得到更強(qiáng)更安全的密文摘要值。
猜你喜歡: