早些年,那會把一個老項目的登入子產品重構,從Shiro轉Spring Security,那時候快速換完後沒多看,最近又在公司做類似同樣的操作,給一個老項目加上Spring Security。是以我決定簡單寫點什麼。
相信用過Spring Security的夥伴們,應該對這個BCryptPasswordEncoder 都有好奇。
為啥好奇, 這個家夥的加密方法encode每次生成的密後密碼都不一樣,但是校驗方法matches卻能準确地去檢驗比對。
不多說,現在一起來看看。
1. 先看encode 這個方法:
不用細看,我們看兩個關鍵資訊:
BCrypt.gensalt
BCrypt.hashpw
沒錯,這個加密算法其實是 強哈希+鹽+密鑰(預設用密碼)。 因為使用到了哈希,是以是不可逆。
這也就能初步明白matches 為什麼隻能用來做校驗比對,而不是直接解密。 這點意味着就算你加密後的密碼洩露了,别人想直接得到明文幾乎是不可能的。
接下來,有必要看hashpw麼,放到下面一起看。
2. 接下來看matches 這個方法:
關注點:
BCrypt.checkpw(rawPassword.toString(), encodedPassword);
沒錯,因為哈希無法逆操作,是以比對過程中也是用了hashpw 。 可以看到了checkpw這個方法,我們傳入的密文其實命名已經是 hashed ,沒錯,這個密文就是一個帶有鹽值的哈希。
hashpw 裡面,前面一大堆都是在校驗密文格式對不對,因為可以看到我們的加密後得到的密文格式是不是有點像?
:
符合格式了就開始截取:
明文有了,鹽值也有了,那麼比對就跟我們一般接口的sign認證一樣了。
簡單的了解就到此吧。
PS: 這個BCryptPasswordEncoder加密&校驗方法當個工具類,導包+啟動類屏蔽Security預設自動裝配,用起來也是可以的。
@SpringBootApplication(exclude = {SecurityAutoConfiguration.class})