SpringSecurity-12-PasswordEncoder密碼加密簡介
為什么密碼加密?
國內的每一個開發(fā)社區(qū)在2011年發(fā)生過被黑客攻擊忘渔,盜取用戶信息舔腾,600多萬的明文密碼信息被盜取,大量用戶面臨著數據隱私泄露和數據安全的威脅甚纲。這警告了我們库正,一旦被黑客攻擊用戶賬號信息被盜曲楚,我們該如何減少用戶的損失,在我們開發(fā)者角度來看就是如何使得用戶的賬號密碼變得安全褥符。怎么讓用戶的密碼變得安全呢龙誊?那就是要對用戶的密碼存儲進行加密。
MD5加密
MD5信息摘要算法属瓣,是一種密碼散列函數
载迄,可以生成一個128(16字節(jié))的散列值,用于保證信息傳輸的一致性抡蛙。但是MD5加密是不安全的护昧,現在可以很輕松進行解密。舉例說明不安全性粗截。
- 在mysql控制臺輸入md5的加密惋耙,sql如下
SELECT?MD5(123456)
密碼加密后數據
- 通過MD5加密以后,我們隨便找一個MD5解密的網站例如https://www.cmd5.com/熊昌,輸入加密后的密碼進行解密后就可以得到原始密碼
SpringSecurity的PasswordEncoder
SpringSecurity內置的密碼加密機制绽榛,使用的時候只需要PasswordEncode接口即可
public?interface?PasswordEncoder?{
?String?encode(CharSequence?rawPassword);
?boolean?matches(CharSequence?rawPassword,?String?encodedPassword);
?default?boolean?upgradeEncoding(String?encodedPassword)?{
??return?false;
?}
}
PasswordEncoder接口有三個方法:
String encode(CharSequence rawPassword)一般在用戶注冊和修改密碼的時候使用
- rawPassword參數表示的是原始密碼
- 輸出的String類型數據是加密后的不可被逆向的hash值,
boolean matches(CharSequence rawPassword, String encodedPassword)用于校驗輸入密碼和加密和的密碼是否匹配
boolean upgradeEncoding(String encodedPassword)方法用意是在判斷密碼是否需要重新加密?true表示需要婿屹,false表示不需要灭美。
SpringSecurity的加密實現
SpringSecurity的加密實現實際上就是去實現PasswordEncoder,具體實現有如下
我們一般使用BCryptPasswordEncoder進行密碼加密昂利,它是一種鹽加密(不了解鹽加密的可以自行百度)届腐,我們測試以下鹽加密和MD5加密有何不同,具體代碼如下
@SpringBootTest
class?SpringSecurityLearn8ApplicationTests?{
????@Test
????void?contextLoads()?{
????????String?md5_one?=?DigestUtils.md5DigestAsHex("123456".getBytes());
????????String?md5_two?=?DigestUtils.md5DigestAsHex("123456".getBytes());
????????BCryptPasswordEncoder?encoder?=?new?BCryptPasswordEncoder();
????????String?password_one?=?encoder.encode("123456");
????????String?password_two?=?encoder.encode("123456");
????????System.out.println("md5_one:?"?+?md5_one);
????????System.out.println("md5_two:?"?+?md5_two);
????????System.out.println("password_one:?"?+?password_one);
????????System.out.println("password_two:?"?+?password_two);
????}
}
控制臺輸出結果如下,我們發(fā)現MD5加密兩次加密結果一樣蜂奸,因此很容易就可以進行解密犁苏,但是BCryptPasswordEncoder的兩次加密的結果不一樣,因此是不可逆加密扩所。
md5_one:?e10adc3949ba59abbe56e057f20f883e
md5_two:?e10adc3949ba59abbe56e057f20f883e
password_one:?$2a$10$tB9sjNF3ktIIzg9PQ8CaduauX3rRh7zsFADesQl2oXvmZ150xKZGS
password_two:?$2a$10$c1vMF3CVEw1ggwpPrH9KD.qq2mw2GVW8Tnq5f7XsC/6X6a67yTJjS
這就是BCryptPasswordEncoder加密的特性围详,每次加密產生一個隨機鹽,然后每次加密產生不同結果祖屏。
Bcrypt有四個變量:
- saltRounds:正數助赞,表示哈希雜湊次數买羞,數值越高越安全,默認10次
- password:明文密碼
- slat:鹽嫉拐,一個128bits的隨機字符串哩都,長度為22字符
- hash:精美Bcrypt加密的哈希結果
Bcrypt加密后的密碼三部分,使用$分割:
- $2a表示Bcrypt算法
- 10表示哈希雜湊次數
- tB9sjNF3ktIIzg9PQ8Cadu表示隨機生成的鹽
如果您覺得本文不錯婉徘,歡迎關注,點贊,收藏支持,您的關注是我堅持的動力咐汞!
關注公眾號 springboot葵花寶典 我將持續(xù)更新盖呼,并且獲取我搜集的spingboot資料,謝謝化撕!
原創(chuàng)不易几晤,轉載請注明出處,感謝支持植阴!如果本文對您有用蟹瘾,歡迎轉發(fā)分享!