成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Spring Security 進階-加密篇

wanglu1209 / 868人閱讀

摘要:在中加密是一個很簡單卻又不能忽略的模塊,數(shù)據(jù)只有加密起來才更安全,這樣就散算據(jù)庫密碼泄漏也都是密文。當然也可以自定義構(gòu)造方法,來制定用其他的方案進行加密。應(yīng)用先示范下使用系統(tǒng)的來演示下簡單的注入構(gòu)造加密方案

在 Spring Security 中加密是一個很簡單卻又不能忽略的模塊,數(shù)據(jù)只有加密起來才更安全,這樣就散算據(jù)庫密碼泄漏也都是密文。本文分析對應(yīng)的版本是 5.14。
概念

Spring Security 為我們提供了一套加密規(guī)則和密碼比對規(guī)則,org.springframework.security.crypto.password.PasswordEncoder 接口,該接口里面定義了三個方法。

public interface PasswordEncoder {

    //加密(外面調(diào)用一般在注冊的時候加密前端傳過來的密碼保存進數(shù)據(jù)庫)
    String encode(CharSequence rawPassword);

    //加密前后對比(一般用來比對前端提交過來的密碼和數(shù)據(jù)庫存儲密碼, 也就是明文和密文的對比)
    boolean matches(CharSequence rawPassword, String encodedPassword);

    //是否需要再次進行編碼, 默認不需要
    default boolean upgradeEncoding(String encodedPassword) {
        return false;
    }
}
該接口實現(xiàn)類有下面這幾個

其中常用到的分別有下面這么幾個

BCryptPasswordEncoder:Spring Security 推薦使用的,使用BCrypt強哈希方法來加密。

MessageDigestPasswordEncoder:用作傳統(tǒng)的加密方式加密(支持 MD5、SHA-1、SHA-256...)

DelegatingPasswordEncoder:最常用的,根據(jù)加密類型id進行不同方式的加密,兼容性強

NoOpPasswordEncoder:明文, 不做加密

其他

使用示例 MessageDigestPasswordEncoder

構(gòu)造的時候需要傳入算法字符串,例如 "MD5"、"SHA-1"、"SHA-256"...

String password = "123";

MessageDigestPasswordEncoder encoder = new MessageDigestPasswordEncoder("MD5");
String encode = encoder.encode(password);
System.out.println(encode);
System.out.println(encoder.matches(password,encode) == true ? "相等" : "不相等");

輸出

{EUjIxnT/OVlk5J54s3LaJRuQgwTchm1gduFHTqI0qjo=}4b40375c57c285cc56c7048bb114db23
相等

調(diào)用 encode(..) 加密方法每次都會隨機生成鹽值,所以對相同的明文進行多次加密,每次結(jié)果也是不一樣的。
從上面輸出部分結(jié)合源碼可以的出:加密的最終結(jié)果分為兩部分,鹽值 + MD5(password+鹽值),調(diào)用 matches(..) 方法的時候先從密文中得到鹽值,用該鹽值加密明文和最終密文作對比。

BCryptPasswordEncoder

構(gòu)造的時候可以傳入哈希強度(strength),強度越大計算量就越大,也就意味著越安全,strength 取值區(qū)間[4-31],系統(tǒng)默認是10。

String password = "123";

BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
String encode = encoder.encode(password);
System.out.println(encode);
System.out.println(encoder.matches(password, encode) == true ? "相等" : "不相等");

輸出

$2a$10$lxPfE.Zvat6tejB8Q1QGYu3M9lXUUpiWFYzboeyK64kbfgN9v7iBq
相等

調(diào)用 encode(..) 方法加密跟上面一樣,每次都會隨機生成鹽值,密文也分為兩部分,鹽值和最終加密的結(jié)果,最終對比的時候從密文里面拿出鹽值對明文進行加密,比較最終加密后的結(jié)果。

DelegatingPasswordEncoder

這是 Spring Security 推出的一套兼容方案,根據(jù)加密類型id字符串(idForEncode)去自身緩存的所有加密方式中(idToPasswordEncoder)取出對應(yīng)的加密方案對象對明文進行加密和對應(yīng)密文的對比,只是其密文前面都加上了加密方案id的字符串,具體的咱們看下面代碼演示。

其初始化 Spring Security 提供了一個工廠構(gòu)造方法

public class PasswordEncoderFactories {

    @SuppressWarnings("deprecation")
    public static PasswordEncoder createDelegatingPasswordEncoder() {
        String encodingId = "bcrypt";
        Map encoders = new HashMap<>();
        encoders.put(encodingId, new BCryptPasswordEncoder());
        encoders.put("ldap", new org.springframework.security.crypto.password.LdapShaPasswordEncoder());
        encoders.put("MD4", new org.springframework.security.crypto.password.Md4PasswordEncoder());
        encoders.put("MD5", new org.springframework.security.crypto.password.MessageDigestPasswordEncoder("MD5"));
        encoders.put("noop", org.springframework.security.crypto.password.NoOpPasswordEncoder.getInstance());
        encoders.put("pbkdf2", new Pbkdf2PasswordEncoder());
        encoders.put("scrypt", new SCryptPasswordEncoder());
        encoders.put("SHA-1", new org.springframework.security.crypto.password.MessageDigestPasswordEncoder("SHA-1"));
        encoders.put("SHA-256", new org.springframework.security.crypto.password.MessageDigestPasswordEncoder("SHA-256"));
        encoders.put("sha256", new org.springframework.security.crypto.password.StandardPasswordEncoder());

        return new DelegatingPasswordEncoder(encodingId, encoders);
    }
}

這個工廠的靜態(tài)構(gòu)造方法把常用的幾種方案都注入到緩存中,但是注入的 idForEncode 對應(yīng)的卻是 BCryptPasswordEncoder,這樣系統(tǒng)就可以達到在新存儲密碼可以使用 BCryptPasswordEncoder 加密方案進行加密,但是對于數(shù)據(jù)庫里面以前用其他方式加密的密碼也支持比對。

String password = "123";

PasswordEncoder encoder = PasswordEncoderFactories.createDelegatingPasswordEncoder();
String encode = encoder.encode(password);
System.out.println(encode);
System.out.println(encoder.matches(password, encode) == true ? "相等" : "不相等");

輸出

{bcrypt}$2a$10$Bh23zGZ2YPOsORNexoowb.fX4QH18GEh13eVtZUZvbe2Blx0jIVna
相等

從結(jié)果中可以看出,相比原始的 BCryptPasswordEncoder 密文前面多了加密方式的id。

當然也可以自定義構(gòu)造方法,來制定 DelegatingPasswordEncoder 用其他的方案進行加密。

接下來我們將其指定使用 MD5 方式來加密密碼看看結(jié)果

Map encoders = new HashMap<>();
encoders.put("MD5", new MessageDigestPasswordEncoder("MD5"));
DelegatingPasswordEncoder encoder = new DelegatingPasswordEncoder("MD5", encoders);
String encode = encoder.encode(password);
System.out.println(encode);
System.out.println(encoder.matches(password, encode) == true ? "相等" : "不相等");

輸出

{MD5}{XYwuzP8/lL/a3ASzA9UVM4rFs8lbsLvEoa5ydKER844=}d7f919bfd94554150f8ab3a809209ee3
相等

相比原始的 MessageDigestPasswordEncoder也是密文前面多了加密方式的id。

應(yīng)用

先示范下使用系統(tǒng)的 UserDetailsManager 來演示下簡單的注入

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true, jsr250Enabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    public void configure(WebSecurity web) throws Exception {
        super.configure(web);
    }
    
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
                .withUser("liuchao")
                    .password("{bcrypt}$2a$10$S.hMD3oV60YRIj38lHRhP.e3DAu3OwmssE/u/p2GLqqZ3SVsZA77W")
                    .roles("admin","user")
                    .and()
                .passwordEncoder(passwordEncoder);
    }

    @Bean(value = "passwordEncoder")
    public PasswordEncoder delegatingPasswordEncoder() {
        //構(gòu)造 DelegatingPasswordEncoder 加密方案
        return PasswordEncoderFactories.createDelegatingPasswordEncoder();
    }

    @Autowired
    private PasswordEncoder passwordEncoder;
}

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/73868.html

相關(guān)文章

  • Spring Security 進階-原理

    摘要:過濾器基本都是通過過濾器來完成配置的身份認證權(quán)限認證以及登出。密碼比對通過進行密碼比對注可自定義通過獲取通過獲取生成身份認證通過后最終返回的記錄認證的身份信息 知彼知己方能百戰(zhàn)百勝,用 Spring Security 來滿足我們的需求最好了解其原理,這樣才能隨意拓展,本篇文章主要記錄 Spring Security 的基本運行流程。 過濾器 Spring Security 基本都是通過...

    android_c 評論0 收藏0
  • Spring Security 進階-細節(jié)總結(jié)

    摘要:但是我們最好不要在里面對他進行處理,而是放到配置的權(quán)限異常來處理。記得配置登錄認證前和過程中的一些請求不需要身份認證。登錄認證失敗不能直接拋出錯誤,需要向前端響應(yīng)異常。 關(guān)于 Spring Security 的學習已經(jīng)告一段落了,剛開始接觸該安全框架感覺很迷茫,總覺得沒有 Shiro 靈活,到后來的深入學習和探究才發(fā)現(xiàn)它非常強大。簡單快速集成,基本不用寫任何代碼,拓展起來也非常靈活和強...

    LinkedME2016 評論0 收藏0
  • Spring Security

    摘要:框架具有輕便,開源的優(yōu)點,所以本譯見構(gòu)建用戶管理微服務(wù)五使用令牌和來實現(xiàn)身份驗證往期譯見系列文章在賬號分享中持續(xù)連載,敬請查看在往期譯見系列的文章中,我們已經(jīng)建立了業(yè)務(wù)邏輯數(shù)據(jù)訪問層和前端控制器但是忽略了對身份進行驗證。 重拾后端之Spring Boot(四):使用JWT和Spring Security保護REST API 重拾后端之Spring Boot(一):REST API的搭建...

    keelii 評論0 收藏0
  • Spring Cloud 參考文檔(Spring Cloud Config Server)

    摘要:,這是標記配置文件集版本化的服務(wù)器端特性。要配置對稱密鑰,需要將設(shè)置為秘密字符串或使用環(huán)境變量將其排除在純文本配置文件之外。 Spring Cloud Config Server Spring Cloud Config Server為外部配置提供基于HTTP資源的API(名稱—值對或等效的YAML內(nèi)容),通過使用@EnableConfigServer注解,服務(wù)器可嵌入Spring Bo...

    harryhappy 評論0 收藏0
  • 你和阿里資深架構(gòu)師之間,差的不僅僅是年齡(進階必看)

    摘要:導讀閱讀本文需要有足夠的時間,筆者會由淺到深帶你一步一步了解一個資深架構(gòu)師所要掌握的各類知識點,你也可以按照文章中所列的知識體系對比自身,對自己進行查漏補缺,覺得本文對你有幫助的話,可以點贊關(guān)注一下。目錄一基礎(chǔ)篇二進階篇三高級篇四架構(gòu)篇五擴 導讀:閱讀本文需要有足夠的時間,筆者會由淺到深帶你一步一步了解一個資深架構(gòu)師所要掌握的各類知識點,你也可以按照文章中所列的知識體系對比自身,對自己...

    huaixiaoz 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<