Spring Security 加密密碼

明文保存密碼是不可取的褂萧,可以使用 SHA,BCrypt 等對密碼進(jìn)行加密虐秦。

BCrypt 算法與 MD5/SHA 算法有一個很大的區(qū)別创坞,每次生成的 hash 值都是不同的碗短,就可以免除存儲 salt,暴力破解起來也更困難题涨。BCrypt 加密后的字符長度比較長偎谁,有60位,所以用戶表中密碼字段的長度纲堵,如果打算采用 BCrypt 加密存儲巡雨,字段長度不得低于 68(需要前綴 {bcrypt})。

下面的代碼展示怎么使用 BCrypt 進(jìn)行加密:
import org.junit.Test;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
public class EncryptPassword {
    @Test
    public void encrypt() {
        PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
        for (int i = 0; i < 5; ++i) {
            // 每次生成的密碼都不一樣
            String encryptedPassword = passwordEncoder.encode("Passw0rd");
            System.out.println(encryptedPassword);
            System.out.println(passwordEncoder.matches("Passw0rd", encryptedPassword)); // true
            System.out.println(passwordEncoder.matches("Password", encryptedPassword)); // false
        }
    }
}

輸出:

    
$2a$10$l7vPVeqwb9GiVjURV5J2QO1CM5qxwk00/Ra5qEog0WgP7O5XV0Ble
true
false
$2a$10$jeyMfHF88mNJb9v.mQ7YiuZ8oTU.pHaiKdT1NLOM38eXj7heHZHg2
true
false
$2a$10$ux43/3JcHUC1hszyoJaH0eQhv7LkIVfL7p1cW80WxfxeTr2dUY6kO
true
false
$2a$10$KdUmhaJOJ30klEcKiYT25.fIRPrMs4xONHOQh4JvmpKSjJ8d9.QKG
true
false
$2a$10$gQKUOoFuevnCkoej3.AvAO9YzHKCKYmKuiSfEGHL22piY2FfNDQYu
true
false

隨意取其中任意一個都可以席函,因為每次生成都是不一樣的铐望,所以取第一個就可以了。

Spring Security 使用 BCrypt 加密

Spring Security 4 的時候需要配置 <password-encoder hash="bcrypt"/> 指定加密方式茂附,Spring Security 5 不需要配置了正蛙,而是用戶密碼加前綴的方式表明加密方式,例如

  • {bcrypt}$2a$10$gQKUOoFuevnCkoej3.AvAO9YzHKCKYmKuiSfEGHL22piY2FfNDQYu 說明是使用 BCrypt 進(jìn)行加密的

  • {noop}Passw0rd 則是使用明文保存的密碼 (noop: No Operation)

這樣的好處是同一個系統(tǒng)可以使用多種加密方式何之,遷移用戶到新系統(tǒng)時比較就省事了跟畅。Spring Security 5 默認(rèn)支持的密碼加密方式在 PasswordEncoderFactories 中定義:
public static PasswordEncoder createDelegatingPasswordEncoder() {
    String encodingId = "bcrypt";
    Map<String, PasswordEncoder> encoders = new HashMap<>();
    encoders.put(encodingId, new BCryptPasswordEncoder());
    encoders.put("ldap", new LdapShaPasswordEncoder());
    encoders.put("MD4", new Md4PasswordEncoder());
    encoders.put("MD5", new MessageDigestPasswordEncoder("MD5"));
    encoders.put("noop", NoOpPasswordEncoder.getInstance());
    encoders.put("pbkdf2", new Pbkdf2PasswordEncoder());
    encoders.put("scrypt", new SCryptPasswordEncoder());
    encoders.put("SHA-1", new MessageDigestPasswordEncoder("SHA-1"));
    encoders.put("SHA-256", new MessageDigestPasswordEncoder("SHA-256"));
    encoders.put("sha256", new StandardPasswordEncoder());
    return new DelegatingPasswordEncoder(encodingId, encoders);
}

UserService

從數(shù)據(jù)源取得的密碼是加密后的密碼

    
public class UserService {
    private static Map<String, User> users = new HashMap<String, User>();
    static {
        // 模擬數(shù)據(jù)源,可以是多種溶推,如數(shù)據(jù)庫,LDAP奸攻,從配置文件讀取等
        users.put("admin", new User("admin", "{noop}Passw0rd", "ROLE_ADMIN")); // 密碼是 Passw0rd
        users.put("alice", new User("alice", "{bcrypt}$2a$10$dtA5fPvVJEBHLPp7FZci9uKJL90zF8T1EQZzP9qownQlf130bdBZW", "ROLE_USER")); // 密碼是 Passw0rd
    }
    public User findUserByUsername(String username) {
        return users.get(username);
    }
}

測試

訪問 http://localhost:8080/admin
輸入錯誤的用戶名或密碼蒜危,觀察登陸失敗的頁面
輸入正確的用戶名和密碼,繼續(xù)登陸
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末睹耐,一起剝皮案震驚了整個濱河市辐赞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌硝训,老刑警劉巖响委,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異窖梁,居然都是意外死亡赘风,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門纵刘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來邀窃,“玉大人,你說我怎么就攤上這事假哎∷膊叮” “怎么了鞍历?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長肪虎。 經(jīng)常有香客問我劣砍,道長,這世上最難降的妖魔是什么扇救? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任秆剪,我火速辦了婚禮,結(jié)果婚禮上爵政,老公的妹妹穿的比我還像新娘仅讽。我一直安慰自己,他們只是感情好钾挟,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布洁灵。 她就那樣靜靜地躺著,像睡著了一般掺出。 火紅的嫁衣襯著肌膚如雪徽千。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天汤锨,我揣著相機(jī)與錄音双抽,去河邊找鬼。 笑死闲礼,一個胖子當(dāng)著我的面吹牛牍汹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播柬泽,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼慎菲,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了锨并?” 一聲冷哼從身側(cè)響起露该,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎第煮,沒想到半個月后解幼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡包警,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年撵摆,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片揽趾。...
    茶點(diǎn)故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡台汇,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情苟呐,我是刑警寧澤痒芝,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站牵素,受9級特大地震影響严衬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜笆呆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一请琳、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧赠幕,春花似錦俄精、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至逆屡,卻和暖如春圾旨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背魏蔗。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工砍的, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人莺治。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓廓鞠,卻偏偏與公主長得像,于是被迫代替她去往敵國和親产雹。 傳聞我的和親對象是個殘疾皇子诫惭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容