最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

一、加密 & 代碼解讀

首先我們來看到的是第一種【加鹽加密】的方法,即為直接傳入密碼隨機(jī)產(chǎn)生鹽值來進(jì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;
}

接下去我們來細(xì)致地解讀一下這個(gè)加鹽算法

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

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

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

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

最后,此方法會(huì)將所得到的鹽值和最后的密碼進(jìn)行返回

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

接下去我們?cè)賮砜纯戳硪环N的加密算法,不僅是傳遞所需要加密的密碼,鹽值也需要一并地傳入

/**
 * 加鹽加密
 *
 * @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,那么除去第一步的鹽值生成,其他都是一樣的

二、驗(yàn)證 & 代碼解讀

以下是對(duì)于用戶所傳遞進(jìn)來的密碼進(jìn)行驗(yàn)證的過程

/**
 * 驗(yàn)證加鹽加密密碼
 *
 * @param password   明文密碼(不一定對(duì),需要驗(yàn)證明文密碼)
 * @param dbPassword 數(shù)據(jù)庫存儲(chǔ)的密碼(包含: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.生成驗(yàn)證密碼的加鹽加密密碼
        String checkPassword = encrypt(password, salt);
        if (dbPassword.equals(checkPassword)) {
            result = true;
        }
    }
    return result;
}

我們馬上來解讀一下

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

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

因?yàn)樗嫒霐?shù)據(jù)庫的finalPasswordsalt + "$" + finalPassword;,所以我們要通過split()來取出取出和這個(gè)鹽值

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

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

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

三、測(cè)試觀察

最后我們通過實(shí)體的用戶注冊(cè)登錄來進(jìn)行一下測(cè)試,觀察是否可以達(dá)到加密驗(yàn)證

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

然后我們?nèi)プ?cè)一個(gè)用戶名為:lisi,并且密碼為ls123的用戶

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

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

然后便很成功地登錄進(jìn)去了

我們可以再來試試輸錯(cuò)密碼的可能性。很明顯當(dāng)密碼輸錯(cuò)的時(shí)候在進(jìn)行驗(yàn)證的時(shí)候就會(huì)識(shí)別到了

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

相關(guān)文章

最新評(píng)論

余庆县| 元江| 宝清县| 沁源县| 弥勒县| 剑川县| 玉溪市| 安图县| 连州市| 娄底市| 伊宁县| 洞口县| 弋阳县| 南木林县| 长葛市| 靖州| 阜平县| 大同市| 剑阁县| 凯里市| 红河县| 广汉市| 澳门| 鹤峰县| 安远县| 淮安市| 玉环县| 五台县| 南靖县| 南宁市| 盐亭县| 霍林郭勒市| 临汾市| 叶城县| 辰溪县| 武乡县| 隆昌县| 商丘市| 望奎县| 咸阳市| 肥城市|