天天看點

淺談Spring Security的BCryptPasswordEncoder

早些年,那會把一個老項目的登入子產品重構,從Shiro轉Spring Security,那時候快速換完後沒多看,最近又在公司做類似同樣的操作,給一個老項目加上Spring Security。是以我決定簡單寫點什麼。

相信用過Spring Security的夥伴們,應該對這個BCryptPasswordEncoder 都有好奇。

為啥好奇, 這個家夥的加密方法encode每次生成的密後密碼都不一樣,但是校驗方法matches卻能準确地去檢驗比對。

不多說,現在一起來看看。

1. 先看encode 這個方法:

淺談Spring Security的BCryptPasswordEncoder

不用細看,我們看兩個關鍵資訊:

BCrypt.gensalt
           
BCrypt.hashpw
           

 沒錯,這個加密算法其實是 強哈希+鹽+密鑰(預設用密碼)。 因為使用到了哈希,是以是不可逆。

這也就能初步明白matches 為什麼隻能用來做校驗比對,而不是直接解密。 這點意味着就算你加密後的密碼洩露了,别人想直接得到明文幾乎是不可能的。

 接下來,有必要看hashpw麼,放到下面一起看。

2. 接下來看matches 這個方法:

淺談Spring Security的BCryptPasswordEncoder

關注點:

BCrypt.checkpw(rawPassword.toString(), encodedPassword);
           
淺談Spring Security的BCryptPasswordEncoder

沒錯,因為哈希無法逆操作,是以比對過程中也是用了hashpw 。 可以看到了checkpw這個方法,我們傳入的密文其實命名已經是 hashed ,沒錯,這個密文就是一個帶有鹽值的哈希。

hashpw 裡面,前面一大堆都是在校驗密文格式對不對,因為可以看到我們的加密後得到的密文格式是不是有點像?

淺談Spring Security的BCryptPasswordEncoder

符合格式了就開始截取:

淺談Spring Security的BCryptPasswordEncoder

明文有了,鹽值也有了,那麼比對就跟我們一般接口的sign認證一樣了。 

簡單的了解就到此吧。 

PS: 這個BCryptPasswordEncoder加密&校驗方法當個工具類,導包+啟動類屏蔽Security預設自動裝配,用起來也是可以的。

淺談Spring Security的BCryptPasswordEncoder
@SpringBootApplication(exclude = {SecurityAutoConfiguration.class})      
淺談Spring Security的BCryptPasswordEncoder

繼續閱讀