溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

SpringSecurity中怎么使用MD5加密密碼

發(fā)布時(shí)間:2021-07-30 16:35:34 來源:億速云 閱讀:471 作者:Leah 欄目:大數(shù)據(jù)

這期內(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è),大家可以想象后果由多可怕了嗎。。。

SpringSecurity中怎么使用MD5加密密碼

二、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è)草圖方便理解吧。

SpringSecurity中怎么使用MD5加密密碼

雖然說張三和李四在注冊的時(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)行比較的流程。。

SpringSecurity中怎么使用MD5加密密碼

這樣的話就可以對(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ì)。所以我們的代碼這樣的:

@Componentpublic 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è)資訊頻道。

向AI問一下細(xì)節(jié)

免責(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)容。

AI