BCryptPasswordEncoder加密、驗證策略

通過查看源碼,瞭解PasswordEncoder加密以及驗證密碼(數據庫存儲的加密密碼與用戶輸入的密碼比較)的流程、方式。

加密:

 BCryptPasswordEncoder類有三個構造方法,影響了鹽的生成,如果在生成BCryptPasswordEncoder對象的時候沒有指定任何參數(或只指定了一個參數),BCrypt會提供默認值,最終都會調用BCrypt.gensalt(strength, random)方法來生成鹽。接着看BCrypt類的hashpw()方法,在這個方法中根據salt值和明文密碼來生成密文密碼。具體的生成細節就不再展示了,有興趣的可以自己去看。    需要記住的是,它是先 生成鹽值,根據鹽值以及明文密碼 生成密文。

說完了加密方法,下面看看解密。BCryptPasswordEncoder的matches()方法代碼如下:

先是針對從數據庫拿到的密文密碼做兩個 if 驗證。在滿足驗證的情況下,調用BCrypt.checkpw()方法驗證用戶輸入的登錄密碼是否與數據庫中存儲的密文密碼一致。進入到BCrypt中看一看這個具體的驗證方法:

我們可以看到在紅框部分,用作返回值的方法的第二個參數是hashpw方法。在上文的介紹中我們知道hashpw方法是用來加密的,第一個參數代表需要加密的明文密碼,第二個參數是鹽值。也就是說在驗證過程中,將用戶輸入的登錄密碼作爲第一個參數,用從數據庫取出的密文密碼作爲鹽值,由此生成的密碼,與數據庫中存儲的密碼的生成策略相同。接着把二者(已加密的用戶登錄密碼和數據庫存儲的密碼)作爲參數傳遞到黑色方框方法裏得到驗證結果。

至此,關於BCryptPasswordEncoder類的密碼加密、解密介紹完畢。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章