這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)SpringSecurity中怎么使用MD5加密密碼,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
成都創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供新民網(wǎng)站建設(shè)、新民做網(wǎng)站、新民網(wǎng)站設(shè)計、新民網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、新民企業(yè)網(wǎng)站模板建站服務(wù),10年新民做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。
一、為什么使用加密
我們先來說一下使用加密后的密碼處理流程。我們?yōu)槭裁匆褂妹芪哪??也就是加密后的密碼呢?如果一個用戶在網(wǎng)站注冊時寫入的密碼是123456,當(dāng)他點擊保存之后,如果不加密的話,在數(shù)據(jù)庫中存的就是123456,這樣有什么不好嗎?答案是肯定的,想想12306密碼泄露導(dǎo)致用戶所有信息泄露,是用戶密碼不夠復(fù)雜嗎?可能是?但是最主要的原因是數(shù)據(jù)庫中如果使用的是明文,黑客很容易就會進行破解,而且一旦破解了一個密碼可能就會拿到一組數(shù)據(jù),為了方便大家理解,畫了張草圖:而且數(shù)據(jù)庫中密碼為123456的用戶絕對不是2個,大家可以想象后果由多可怕了嗎。。。
二、MD5+salt
其實關(guān)于這個問題上網(wǎng)就可以收集到,這里不再贅述,大家百度下概念就好,我們這里主要說在SpringSecurity中使用MD5,我們知道單純的MD5加密并不是安全的,而如果我們使用MD5加鹽的方式去對密碼進行加密,那么想要破解的話難度系數(shù)就會成倍出現(xiàn),基本上是不可能破解的。大家都知道MD5是不可逆的,也就是說加密完的密碼無法進行解密,要不然怎么會是安全的呢?那我們來看下如果使用了MD5加密的話,黑客在獲取密碼的時候會是怎樣的呢?還是和上面一樣給大家畫個草圖方便理解吧。
雖然說張三和李四在注冊的時候都使用的是123456作為密碼。但是在保存到數(shù)據(jù)庫之前,我們首先進行了MD5+salt操作,到數(shù)據(jù)庫中的是顯然不同的2個密文,這時黑客拿到密文之后進行破解,破解出來以后去登錄,發(fā)現(xiàn)只有張三能登錄,而李四的并不能登錄,這時為什么呢?因為在登錄的時候我們會把用戶輸入的明文以之前的加密方式再次加密得到一個密文,然后拿這個密文和數(shù)據(jù)庫之前保存的密文比較,如果相同才會放行,顯然張三和李四的密文不同,所以即使張三的密碼被破譯了,但是李四的123456密碼還是安全的。老規(guī)矩還是畫個草圖。。這個圖也就是SpringSecurity對密碼進行比較的流程。。
這樣的話就可以對密碼進行很好的保護,接下來我們看一下在項目中具體該如何使用吧
三、自定義PasswordEncoder
在SpringSecurity中要想使用自定義的密碼加密。首先要new一個xxxPasswordEncoder,然后SpringSecurity會使用你定義的Encoder去比對密碼。首先我們要編寫一個類來實現(xiàn)PasswordEncoder接口, 我們來看下PasswordEncoder中為我們提供了什么方法。
一個是encode方法是用來對明文密碼加密的方法,也就是重寫PasswordEncoder之后我們自定義的加密方法就寫在encode里,
另外一個是matches很明顯是一個匹配密碼的方法,第一個參數(shù)是要匹配的密碼,第二個參數(shù)是加密后的encode密文。我們的解密方法(其實是用相同的加密方式再次加密后比較)就寫在這里。來看下我自定義的MD5PasswordEncoder吧:
public class MD5PasswordEncoder implements PasswordEncoder { @Override public String encode(CharSequence rawPassword) { return MD5Util2.encode((String) rawPassword); } @Override public boolean matches(CharSequence rawPassword, String encodedPassword) { return encodedPassword.equals(MD5Util2.encode((String)rawPassword)); }}
MD5加密工具類:
import java.security.MessageDigest;
//md5加密工具類
public class MD5Util2 {
private static final String SALT = "lwz";
public static String encode(String password) {
password = password + SALT;
MessageDigest md5 = null;
try {
md5 = MessageDigest.getInstance("MD5");
} catch (Exception e) {
throw new RuntimeException(e);
}
char[] charArray = password.toCharArray();
byte[] byteArray = new byte[charArray.length];
for (int i = 0; i < charArray.length; i++)
byteArray[i] = (byte) charArray[i];
byte[] md5Bytes = md5.digest(byteArray);
StringBuffer hexValue = new StringBuffer();
for (int i = 0; i < md5Bytes.length; i++) {
int val = ((int) md5Bytes[i]) & 0xff;
if (val < 16) {
hexValue.append("0");
}
hexValue.append(Integer.toHexString(val));
}
return hexValue.toString();
}
}
大家可以看到在匹配的時候,是拿原來的密碼進行相同的加鹽方式進行加密,然后去比對之前保存的密文。
四、SpringSecurity處理MD5
其實這個就很簡單了,就是在你save數(shù)據(jù)之前,調(diào)用一下加密的方法,也就是上面自定義的encoder。然后把拿到的用戶明文密碼填充進去。這里就不再贅述,重點看SpringSecurity處理,還是使用上篇中我們提到的UserDetails實現(xiàn)類,你只需要在返回User對象的時候?qū)assword從數(shù)據(jù)庫中讀取出來,傳給SpingSecurity,它會自動匹配matches方法進行比對。所以我們的代碼這樣的:
@Component
public class CustomUserService implements UserDetailsService {
@Autowired
AdminService adminService;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
Admin admin = adminService.findAdminByUsername(username);
if (admin==null){
throw new UsernameNotFoundException("用戶名不存在");
}
List
authorities = new ArrayList<>(); //用于添加用戶的權(quán)限。只要把用戶權(quán)限添加到authorities 就萬事大吉。
//一個用戶可以對應(yīng)多個角色
for (Role role : admin.getRoles()) {
authorities.add(new SimpleGrantedAuthority(role.getName()));
}
return new User(admin.getUsername(),admin.getPassword(),true,true,true,true,authorities);
}
}
然后把密碼直接傳進去:可以重寫User對象返回自己的調(diào)用邏輯,這里就直接返回User,上篇提到過。
然后的處理就很簡單了,我們只需要把自己的PasswordEncoder以Bean的形式告訴SpringSecurity,可以理解為:告訴SpringSecurity我要用我自定義的Encoder來處理密碼,你去調(diào)用它。所以我們在LoginSecurityConfig(就是你實現(xiàn)了WebSecurityConfigurerAdapter抽象類的那個方法 )注冊一個bean就好了,如下:
//告訴SpringSecurity我要用我自定義的Encoder來處理密碼
@Bean
public PasswordEncoder passwordEncoder() {
return new MD5PasswordEncoder();
}
認證:
//認證
//密碼編碼:PasswordEncoder
//在Spring Security 5.0+新增了很多的加密方法~
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
//從數(shù)據(jù)庫中進行賬號密碼驗證
auth.userDetailsService(customUserService());
}
上述就是小編為大家分享的SpringSecurity中怎么使用MD5加密密碼了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。