Spring Security入門(三):密碼加密
前文導讀
Github 地址
https://github.com/ChinaSilence/any-spring-security 本文對應 security-login-db-encryptPWD
摘要
解決2個問題:
註冊時密碼加密後存入資料庫
登入時密碼加密校驗
執行程式
1、clone 程式碼
git clone https://github.com/ChinaSilence/any-spring-security.git
2、啟動應用
mvn spring-boot:run
3、登入(使用賬號 anoy 密碼 pwd,未使用密碼加密前是可以登入的)
控制檯會出現如下提示:
Encoded password does not look like
4、註冊新賬號並登入。
相關解釋說明
相比於上一個demo,在 WebSecurityConfig
中添加了如下程式碼:
/**
* 新增 UserDetailsService, 實現自定義登入校驗
*/
@Override
protectedvoid configure(AuthenticationManagerBuilder builder) throwsException{
builder.userDetailsService(anyUserDetailsService)
.passwordEncoder(passwordEncoder());
}
/**
* 密碼加密
*/
@Bean
publicBCryptPasswordEncoder passwordEncoder(){
returnnewBCryptPasswordEncoder();
}
BCryptPasswordEncoder相關知識:
使用者表的密碼通常使用MD5等不可逆演算法加密後儲存,為防止彩虹表破解更會先使用一個特定的字串(如域名)加密,然後再使用一個隨機的salt(鹽值)加密。
特定字串是程式程式碼中固定的,salt是每個密碼單獨隨機,一般給使用者表加一個欄位單獨儲存,比較麻煩。
BCrypt演算法將salt隨機並混入最終加密後的密碼,驗證時也無需單獨提供之前的salt,從而無需單獨處理salt問題。
BCryptPasswordEncoder 是在哪裡使用的?
登入時用到了 DaoAuthenticationProvider
,它有一個方法 #additionalAuthenticationChecks(UserDetails userDetails,UsernamePasswordAuthenticationTokenauthentication)
,此方法用來校驗從資料庫取得的使用者資訊和使用者輸入的資訊是否匹配。
在註冊時,對使用者密碼加密
應用 BCryptPasswordEncoder
之後,明文密碼是無法被識別的,就會校驗失敗,只有存入密文密碼才能被正常識別。所以,應該在註冊時對使用者密碼進行加密。
/**
* 加密密碼
*/
privatevoid encryptPassword(UserEntity userEntity){
String password = userEntity.getPassword();
password = newBCryptPasswordEncoder().encode(password);
userEntity.setPassword(password);
}
新使用者註冊後,資料庫中就會存入密文密碼,示例:
id | username | password | nickname | roles |
---|---|---|---|---|
5 | testpwd | $2a$10$i9fKauPB/mUh8pA2xHTzN.LSAu5pqmfEboNqK6y2NU9PxAt80hLc2 | 加密測試 | ROLE_USER |
補充說明:即使不同的使用者註冊時輸入相同的密碼,存入資料庫的密文密碼也會不同。