您好,登錄后才能下訂單哦!
這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)碛嘘P(guān)SpringSecurity中怎么使用MD5加密密碼,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
一、為什么使用加密
我們先來說一下使用加密后的密碼處理流程。我們?yōu)槭裁匆褂妹芪哪兀恳簿褪羌用芎蟮拿艽a呢?如果一個(gè)用戶在網(wǎng)站注冊時(shí)寫入的密碼是123456,當(dāng)他點(diǎn)擊保存之后,如果不加密的話,在數(shù)據(jù)庫中存的就是123456,這樣有什么不好嗎?答案是肯定的,想想12306密碼泄露導(dǎo)致用戶所有信息泄露,是用戶密碼不夠復(fù)雜嗎?可能是?但是最主要的原因是數(shù)據(jù)庫中如果使用的是明文,黑客很容易就會(huì)進(jìn)行破解,而且一旦破解了一個(gè)密碼可能就會(huì)拿到一組數(shù)據(jù),為了方便大家理解,畫了張草圖:而且數(shù)據(jù)庫中密碼為123456的用戶絕對(duì)不是2個(gè),大家可以想象后果由多可怕了嗎。。。
二、MD5+salt
其實(shí)關(guān)于這個(gè)問題上網(wǎng)就可以收集到,這里不再贅述,大家百度下概念就好,我們這里主要說在SpringSecurity中使用MD5,我們知道單純的MD5加密并不是安全的,而如果我們使用MD5加鹽的方式去對(duì)密碼進(jìn)行加密,那么想要破解的話難度系數(shù)就會(huì)成倍出現(xiàn),基本上是不可能破解的。大家都知道MD5是不可逆的,也就是說加密完的密碼無法進(jìn)行解密,要不然怎么會(huì)是安全的呢?那我們來看下如果使用了MD5加密的話,黑客在獲取密碼的時(shí)候會(huì)是怎樣的呢?還是和上面一樣給大家畫個(gè)草圖方便理解吧。
雖然說張三和李四在注冊的時(shí)候都使用的是123456作為密碼。但是在保存到數(shù)據(jù)庫之前,我們首先進(jìn)行了MD5+salt操作,到數(shù)據(jù)庫中的是顯然不同的2個(gè)密文,這時(shí)黑客拿到密文之后進(jìn)行破解,破解出來以后去登錄,發(fā)現(xiàn)只有張三能登錄,而李四的并不能登錄,這時(shí)為什么呢?因?yàn)樵诘卿浀臅r(shí)候我們會(huì)把用戶輸入的明文以之前的加密方式再次加密得到一個(gè)密文,然后拿這個(gè)密文和數(shù)據(jù)庫之前保存的密文比較,如果相同才會(huì)放行,顯然張三和李四的密文不同,所以即使張三的密碼被破譯了,但是李四的123456密碼還是安全的。老規(guī)矩還是畫個(gè)草圖。。這個(gè)圖也就是SpringSecurity對(duì)密碼進(jìn)行比較的流程。。
這樣的話就可以對(duì)密碼進(jìn)行很好的保護(hù),接下來我們看一下在項(xiàng)目中具體該如何使用吧
三、自定義PasswordEncoder
在SpringSecurity中要想使用自定義的密碼加密。首先要new一個(gè)xxxPasswordEncoder,然后SpringSecurity會(huì)使用你定義的Encoder去比對(duì)密碼。首先我們要編寫一個(gè)類來實(shí)現(xiàn)PasswordEncoder接口, 我們來看下PasswordEncoder中為我們提供了什么方法。
一個(gè)是encode方法是用來對(duì)明文密碼加密的方法,也就是重寫PasswordEncoder之后我們自定義的加密方法就寫在encode里,
另外一個(gè)是matches很明顯是一個(gè)匹配密碼的方法,第一個(gè)參數(shù)是要匹配的密碼,第二個(gè)參數(shù)是加密后的encode密文。我們的解密方法(其實(shí)是用相同的加密方式再次加密后比較)就寫在這里。來看下我自定義的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();
}
}
大家可以看到在匹配的時(shí)候,是拿原來的密碼進(jìn)行相同的加鹽方式進(jìn)行加密,然后去比對(duì)之前保存的密文。
四、SpringSecurity處理MD5
其實(shí)這個(gè)就很簡單了,就是在你save數(shù)據(jù)之前,調(diào)用一下加密的方法,也就是上面自定義的encoder。然后把拿到的用戶明文密碼填充進(jìn)去。這里就不再贅述,重點(diǎn)看SpringSecurity處理,還是使用上篇中我們提到的UserDetails實(shí)現(xiàn)類,你只需要在返回User對(duì)象的時(shí)候?qū)assword從數(shù)據(jù)庫中讀取出來,傳給SpingSecurity,它會(huì)自動(dòng)匹配matches方法進(jìn)行比對(duì)。所以我們的代碼這樣的:
@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<SimpleGrantedAuthority> authorities = new ArrayList<>();
//用于添加用戶的權(quán)限。只要把用戶權(quán)限添加到authorities 就萬事大吉。
//一個(gè)用戶可以對(duì)應(yīng)多個(gè)角色
for (Role role : admin.getRoles()) {
authorities.add(new SimpleGrantedAuthority(role.getName()));
}
return new User(admin.getUsername(),admin.getPassword(),true,true,true,true,authorities);
}
}
然后把密碼直接傳進(jìn)去:可以重寫User對(duì)象返回自己的調(diào)用邏輯,這里就直接返回User,上篇提到過。
然后的處理就很簡單了,我們只需要把自己的PasswordEncoder以Bean的形式告訴SpringSecurity,可以理解為:告訴SpringSecurity我要用我自定義的Encoder來處理密碼,你去調(diào)用它。所以我們在LoginSecurityConfig(就是你實(shí)現(xiàn)了WebSecurityConfigurerAdapter抽象類的那個(gè)方法 )注冊一個(gè)bean就好了,如下:
//告訴SpringSecurity我要用我自定義的Encoder來處理密碼
@Bean
public PasswordEncoder passwordEncoder() {
return new MD5PasswordEncoder();
}
認(rèn)證:
//認(rèn)證
//密碼編碼:PasswordEncoder
//在Spring Security 5.0+新增了很多的加密方法~
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
//從數(shù)據(jù)庫中進(jìn)行賬號(hào)密碼驗(yàn)證
auth.userDetailsService(customUserService());
}
上述就是小編為大家分享的SpringSecurity中怎么使用MD5加密密碼了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。