隻知道這個的用法,心裡着實難受,是以看了看底層,簡單做下總結。
BCryptPasswordEncoder算法和shiro的差別:
其實和shiro中差別就是shiro 中的salt是自己指定的,然後存到資料庫,BCryptPasswordEncoder加密算法是随機生成的和加密後的密碼一起拼接到一起存到資料庫。
舉個我調試的時候的例子:
注冊時候調用encode(明文密碼)
首先第一次注冊的時候,會從背景先擷取随機鹽VM/wbXrA4UYbITsQKOHNF. 這個每一次的不一定因為随機的。
對明文密碼進行加密,我輸入的密碼 123 用上邊的随機鹽加密後得到HBp2Bmiej/q/iggq/g6DMwcGlh3wxwi ,
然後拼接到一起 $2a$10$VM/wbXrA4UYbITsQKOHNF.HBp2Bmiej/q/iggq/g6DMwcGlh3wxwi 存進資料庫對應的密碼的字段。
登陸的時候matches(明文密碼,資料庫中加密的密碼)
之後登入的時候除了前端傳過來的明文密碼,從資料庫中找到加密的密碼,因為這個加密的密碼中有加密時候的鹽。
從加密的密碼中把鹽抽取出來VM/wbXrA4UYbITsQKOHNF. ,然後$2a$10$(這個都是在根據前端傳來的明文密碼生成加密密碼的時候經過一些判斷加上的) +鹽 + 用鹽和前端傳來的明文密碼生成新的加密密碼
然後用新的加密密碼和 資料庫中的加密密碼進行比對檢視是否相等,其實這時候如果密碼正确,兩個加密密碼的字元串是相等的。
rememberme原理
當設定這個rememberme之後,登入的時候會生成JSESSION 和 remember-me兩個字段給前端。
remember的生成過程
Base64(Base64(使用者名):Base64(過期時間):Base64(使用者名和密碼和過期時間加密))