欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot利用隨機鹽值實現(xiàn)密碼的加密與驗證

 更新時間:2024年02月29日 10:53:23   作者:烽起黎明  
這篇文章主要為大家詳細介紹了SpringBoot如何利用隨機鹽值實現(xiàn)密碼的加密與驗證,文中的示例代碼講解詳細,有需要的小伙伴可以參考下

近日,在做完博客系統(tǒng)的項目之后發(fā)現(xiàn)在進行用戶登錄的時候?qū)τ诿艽a的防護性不夠嚴謹,可能會存在密碼的安全問題,故本文將介紹如何使用【隨機鹽值】來實現(xiàn)密碼的加密與解密

一、加密 & 代碼解讀

首先我們來看到的是第一種【加鹽加密】的方法,即為直接傳入密碼隨機產(chǎn)生鹽值來進行加密

/**
 * 加鹽加密
 *
 * @param password 明文密碼
 * @return 加鹽加密的密碼
 */
public static String encrypt(String password) {
    // 1.產(chǎn)生鹽值
    String salt = UUID.randomUUID().toString().replace("-", "");
    // 2.使用MD5(鹽值+明文密碼)得到加密的密碼
    String finalPassword = DigestUtils.md5DigestAsHex((salt + password).getBytes());
    // 3.將鹽值和加密的密碼共同返回(合并鹽值和加密密碼)
    String dbPassword = salt + "$" + finalPassword;
    return dbPassword;
}

接下去我們來細致地解讀一下這個加鹽算法

首先我們使用工具類UUID中的randomUUID()方法,根據(jù)所傳入的兩個參數(shù)隨機產(chǎn)生一個鹽值

// 1.產(chǎn)生鹽值
String salt = UUID.randomUUID().toString().replace("-", "");

然后我們則使用工具類DigestUtils中的md5DigestAsHex()方法將隨機生成的鹽值進行拼接然后得到最后的加密后的密碼

// 2.使用MD5(鹽值+明文密碼)得到加密的密碼
String finalPassword = DigestUtils.md5DigestAsHex((salt + password).getBytes());

最后,此方法會將所得到的鹽值和最后的密碼進行返回

// 3.將鹽值和加密的密碼共同返回(合并鹽值和加密密碼)
String dbPassword = salt + "$" + finalPassword;

接下去我們再來看看另一種的加密算法,不僅是傳遞所需要加密的密碼,鹽值也需要一并地傳入

/**
 * 加鹽加密
 *
 * @param password 明文密碼
 * @param salt     可傳遞鹽值
 * @return 加鹽加密的密碼
 */
public static String encrypt(String password, String salt) {
    // 1.使用(鹽值+明文密碼)得到加密的密碼
    String finalPassword = DigestUtils.md5DigestAsHex((salt + password).getBytes());
    // 2.將鹽值和加密的密碼共同返回(合并鹽值和加密密碼)
    String dbPassword = salt + "$" + finalPassword;
    return dbPassword;
}

??那既然已經(jīng)傳入了鹽值salt,那么除去第一步的鹽值生成,其他都是一樣的

二、驗證 & 代碼解讀

以下是對于用戶所傳遞進來的密碼進行驗證的過程

/**
 * 驗證加鹽加密密碼
 *
 * @param password   明文密碼(不一定對,需要驗證明文密碼)
 * @param dbPassword 數(shù)據(jù)庫存儲的密碼(包含:salt+$+加鹽加密密碼)
 * @return true=密碼正確
 */
public static boolean decrypt(String password, String dbPassword) {
    boolean result = false;
    if (StringUtils.hasLength(password) && StringUtils.hasLength(dbPassword) &&
            dbPassword.length() == 65 && dbPassword.contains("$")) { // 參數(shù)正確
        // 1.得到鹽值
        String[] passwrodArr = dbPassword.split("\$");
        // 1.1 鹽值
        String salt = passwrodArr[0];
//            // 1.2 得到正確密碼的加鹽加密密碼
//            String finalPassword = passwrodArr[1];
        // 2.生成驗證密碼的加鹽加密密碼
        String checkPassword = encrypt(password, salt);
        if (dbPassword.equals(checkPassword)) {
            result = true;
        }
    }
    return result;
}

我們馬上來解讀一下

首先我們要先來進行參數(shù)校驗,要檢查的就是這兩個參數(shù)是否存在,并且要檢查從數(shù)據(jù)庫中所取到的加鹽后密碼長度是否== 65,而且是否包含字符“$”

if (StringUtils.hasLength(password) && StringUtils.hasLength(dbPassword) &&
        dbPassword.length() == 65 && dbPassword.contains("$")) { // 參數(shù)正確

因為所存入數(shù)據(jù)庫的finalPasswordsalt + "$" + finalPassword;,所以我們要通過split()來取出取出和這個鹽值

// 1.得到鹽值
String[] passwrodArr = dbPassword.split("\$");
// 1.1 鹽值
String salt = passwrodArr[0];

最后,當我們得到這個鹽值后,對用戶所傳遞進來的密碼進行一樣的加鹽加密,將得到后的結果與數(shù)據(jù)庫中的密碼進行比較,如果相同的話則進行標記,最后我們通過result來進行觀察

// 2.生成驗證密碼的加鹽加密密碼
String checkPassword = encrypt(password, salt);
if (dbPassword.equals(checkPassword)) {
    result = true;
}

三、測試觀察

最后我們通過實體的用戶注冊登錄來進行一下測試,觀察是否可以達到加密驗證

首先看到當前系統(tǒng)中總共有兩個用戶,分別是【admin】和【zhangsan】

然后我們?nèi)プ砸粋€用戶名為:lisi,并且密碼為ls123的用戶

然后我們就可以看到數(shù)據(jù)庫中多了一條用戶名為:lisi,并且密碼為ls123的用戶

接著我們就可以去進行登錄了,輸入剛才所注冊的用戶名和密碼就可以,我們一起來調(diào)試著看看

然后便很成功地登錄進去了

我們可以再來試試輸錯密碼的可能性。很明顯當密碼輸錯的時候在進行驗證的時候就會識別到了

以上就是SpringBoot利用隨機鹽值實現(xiàn)密碼的加密與驗證的詳細內(nèi)容,更多關于SpringBoot密碼加密與驗證的資料請關注腳本之家其它相關文章!

相關文章

  • Java并發(fā)編程之顯示鎖ReentrantLock和ReadWriteLock讀寫鎖

    Java并發(fā)編程之顯示鎖ReentrantLock和ReadWriteLock讀寫鎖

    這篇文章主要介紹了Java并發(fā)編程之顯示鎖ReentrantLock和ReadWriteLock讀寫鎖,本文講解了ReentrantLock概況、Lock接口、Lock使用、輪詢鎖的和定時鎖、公平性、可中斷獲鎖獲取操作等內(nèi)容,需要的朋友可以參考下
    2015-04-04
  • SpringBoot四種讀取properties文件的方式(小結)

    SpringBoot四種讀取properties文件的方式(小結)

    這篇文章主要介紹了SpringBoot四種讀取properties文件的方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-05-05
  • 詳解備忘錄模式及其在Java設計模式編程中的實現(xiàn)

    詳解備忘錄模式及其在Java設計模式編程中的實現(xiàn)

    這篇文章主要介紹了詳解備忘錄模式及其在Java設計模式編程中的實現(xiàn),備忘錄模式數(shù)據(jù)的存儲過程中應當注意淺拷貝和深拷貝的問題,需要的朋友可以參考下
    2016-04-04
  • 全面詳解java代碼重構與設計模式

    全面詳解java代碼重構與設計模式

    這篇文章主要為大家介紹了全面詳解java代碼重構與設計模式的全面詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • java區(qū)分絕對路徑和相對路徑的方法

    java區(qū)分絕對路徑和相對路徑的方法

    這篇文章主要介紹了java區(qū)分絕對路徑和相對路徑的方法,實例分析了java針對路徑操作的相關技巧,需要的朋友可以參考下
    2015-04-04
  • springMVC 用戶登錄權限驗證實現(xiàn)過程解析

    springMVC 用戶登錄權限驗證實現(xiàn)過程解析

    這篇文章主要介紹了springMVC 用戶登錄權限驗證實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • 基于@RequestBody和@ResponseBody及Stringify()的作用說明

    基于@RequestBody和@ResponseBody及Stringify()的作用說明

    這篇文章主要介紹了基于@RequestBody和@ResponseBody及Stringify()的作用說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java?在游戲中探索數(shù)組二維數(shù)組

    Java?在游戲中探索數(shù)組二維數(shù)組

    數(shù)組和二維數(shù)組感覺用王者榮耀的裝備欄來舉例解釋,應該更易懂一些。從基礎開始講,后續(xù)會講到JAVA高級,中間會穿插面試題和項目實戰(zhàn),希望能給大家?guī)韼椭?/div> 2022-03-03
  • SpringMVC工作原理實例詳解

    SpringMVC工作原理實例詳解

    這篇文章主要介紹了SpringMVC工作原理實例詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • Spring中的ThreadPoolTaskExecutor線程池使用詳解

    Spring中的ThreadPoolTaskExecutor線程池使用詳解

    這篇文章主要介紹了Spring中的ThreadPoolTaskExecutor線程池使用詳解,ThreadPoolTaskExecutor 是 Spring框架提供的一個線程池實現(xiàn),用于管理和執(zhí)行多線程任務,它是TaskExecutor接口的實現(xiàn),提供了在 Spring 應用程序中創(chuàng)建和配置線程池的便捷方式,需要的朋友可以參考下
    2024-01-01

最新評論