SpringSecurity加密和匹配過程分析

2021-09-22 02:33:03 字數 3336 閱讀 5939

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...