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

Java實(shí)現(xiàn)加鹽加密算法的示例詳解

 更新時(shí)間:2023年06月01日 08:45:05   作者:X_H學(xué)Java  
這篇文章主要為大家詳細(xì)介紹了如何利用Java語言實(shí)現(xiàn)加鹽加密算法,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解一下

為什么需要加密

從下面的圖片中,可以看到用戶的密碼在數(shù)據(jù)庫中存儲時(shí),如果不對密碼加密,則是以明文的方式存儲的,如果被別人獲取到數(shù)據(jù)庫的信息,那將會將用戶的密碼泄露,從而造成安全隱患

我們可以使用MD5加密方式對用戶的密碼進(jìn)行加密存儲,但是傳統(tǒng)的MD5有規(guī)則可循,可以破解

String s = "12345";
String mds1 = DigestUtils.md5DigestAsHex(s.getBytes()).toString();
System.out.println(mds1);
String mds2 = DigestUtils.md5DigestAsHex(s.getBytes()).toString();
System.out.println(mds2);

我們從上述代碼及打印結(jié)果看,使用MD5對同一個(gè)字符串加密,加密后的結(jié)果不變,MD5加密是單向不可逆(不能從密文獲取明文),此時(shí)呢針對MD5這種加密方式可以使用暴力破解的方式進(jìn)行破解

加鹽加密

加鹽加密算法(Salt Encryption)是一種對稱密鑰加密算法,它使用一個(gè)隨機(jī)生成的鹽(salt)作為加密和解密的關(guān)鍵參數(shù),在加密過程中,將明文和鹽作為輸入,通過哈希函數(shù)計(jì)算出一個(gè)密文和一個(gè)鹽值,在解密過程中,使用相同的鹽值和密文計(jì)算哈希值,然后再用哈希值和鹽值進(jìn)行解密操作,以獲取原始的明文

MD5+鹽值加密

加密:我們可以使用一個(gè)隨機(jī)字符串(鹽值)和明文密碼組合起來,作為帶鹽值的明文密碼,再使用MD5對帶鹽值的密碼進(jìn)行加密

解密:解密其實(shí)就是判斷用戶需要校驗(yàn)密碼的正確性

此時(shí)需要用到加密使用的鹽值,這個(gè)鹽值如何獲取呢?

我們在數(shù)據(jù)庫存儲密碼時(shí)存儲鹽值+密文,使用一個(gè)特定的分割符將鹽值和密文分隔開,我們從數(shù)據(jù)庫獲取到密碼的密文后,也使用同樣的規(guī)則獲取到鹽值,使用該鹽值和校驗(yàn)的密碼重新使用MD5生成密文,判斷新生成的密文和數(shù)據(jù)庫保存的密文是否一致,如果是一致說明密碼正確,否則密碼錯(cuò)誤

加密解密的代碼實(shí)現(xiàn):

public class PasswordTools {

    /**
     *加鹽加密
     * @param password
     * @return 加密后的密碼
     */
    public static String encrypt(String password){
        //生成鹽值,使用隨機(jī)字符串UUID,UUID為32位的
        String salt = UUID.randomUUID().toString().replace("-","");
        //(鹽值+密碼)進(jìn)行MD5加密,DigestUtils.md5DigestAsHex參數(shù)為字節(jié)數(shù)組,生成一個(gè)十六進(jìn)制32位的字符串
        String finalPassword = DigestUtils.md5DigestAsHex((salt+password).getBytes(StandardCharsets.UTF_8));
        //將鹽值和加密的密碼組合返回,最終存儲到數(shù)據(jù)庫中的密碼
        String dbPassword = salt + "$" + finalPassword;
        return dbPassword;
    }

    /**
     * 校驗(yàn)密碼
     * @param password
     * @param dbPassword
     * @return
     */
    public static boolean decrypt(String password,String dbPassword){
       if(StringUtils.hasLength(password) && StringUtils.hasLength(dbPassword)
               && dbPassword.length()==65 && dbPassword.contains("$")){
            String[] arr = dbPassword.split("\\$");
            String salt = arr[0];
            //根據(jù)獲取的鹽值生成校驗(yàn)的密碼
            String checkPassword = salt + "$" + DigestUtils.md5DigestAsHex((salt+password).getBytes(StandardCharsets.UTF_8));
            //用校驗(yàn)密碼與數(shù)據(jù)庫保存的密碼進(jìn)行校驗(yàn)
            if(checkPassword.equals(dbPassword)){
                return true;
            }
        }
       return false;
    }

    public static void main(String[] args) {
        String dbPassword = encrypt("12345");
        System.out.println(decrypt("12345",dbPassword)); //true
        System.out.println(decrypt("45678",dbPassword)); //false
    }
}

Spring Security加鹽

1.添加Spring Security依賴

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-security</artifactId>
</dependency>

2.關(guān)閉Spring Security的認(rèn)證

在啟動類上的注解添加排除,禁止Spring boot啟動時(shí)自動加載Spring Security框架

@SpringBootApplication(exclude = {SecurityAutoConfiguration.class})
public class DemoApplication {
	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
	}
}

3.使用BCryptPasswordEncoder對象提供的encode(String password)加密,和matches(String password,String dbPassword)解密方法

        BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
        String password = "123456";
        System.out.println(passwordEncoder.encode(password));
        System.out.println(passwordEncoder.encode(password));
        System.out.println(passwordEncoder.encode(password));

        BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
        String password = "123456";
        String dbPassword = passwordEncoder.encode(password);
        boolean result1 = passwordEncoder.matches(password,dbPassword); //正確的密碼
        boolean result2 = passwordEncoder.matches("12345",dbPassword); //錯(cuò)誤的密碼
        System.out.println(result1);
        System.out.println(result2);

到此這篇關(guān)于Java實(shí)現(xiàn)加鹽加密算法的示例詳解的文章就介紹到這了,更多相關(guān)Java加鹽加密算法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring Mybatis 基本使用過程(推薦)

    Spring Mybatis 基本使用過程(推薦)

    Mybatis是一個(gè)半自動ORM(Object Relational Mapping)框架,它可以簡化數(shù)據(jù)庫編程,讓開發(fā)者更專注于SQL本身,本文給大家介紹Spring Mybatis 基本使用過程,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • Java 實(shí)戰(zhàn)項(xiàng)目錘煉之樸素風(fēng)格個(gè)人博客系統(tǒng)的實(shí)現(xiàn)流程

    Java 實(shí)戰(zhàn)項(xiàng)目錘煉之樸素風(fēng)格個(gè)人博客系統(tǒng)的實(shí)現(xiàn)流程

    讀萬卷書不如行萬里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用Java+vue+Springboot+ssm+mysql+maven+redis實(shí)現(xiàn)一個(gè)樸素風(fēng)格的個(gè)人博客系統(tǒng),大家可以在過程中查缺補(bǔ)漏,提升水平
    2021-11-11
  • 使用springboot整合websocket實(shí)現(xiàn)群聊教程

    使用springboot整合websocket實(shí)現(xiàn)群聊教程

    websocket怎么說呢,就是服務(wù)器可以主動向客戶端發(fā)起對話,下面就是springboot整合websocket實(shí)現(xiàn)群聊的操作代碼,一起來看一下get新技能吧
    2021-08-08
  • 10分鐘帶你徒手寫個(gè)Java線程池

    10分鐘帶你徒手寫個(gè)Java線程池

    我們自己手動實(shí)現(xiàn)的線程池要比Java自身的線程池簡單的多,我們?nèi)サ袅烁鞣N復(fù)雜的處理方式,只保留了最核心的原理,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-04-04
  • Spring Boot應(yīng)用與Prometheus和Grafana整合方案

    Spring Boot應(yīng)用與Prometheus和Grafana整合方案

    通過將Spring Boot應(yīng)用與Prometheus和Grafana進(jìn)行整合,我們可以實(shí)現(xiàn)對Spring Boot應(yīng)用的全面監(jiān)控和可視化展示,本文將詳細(xì)介紹如何將Spring Boot應(yīng)用與Prometheus和Grafana進(jìn)行整合,實(shí)現(xiàn)對Spring Boot應(yīng)用的全面監(jiān)控,感興趣的朋友一起看看吧
    2025-11-11
  • Java中Date時(shí)間類的使用方法舉例

    Java中Date時(shí)間類的使用方法舉例

    這篇文章主要給大家介紹了關(guān)于Java中Date時(shí)間類的使用方法,在java開發(fā)中,很多字段是Date類型的,文中通過代碼示例將Date時(shí)間類使用的方法介紹的非常詳細(xì),需要的朋友可以參考下
    2023-08-08
  • java 歸并排序的實(shí)例詳解

    java 歸并排序的實(shí)例詳解

    這篇文章主要介紹了java 歸并排序的實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • Spring Boot實(shí)現(xiàn)異步請求(Servlet 3.0)

    Spring Boot實(shí)現(xiàn)異步請求(Servlet 3.0)

    在spring 3.2 及以后版本中增加了對請求的異步處理,這篇文章主要介紹了Spring Boot實(shí)現(xiàn)異步請求(Servlet 3.0),感興趣的小伙伴們可以參考一下。
    2017-04-04
  • springboot發(fā)送request請求的方式小結(jié)

    springboot發(fā)送request請求的方式小結(jié)

    在Java中,發(fā)送HTTP請求是常見需求,hutool工具包和RestTemplate類是實(shí)現(xiàn)此功能的兩種主流方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-09-09
  • Java中Spring擴(kuò)展點(diǎn)詳解

    Java中Spring擴(kuò)展點(diǎn)詳解

    這篇文章主要介紹了Java中Spring技巧之?dāng)U展點(diǎn)的應(yīng)用,下文Spring容器的啟動流程圖展開其內(nèi)容的相關(guān)資料,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-06-06

最新評論

醴陵市| 肇庆市| 宁化县| 奉节县| 东莞市| 葫芦岛市| 莱芜市| 化德县| 咸阳市| 大英县| 沿河| 梧州市| 柘荣县| 贺州市| 平安县| 卓资县| 全南县| 沅江市| 台江县| 梁河县| 仙桃市| 甘洛县| 南溪县| 伽师县| 凌源市| 深州市| 同江市| 沁阳市| 三亚市| 齐河县| 南昌县| 桂阳县| 牙克石市| 雷州市| 曲松县| 和政县| 潼关县| 潞西市| 库车县| 正宁县| 织金县|