欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

很簡(jiǎn)單,我們自己實(shí)現(xiàn)一個(gè)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;
        }
    }
}

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

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

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

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

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

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

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

spring security的BCryptPasswordEncoder問(wèn)題

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

不多說(shuō),現(xiàn)在一起來(lái)看看。

1. 先看encode這個(gè)方法

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

  • BCrypt.gensalt
  • BCrypt.hashpw

沒(méi)錯(cuò),這個(gè)加密算法其實(shí)是 強(qiáng)哈希+鹽+密鑰(默認(rèn)用密碼)。 因?yàn)槭褂玫搅斯#允遣豢赡妗?/p>

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

 接下來(lái),有必要看hashpw么,放到下面一起看。

2. 接下來(lái)看matches這個(gè)方法

關(guān)注點(diǎn):

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

 

沒(méi)錯(cuò),因?yàn)楣o(wú)法逆操作,所以匹配過(guò)程中也是用了hashpw 。 可以看到了checkpw這個(gè)方法,我們傳入的密文其實(shí)命名已經(jīng)是 hashed ,沒(méi)錯(cuò),這個(gè)密文就是一個(gè)帶有鹽值的哈希。

hashpw 里面,前面一大堆都是在校驗(yàn)密文格式對(duì)不對(duì),因?yàn)榭梢钥吹轿覀兊募用芎蟮玫降拿芪母袷绞遣皇怯悬c(diǎn)像?

符合格式了就開(kāi)始截?。?/p>

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

簡(jiǎn)單的了解就到此吧。 

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

@SpringBootApplication(exclude = {SecurityAutoConfiguration.class})

總結(jié)

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

相關(guān)文章

  • java操作gaussDB數(shù)據(jù)庫(kù)的實(shí)現(xiàn)示例

    java操作gaussDB數(shù)據(jù)庫(kù)的實(shí)現(xiàn)示例

    本文主要介紹了java操作gaussDB數(shù)據(jù)庫(kù)的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • Java鎖機(jī)制Lock用法示例

    Java鎖機(jī)制Lock用法示例

    這篇文章主要介紹了Java鎖機(jī)制Lock用法,結(jié)合具體實(shí)例形式分析了Java鎖機(jī)制的相關(guān)上鎖、釋放鎖、隱式鎖、顯式鎖等概念與使用技巧,需要的朋友可以參考下
    2018-08-08
  • java學(xué)習(xí)筆記之馬踏棋盤(pán)算法

    java學(xué)習(xí)筆記之馬踏棋盤(pán)算法

    這篇文章主要為大家詳細(xì)介紹了java學(xué)習(xí)筆記之馬踏棋盤(pán)算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Java連接SqlServer錯(cuò)誤的完美解決方法

    Java連接SqlServer錯(cuò)誤的完美解決方法

    我們?cè)谧鯦ava或者C#連接數(shù)據(jù)庫(kù)的時(shí)候,常常遇到連接SqlServer失敗的問(wèn)題,明明檢查了好幾遍代碼沒(méi)問(wèn)題了,還是連接不上,下面這篇文章主要給大家介紹了關(guān)于Java連接SqlServer錯(cuò)誤的完美解決方法,需要的朋友可以參考下
    2023-04-04
  • Java中Date和LocalDate區(qū)別與介紹

    Java中Date和LocalDate區(qū)別與介紹

    本文主要介紹了Java中Date和LocalDate區(qū)別與介紹,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • java中 spring 定時(shí)任務(wù) 實(shí)現(xiàn)代碼

    java中 spring 定時(shí)任務(wù) 實(shí)現(xiàn)代碼

    java中 spring 定時(shí)任務(wù) 實(shí)現(xiàn)代碼,需要的朋友可以參考一下
    2013-03-03
  • spring中@ControllerAdvice 注解的使用

    spring中@ControllerAdvice 注解的使用

    @ControllerAdvice注解是Spring3.2中新增的注解,主要用于Controller的全局配置,本文就來(lái)介紹一下spring中@ControllerAdvice 注解的使用,感興趣的可以了解一下
    2024-09-09
  • Spring如何使用注解的方式創(chuàng)建bean

    Spring如何使用注解的方式創(chuàng)建bean

    這篇文章主要介紹了Spring如何使用注解的方式創(chuàng)建bean,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Tree組件實(shí)現(xiàn)支持50W數(shù)據(jù)方法剖析

    Tree組件實(shí)現(xiàn)支持50W數(shù)據(jù)方法剖析

    這篇文章主要為大家介紹了Tree組件實(shí)現(xiàn)支持50W數(shù)據(jù)的方法剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • idea中如何全局搜索class文件或者字符串

    idea中如何全局搜索class文件或者字符串

    這篇文章主要介紹了idea中如何實(shí)現(xiàn)全局搜索class文件或者字符串問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03

最新評(píng)論