spring security中的密碼加密:BCrypt算法工具類BCryptPasswordEncoder

spring security中的密碼加密:BCrypt算法工具類BCryptPasswordEncoder

??spring security中有多種密碼加密方式咨跌,MD5算法的Md5PasswordEncoder沾凄、SHA 算法的ShaPasswordEncoder沙廉,但由于是弱加密算法处面,都被棄用了饺谬。推薦使用的是BCrypt算法的BCryptPasswordEncoder。

一递胧、BCryptPasswordEncoder的使用

(一)添加依賴

??在SpringBoot項(xiàng)目中加入spring security依賴

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

(二)放行請(qǐng)求

??添加了spring security依賴后,所有的請(qǐng)求都被spring security所控制了赡茸,這里只是使用BCrypt密碼加密的部分缎脾,所以需要編寫配置類,配置為所有地址都可以匿名訪問(wèn)占卧。


import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

/**
 * @author chushiyan
 * @email  Y2h1c2hpeWFuMDQxNUAxNjMuY29t(base64)
 * @description
 */

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .antMatchers("/**").permitAll()
            .anyRequest().authenticated()
            .and().csrf().disable();
    }
}

(三)啟動(dòng)類中配置bean

    @Bean
    public BCryptPasswordEncoder getBcryptPasswordEncoder(){
        return new BCryptPasswordEncoder();
    }

(四)加密密碼

// 加密密碼
user.setPassword(bCryptPasswordEncoder.encode(password));

(五)校驗(yàn)密碼

// 參數(shù)一:待檢驗(yàn)的遗菠、未加密的密碼
// 參數(shù)二:從數(shù)據(jù)庫(kù)中查詢出的加密后密碼
bCryptPasswordEncoder.matches(password, userFromDB.getPassword())

二、深入了解BCryptPasswordEncoder

(一)測(cè)試生成密碼

/**
 * @author chushiyan
 * @email  Y2h1c2hpeWFuMDQxNUAxNjMuY29t(base64)
 * @description
 */
@SpringBootTest
class ApplicationTests {

    @Autowired
    private BCryptPasswordEncoder bCryptPasswordEncoder;

    @Test
    public void testBCryptPasswordEncoder() {
        for (int i = 0; i < 10; i++) {
            String password = "123456";
            String hashed = bCryptPasswordEncoder.encode(password);
            System.out.println(hashed);
        }
    }
}

??控制臺(tái)輸出:

$2a$10$A/Jty.uPopRKNL/Pagnhvufb9sPScp74h93qHGxFztBlrzdOJU66a
$2a$10$I4q0m0Tesq5GRLETEyXOPObHaI8JYGohK1m/63KtAKjRjHws1.Fi.
$2a$10$ByPK1poz.JRGSlO/F9CiqexXW2VEgeaScjuQPLPqksLRGv8xtd5uy
$2a$10$vs3Vj7BiQGRnjIWq895CXunLUyDAVRrZccJR/ggMy/nWAiklUxXJC
$2a$10$4LKrbmr4u7q71yPq9PZLxOkCUCSo1Q.o73nfTXauIDCoKBMoFs7vG
$2a$10$Z5VD7fjGmze05VuWMJxVIuPXXO77YIFDVUi/XYQPnb6G3t8mikPJm
$2a$10$T39UcqdG73nfHLiqzYz.tOtTk7efiFUqmaqxew6xHL9gsBgFmpvCi
$2a$10$9VhF9phPI6VKSpy2ne3AteBfCZUBpWEkJoEh2uaGO.yONcl.fmP.2
$2a$10$gZv6eWEQ/TYwwHQJ1Hmex.v8XvcpzzyjIaoWjGOapYLanMMhrYBNW
$2a$10$ZVH0p2D0xRJ2CBIaWzdF5eT.4TKpSwDM7wP/IA4Qbv8u7lzOL7ipe

??為什么密碼都是123456华蜒,而加密后的結(jié)果不一樣辙纬?因?yàn)锽CryptPasswordEncoder中的encode()內(nèi)部調(diào)用BCrypt類隨機(jī)生成了鹽(salt),加了不同的鹽進(jìn)行hash自然不一樣叭喜。

(二)詳解加密后的密碼

$2a$10$A/Jty.uPopRKNL/Pagnhvufb9sPScp74h93qHGxFztBlrzdOJU66a

加密后的密碼長(zhǎng)度為60(所以設(shè)計(jì)數(shù)據(jù)庫(kù)時(shí)得保證該字段長(zhǎng)度不小于60)

說(shuō)明
$ 分割符
$2a BCrypt加密算法版本贺拣,在BCryptPasswordEncoder類內(nèi)部定義了一個(gè)枚舉類,枚舉了3個(gè)加密算法版本:
public enum BCryptVersion {
2A("2a"),
2Y("2y"),
2B("2b");
可以通過(guò)構(gòu)造函數(shù)指定版本:public BCryptPasswordEncoder(BCryptVersion version)
如:new BCryptPasswordEncoder(BCryptPasswordEncoder.BCryptVersion.$2A);
$10 表示10次循環(huán)加鹽salt捂蕴。默認(rèn)10次纵柿,最少4次,最多31次启绰。
可以通過(guò)構(gòu)造函數(shù)指定次數(shù):public BCryptPasswordEncoder(int strength)
10$之后的22位 鹽昂儒。BCryptPasswordEncoder內(nèi)部調(diào)用BCrypt的gensalt()方法隨機(jī)生成
最后的31位 明文密碼password和鹽hash后的值

三、非SpringBoot項(xiàng)目使用BCrypt加密算法

??BCrypt是一個(gè)算法委可,各個(gè)語(yǔ)言都有自己的實(shí)現(xiàn)渊跋。在java中有jBCrypt,spring security中也實(shí)現(xiàn)了BCrypt算法(沒(méi)有依賴jBCrypt)着倾。
??如果不是SpringBoot項(xiàng)目拾酝,就可以使用jBCrypt。

??jBCrypt官網(wǎng)

??官網(wǎng)示例:

// Hash a password for the first time
String hashed = BCrypt.hashpw(password, BCrypt.gensalt());

// gensalt's log_rounds parameter determines the complexity
// the work factor is 2**log_rounds, and the default is 10
String hashed = BCrypt.hashpw(password, BCrypt.gensalt(12));

// Check that an unencrypted password matches one that has
// previously been hashed
if (BCrypt.checkpw(candidate, hashed))
    System.out.println("It matches");
else
    System.out.println("It does not match");

導(dǎo)包:

        <dependency>
            <groupId>org.mindrot</groupId>
            <artifactId>jbcrypt</artifactId>
            <version>0.4</version>
        </dependency>

或者加入jbcrypt-0.4.jar(這個(gè)包其實(shí)就BCrypt.java這一個(gè)類)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末卡者,一起剝皮案震驚了整個(gè)濱河市蒿囤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌崇决,老刑警劉巖材诽,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異恒傻,居然都是意外死亡脸侥,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門盈厘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)睁枕,“玉大人,你說(shuō)我怎么就攤上這事⊥庥觯” “怎么了注簿?”我有些...
    開封第一講書人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)跳仿。 經(jīng)常有香客問(wèn)我诡渴,道長(zhǎng),這世上最難降的妖魔是什么塔嬉? 我笑而不...
    開封第一講書人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮租悄,結(jié)果婚禮上谨究,老公的妹妹穿的比我還像新娘。我一直安慰自己泣棋,他們只是感情好胶哲,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著潭辈,像睡著了一般鸯屿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上把敢,一...
    開封第一講書人閱讀 49,741評(píng)論 1 289
  • 那天寄摆,我揣著相機(jī)與錄音,去河邊找鬼修赞。 笑死婶恼,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的柏副。 我是一名探鬼主播勾邦,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼割择!你這毒婦竟也來(lái)了眷篇?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤荔泳,失蹤者是張志新(化名)和其女友劉穎蕉饼,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體玛歌,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡椎椰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡此熬,死狀恐怖权均,靈堂內(nèi)的尸體忽然破棺而出垛叨,到底是詐尸還是另有隱情坏瘩,我是刑警寧澤介牙,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布银受,位于F島的核電站圈膏,受9級(jí)特大地震影響塔猾,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜稽坤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一丈甸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧尿褪,春花似錦睦擂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至摆马,卻和暖如春臼闻,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背囤采。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工述呐, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蕉毯。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓市埋,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親恕刘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子缤谎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348