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