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

Spring Security更換加密方式的完整方案

 更新時間:2025年12月04日 09:35:49   作者:明有所思  
隨著現(xiàn)在對軟件系統(tǒng)安全性要求的越來越嚴苛,對于很多項目,升級密碼都是勢在必行的,若項目使用Spring Security框架,只需稍作修改,便可達到更換加密方式,所以本文給大家介紹了Spring Security更換加密方式的完整方案,需要的朋友可以參考下

隨著現(xiàn)在對軟件系統(tǒng)安全性要求的越來越嚴苛,對于很多項目,升級密碼都是勢在必行的,若項目使用Spring Security框架,只需稍作修改,便可達到更換加密方式,且自動更新存量數(shù)據(jù)的密碼加密放肆。在Spring Security中更換密碼加密方式,通常涉及遷移舊有用戶密碼并配置新的加密策略。以下是完整步驟和示例代碼:

1. 理解Spring Security的加密接口

核心接口是PasswordEncoder,常用實現(xiàn)類:

  • BCryptPasswordEncoder (推薦)
  • SCryptPasswordEncoder
  • Pbkdf2PasswordEncoder
  • Argon2PasswordEncoder
  • NoOpPasswordEncoder (明文,僅測試用)

2. 遷移方案(新舊密碼共存)

使用DelegatingPasswordEncoderDelegatingPasswordEncoder 是 Spring Security 中用于密碼加密的核心組件,主要用于代理多種加密策略,兼容舊密碼格式并支持升級加密方式,支持多種加密格式自動適配:

先來看DelegatingPasswordEncoder的構(gòu)造方法:

public DelegatingPasswordEncoder(String idForEncode, Map<String, PasswordEncoder> idToPasswordEncoder) {
        if (idForEncode == null) {
            throw new IllegalArgumentException("idForEncode cannot be null");
        } else if (!idToPasswordEncoder.containsKey(idForEncode)) {
            throw new IllegalArgumentException("idForEncode " + idForEncode + "is not found in idToPasswordEncoder " + idToPasswordEncoder);
        } else {
            for(String id : idToPasswordEncoder.keySet()) {
                if (id != null) {
                    if (id.contains("{")) {
                        throw new IllegalArgumentException("id " + id + " cannot contain " + "{");
                    }

                    if (id.contains("}")) {
                        throw new IllegalArgumentException("id " + id + " cannot contain " + "}");
                    }
                }
            }

            this.idForEncode = idForEncode;
            this.passwordEncoderForEncode = (PasswordEncoder)idToPasswordEncoder.get(idForEncode);
            this.idToPasswordEncoder = new HashMap(idToPasswordEncoder);
        }
    }

其中參數(shù)idForEncode決定了密碼編碼器的類型,而idToPasswordEncoder決定了匹配密碼時的兼容的密碼編碼器的類型,且idToPasswordEncoder中必須包含idForEncode,否則新密碼加密后將無法匹配。

查看DelegatingPasswordEncoder類的類圖可知,DelegatingPasswordEncoder類是PasswordEncoder的實現(xiàn)類。

根據(jù)DelegatingPasswordEncoder的構(gòu)造器,定義PasswordEncoder密碼編碼器:

@Bean
public PasswordEncoder passwordEncoder() {
    String idForEncode = "bcrypt"; // 默認使用BCrypt
    Map<String, PasswordEncoder> idToPasswordEncoder = new HashMap<>();
    idToPasswordEncoder.put(idForEncode, new BCryptPasswordEncoder());
    idToPasswordEncoder.put("sha256", new MessageDigestPasswordEncoder("SHA-256")); // 舊系統(tǒng)加密方式
    
    return new DelegatingPasswordEncoder(idForEncode, idToPasswordEncoder);
}

3. 密碼存儲格式要求

認證時根據(jù)前綴匹配加密器:

存儲格式示例:
{bcrypt}$2a$10$dXJ3SW6G7P50lGmMkkmwe.20cQQubK3.HZWzG3YB1tlRy.fqvM/BG 
{sha256}5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8

4. 數(shù)據(jù)庫密碼遷移腳本

-- 將舊密碼加前綴
UPDATE t_user SET password = CONCAT('{sha256}', password) 
WHERE password NOT LIKE '{_}%';

5. 安全配置示例

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.jdbcAuthentication()
            .dataSource(dataSource)
            .passwordEncoder(passwordEncoder())
            .usersByUsernameQuery("SELECT username, password, enabled FROM users WHERE username=?")
            .authoritiesByUsernameQuery("SELECT username, authority FROM authorities WHERE username=?");
    }
    
    @Bean
    public PasswordEncoder passwordEncoder() {
        // 委托式編碼器配置
        String idForEncode = "bcrypt"; // 默認使用BCrypt
        Map<String, PasswordEncoder> idToPasswordEncoder = new HashMap<>();
        idToPasswordEncoder.put(idForEncode, new BCryptPasswordEncoder());
        idToPasswordEncoder.put("sha256", new MessageDigestPasswordEncoder("SHA-256")); // 舊系統(tǒng)加密方式

        return new DelegatingPasswordEncoder(idForEncode, idToPasswordEncoder);
    }
}

6. 密碼自動升級策略(可選)

密碼自動升級策略,適用于用戶登錄時自動更新密碼格式,需要自定義PasswordEncoder的實現(xiàn)類,并在第5點安全配置中使用,可參照BCryptPasswordEncoder進行實現(xiàn)。

public class AutoUpgradePasswordEncoder implements PasswordEncoder {
    
    private final PasswordEncoder currentEncoder;
    private final PasswordEncoder newEncoder;
    
    @Override
    public boolean matches(CharSequence rawPassword, String encodedPassword) {
        if (currentEncoder.matches(rawPassword, encodedPassword)) {
            // 匹配成功且是舊編碼時,觸發(fā)密碼升級
            if (encodedPassword.startsWith("{sha256}")) {
                String newPass = newEncoder.encode(rawPassword);
                // 調(diào)用DAO更新數(shù)據(jù)庫密碼...
            }
            return true;
        }
        return newEncoder.matches(rawPassword, encodedPassword);
    }
    
    // encode()方法需實現(xiàn)...
}

7. 注意事項

  1. 前綴不可省略{id}encodedPassword格式是識別關(guān)鍵
  2. 加密強度
// 調(diào)整BCrypt強度 (默認10)
new BCryptPasswordEncoder(12)
  1. 禁用弱加密:避免使用MD5/SHA-1等已被破解的算法
  2. 密碼遷移:在系統(tǒng)低負載時段執(zhí)行數(shù)據(jù)庫更新
  3. 測試策略:保留舊密碼的用戶測試賬號

8. 最佳實踐

主推算法:BCrypt(自適應強度抗GPU破解)

過渡方案

安全規(guī)范

  • 密碼強度要求:至少10位(字母+數(shù)字+特殊字符)
  • 定期輪換:每90天提示修改密碼(配合密碼歷史策略)

9.總結(jié)

Spring Security項目的密碼升級主要是通過配置PasswordEncoder進行實現(xiàn),但需要注意需要進行密碼的遷移(舊密碼添加前綴)。

- 密碼強度要求:至少10位(字母+數(shù)字+特殊字符)
- 定期輪換:每90天提示修改密碼(配合密碼歷史策略)

通過上述設計,系統(tǒng)可以同時支持新舊用戶認證,并逐步將舊密碼升級到更安全的加密方式,整個過程對用戶幾乎無感知。

以上就是Spring Security更換加密方式的完整方案的詳細內(nèi)容,更多關(guān)于Spring Security更換加密方式的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Filter中獲取傳遞參數(shù)方式(解決post請求參數(shù)問題)

    Filter中獲取傳遞參數(shù)方式(解決post請求參數(shù)問題)

    這篇文章主要介紹了Filter中獲取傳遞參數(shù)方式(解決post請求參數(shù)問題),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • java使用數(shù)組和鏈表實現(xiàn)隊列示例

    java使用數(shù)組和鏈表實現(xiàn)隊列示例

    隊列是一種特殊的線性表,它只允許在表的前端(front)進行刪除操作,只允許在表的后端(rear)進行插入操作,下面介紹一下java使用數(shù)組和鏈表實現(xiàn)隊列的示例
    2014-01-01
  • 利用java實現(xiàn)單詞倒序排列

    利用java實現(xiàn)單詞倒序排列

    這篇文章就是利用java實現(xiàn)單詞倒序排列,感覺像是在變魔術(shù),感興趣的小伙伴來見證一下
    2015-07-07
  • Java 面向?qū)ο蟮奶卣鹘馕雠c應用

    Java 面向?qū)ο蟮奶卣鹘馕雠c應用

    Java 是面向?qū)ο蟮木幊陶Z言,對象就是面向?qū)ο蟪绦蛟O計的核心。所謂對象就是真實世界中的實體,對象與實體是一一對應的,也就是說現(xiàn)實世界中每一個實體都是一個對象,它是一種具體的概念
    2021-11-11
  • 詳解Java Bellman-Ford算法原理及實現(xiàn)

    詳解Java Bellman-Ford算法原理及實現(xiàn)

    Bellman-Ford算法與Dijkstra算法類似,都是以松弛操作作為基礎,Bellman-Ford算法是對所有邊都進行松弛操作,本文將詳解Bellman-Ford算法原理及實現(xiàn),感興趣的可以了解一下
    2022-07-07
  • 實現(xiàn)一個規(guī)則引擎的可視化具體方案

    實現(xiàn)一個規(guī)則引擎的可視化具體方案

    項目原因需要用到規(guī)則引擎,但是發(fā)現(xiàn)大部分不可以自由的進行規(guī)則定義,通過不斷嘗試變換關(guān)鍵字在搜索引擎搜索,最終在stackoverflow找到了一個探討這個問題的帖子,特此將帖子中提到的方案分享一下,如果你跟我一樣在研究同樣的問題,也許對你有用
    2021-04-04
  • 使用Spring Security集成手機驗證碼登錄功能實現(xiàn)

    使用Spring Security集成手機驗證碼登錄功能實現(xiàn)

    本文詳細介紹了如何利用SpringSecurity來實現(xiàn)手機驗證碼的注冊和登錄功能,在登錄過程中,同樣需通過驗證碼進行驗證,文章還提供了相關(guān)的代碼實現(xiàn)
    2024-10-10
  • 詳解SpringMVC的攔截器參數(shù)及攔截器鏈配置

    詳解SpringMVC的攔截器參數(shù)及攔截器鏈配置

    攔截器(Interceptor)是一種動態(tài)攔截方法調(diào)用的機制,在SpringMVC中動態(tài)攔截控制器方法的執(zhí)行。本文將詳細講講SpringMVC中攔截器參數(shù)及攔截器鏈配置,感興趣的可以嘗試一下
    2022-07-07
  • JDK動態(tài)代理之WeakCache緩存的實現(xiàn)機制

    JDK動態(tài)代理之WeakCache緩存的實現(xiàn)機制

    這篇文章主要介紹了JDK動態(tài)代理之WeakCache緩存的實現(xiàn)機制
    2018-02-02
  • Spring如何將bean添加到容器中

    Spring如何將bean添加到容器中

    這篇文章主要介紹了Spring如何將bean添加到容器中,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-05-05

最新評論

西林县| 海伦市| 正阳县| 海宁市| 西平县| 阜新| 高邑县| 南昌市| 武夷山市| 呈贡县| 大渡口区| 绵阳市| 河北省| 拉萨市| 手机| 临高县| 楚雄市| 五莲县| 措勤县| 蕲春县| 威信县| 什邡市| 西乌珠穆沁旗| 巨鹿县| 大埔区| 双牌县| 德令哈市| 汝城县| 清徐县| 弥勒县| 景泰县| 吉安市| 邢台市| 丹东市| 文安县| 全椒县| 华蓥市| 留坝县| 福泉市| 广西| 庄河市|