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

使用spring?security?BCryptPasswordEncoder接入系統(tǒng)

 更新時間:2023年08月25日 10:31:58   作者:kaili230  
這篇文章主要介紹了使用spring?security?BCryptPasswordEncoder接入系統(tǒng)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

spring security BCryptPasswordEncoder接入系統(tǒng)

通常情況下,在新系統(tǒng)中使用BCrypt加密不需要考慮太多,但老系統(tǒng)由于存在大量舊數(shù)據(jù),草率接入會導(dǎo)致老用戶無法登錄,這種情況該怎么解決?

很簡單,我們自己實現(xiàn)一個PasswordEncoder 并繼承BCrpytPasswordEncoder即可。

@Component
public class MyPasswordEncoder extends BCryptPasswordEncoder {
    private final Log logger = LogFactory.getLog(this.getClass());
    // BCrypt 密文的正則表達(dá)式
    private Pattern BCRYPT_PATTERN = Pattern.compile("\\A\\$2(a|y|b)?\\$(\\d\\d)\\$[./0-9A-Za-z]{53}");
    @Override
    public boolean matches(CharSequence rawPassword, String encodedPassword) {
        if (rawPassword == null) {
            throw new IllegalArgumentException("rawPassword cannot be null");
        } else if (encodedPassword != null && encodedPassword.length() != 0) {
            if (!this.BCRYPT_PATTERN.matcher(encodedPassword).matches()) {
                // TODO 如果密碼不是BCrypt 密文 do something
                return ...;
            } else {
                return BCrypt.checkpw(rawPassword.toString(), encodedPassword);
            }
        } else {
            this.logger.warn("Empty encoded password");
            return false;
        }
    }
}

在這個PasswordEncoder中,只有當(dāng)密碼不是BCrypt密文時,才啟用自定義的匹配邏輯,

其余還是沿用原來的方案,即可輕松達(dá)到兼容的目的。

再進(jìn)一步,如果我們不僅想要兼容,還想將不安全的舊密碼無縫修改成BCrypt密文,該如何操作呢?這是個很好的問題。

如果舊密碼都是未經(jīng)任何加密的明文,也許“跑庫”修改是非常好的一種選擇,但并非所有系統(tǒng)都有這么理想的狀態(tài)。

假如舊密碼都是被散列加密過的,那么可以使用下列兩種選擇:

1.使用增量更新的方法。當(dāng)用戶輸入的密碼正確時,判斷數(shù)據(jù)庫中的密碼是否為BCrypt密文,如果不是,則嘗試使用用戶輸入的密碼重新生成BCrpyt密文并寫回數(shù)據(jù)庫。

2.以舊的加密方案作為基礎(chǔ)接入BCrpyt加密,eg: 舊的方案是MD5加密,即數(shù)據(jù)庫中的所有密碼都是MD5形式的密碼,那么直接把這些密碼當(dāng)作明文,先“跑庫”生成BCrypt密文,再使用encode和matches兩個方法在執(zhí)行BCrypt加密之前都先用MD5運算一遍即可。

spring security的BCryptPasswordEncoder問題

早些年,那會把一個老項目的登錄模塊重構(gòu),從Shiro轉(zhuǎn)Spring Security,那時候快速換完后沒多看,最近又在公司做類似同樣的操作,給一個老項目加上Spring Security。所以我決定簡單寫點什么。相信用過Spring Security的伙伴們,應(yīng)該對這個BCryptPasswordEncoder 都有好奇。為啥好奇, 這個家伙的加密方法encode每次生成的密后密碼都不一樣,但是校驗方法matches卻能準(zhǔn)確地去檢驗匹配。

不多說,現(xiàn)在一起來看看。

1. 先看encode這個方法

不用細(xì)看,我們看兩個關(guān)鍵信息:

  • BCrypt.gensalt
  • BCrypt.hashpw

沒錯,這個加密算法其實是 強哈希+鹽+密鑰(默認(rèn)用密碼)。 因為使用到了哈希,所以是不可逆。

這也就能初步明白matches 為什么只能用來做校驗匹配,而不是直接解密。 這點意味著就算你加密后的密碼泄露了,別人想直接得到明文幾乎是不可能的。

 接下來,有必要看hashpw么,放到下面一起看。

2. 接下來看matches這個方法

關(guān)注點:

BCrypt.checkpw(rawPassword.toString(), encodedPassword);

 

沒錯,因為哈希無法逆操作,所以匹配過程中也是用了hashpw 。 可以看到了checkpw這個方法,我們傳入的密文其實命名已經(jīng)是 hashed ,沒錯,這個密文就是一個帶有鹽值的哈希。

hashpw 里面,前面一大堆都是在校驗密文格式對不對,因為可以看到我們的加密后得到的密文格式是不是有點像?

符合格式了就開始截?。?/p>

明文有了,鹽值也有了,那么匹配就跟我們一般接口的sign認(rèn)證一樣了。 

簡單的了解就到此吧。 

PS: 這個BCryptPasswordEncoder加密&校驗方法當(dāng)個工具類,導(dǎo)包+啟動類屏蔽Security默認(rèn)自動裝配,用起來也是可以的。

@SpringBootApplication(exclude = {SecurityAutoConfiguration.class})

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring 框架中注入或替換方法實現(xiàn)

    Spring 框架中注入或替換方法實現(xiàn)

    這篇文章主要介紹了Spring 框架中注入或替換方法實現(xiàn),非常不錯,具有參考借鑒價值,感興趣的朋友跟隨腳本之家小編一起學(xué)習(xí)吧
    2018-05-05
  • 手把手教你搭建第一個Spring Batch項目的步驟

    手把手教你搭建第一個Spring Batch項目的步驟

    這篇文章主要介紹了手把手教你搭建第一個Spring Batch項目的步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Spring security權(quán)限配置與使用大全

    Spring security權(quán)限配置與使用大全

    Spring Security 本質(zhì)上是借助一系列的 Servlet Filter來提供各種安全性功能,但這并不需要我們手動去添加或者創(chuàng)建多個Filter,本文重點給大家介紹spring-security的配置與使用及實現(xiàn)方式,感興趣的朋友一起看看吧
    2021-09-09
  • Java中四種引用詳解

    Java中四種引用詳解

    這篇文章主要為大家介紹了Java中的四種引用,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • java合成模式之神奇的樹結(jié)構(gòu)

    java合成模式之神奇的樹結(jié)構(gòu)

    這篇文章主要介紹了java合成模式,文中運用大量的代碼進(jìn)行詳細(xì)講解,希望大家看完本文后能學(xué)習(xí)到相關(guān)的知識,需要的朋友可以參考一下
    2021-08-08
  • Java微信二次開發(fā)(一) Java微信請求驗證功能

    Java微信二次開發(fā)(一) Java微信請求驗證功能

    這篇文章主要為大家詳細(xì)介紹了Java微信二次開發(fā)第一篇,Java微信請求驗證功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • Java使用多線程異步執(zhí)行批量更新操作方法

    Java使用多線程異步執(zhí)行批量更新操作方法

    這篇文章主要介紹了Java使用多線程異步執(zhí)行批量更新操作,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • Java開發(fā)學(xué)習(xí)之Bean的生命周期詳解

    Java開發(fā)學(xué)習(xí)之Bean的生命周期詳解

    從創(chuàng)建到消亡的完整過程,例如人從出生到死亡的整個過程就是一個生命周期。本文將通過示例為大家詳細(xì)講講Bean的生命周期,感興趣的可以學(xué)習(xí)一下
    2022-06-06
  • Springboot實現(xiàn)頁面間跳轉(zhuǎn)功能

    Springboot實現(xiàn)頁面間跳轉(zhuǎn)功能

    這篇文章主要介紹了Springboot實現(xiàn)頁面間跳轉(zhuǎn)功能,本文給大家分享兩種方式,方法一和方法二是不沖突的,但是通常情況下如果用方法二addViewControllers,需要把方法一所寫的Controller類給注釋掉,需要的朋友可以參考下
    2023-10-10
  • 關(guān)于SpringBoot配置文件application.properties的路徑問題

    關(guān)于SpringBoot配置文件application.properties的路徑問題

    這篇文章主要介紹了關(guān)于SpringBoot配置文件application.properties的路徑問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08

最新評論

凤翔县| 保靖县| 邹平县| 芷江| 九台市| 类乌齐县| 石屏县| 油尖旺区| 西贡区| 滨海县| 三台县| 寿阳县| 肃宁县| 合江县| 贵溪市| 瓦房店市| 龙胜| 新郑市| 邵武市| 临江市| 虞城县| 东丽区| 辉南县| 紫金县| 七台河市| 浮山县| 徐水县| 城市| 固始县| 双牌县| 隆回县| 三门县| 科技| 伊吾县| 太原市| 铜陵市| 信丰县| 永胜县| 荔波县| 开化县| 肥城市|