demo
impo
rt org.springframework.security.crypto.bcrypt.bcryptpasswordencoder;
public
class
bcryptpasswordencoderutils
public
static
void
main
(string[
] args)
}
加密詳解public
static string encodepassword
(string password)
呼叫encode方法進行加密
public string encode
(charsequence rawpassword)
else
}else
return bcrypt.
hashpw
(rawpassword.
tostring()
, salt)
;}
salt:鹽
strength:靜態常量
random:securerandom加密的強隨機數
bcrypt實現了openbsd-style的blowfish密碼的使用(blowfish演算法是乙個64位分組及可變金鑰長度的對稱金鑰分組密碼演算法).
第一次使用需要雜湊加密密碼
呼叫hashpw()方法(參考一)傳入乙個隨機salt bcrypt.hashpw(rawpassword.tostring(), salt)
gensalt()方法接收乙個可選引數,決定hash計算的複雜度.
密碼對比
呼叫matches進行密碼對比
檢查明文密碼是否與已存在的密碼匹配
public
boolean
matches
(charsequence rawpassword, string encodedpassword)
//驗證密碼是否是bcrypt型別if(
!bcrypt_pattern.
matcher
(encodedpassword)
.matches()
)//呼叫checkpw判斷
return bcrypt.
checkpw
(rawpassword.
tostring()
, encodedpassword)
;}
在呼叫checkpw()方法前先hash
public
static
boolean
checkpw
(string plaintext, string hashed)
public
static string hashpw
(string password, string salt)
catch
(unsupportedencodingexception uee)
return
hashpw
(passwordb, salt)
;}
總結:從將已hash的密碼作為鹽,獲取真鹽(初次加密的鹽)加密明文密碼(參考一),然後與加密密碼進行對比
參考一:
public
static string hashpw
(byte passwordb[
], string salt)
int saltlength = salt.
length()
;if(saltlength <28)
if(salt.
charat(0
)!='$'|| salt.
charat(1
)!='2')
throw
newillegalargumentexception
("invalid salt version");
if(salt.
charat(2
)=='$')
off =3;
else
// extract number of rounds
if(salt.
charat
(off +2)
>
'$')
throw
newillegalargumentexception
("missing salt rounds"
);
rounds = integer.
parseint
(salt.
substring
(off, off +2)
);
real_salt = salt.
substring
(off +
3, off +25)
; saltb =
decode_base64
(real_salt, bcrypt_salt_len);if
(minor >=
'a')
// add null terminator
passwordb = arrays.
copyof
(passwordb, passwordb.length +1)
; b =
newbcrypt()
; hashed = b.
crypt_raw
(passwordb, saltb, rounds, minor ==
'x', minor ==
'a'?
0x10000:0
);
rs.("$2");
if(minor >=
'a')
rs.(minor)
; rs.
("$");
if(rounds <
10)
rs.("0"
);
rs.(rounds)
; rs.
("$");
encode_base64
(saltb, saltb.length, rs)
;encode_base64
(hashed, bf_crypt_ciphertext.length *4-
1, rs)
;return rs.
tostring()
;}
spring security 安全框架
本文 http itblood.com spring security security framework.html 安全常識 acegi介紹 以宣告式方式為基於spring的web應用新增認證和授權控制 acegi體系結構 認證管理器 訪問控制管理器。認證 authenticationproce...
SpringSecurity認證流程
在之前的文章 springboot spring security 基本使用及個性化登入配置 中對springsecurity進行了簡單的使用介紹,基本上都是對於介面的介紹以及功能的實現。這一篇文章嘗試從原始碼的角度來上對使用者認證流程做乙個簡單的分析。在具體分析之前,我們可以先看看springse...
SpringSecurity使用技巧
1 鑑權處理頁通常包括四個方面的設定,分別是鑑權失敗 鑑權成功 未鑑權訪問 已鑑權但訪問了受保護許可權。如何自 定義這四類處理。鑑權失敗的預設處理頁面是 spring security login?login error 其預設處理類為 urlauthenticationfailurehandler...