2 回答

TA貢獻(xiàn)1817條經(jīng)驗(yàn) 獲得超14個(gè)贊
非常簡(jiǎn)單 - 只需將您的weDoNotWantEncryption()
函數(shù)替換為返回 BCrypt 實(shí)例的函數(shù):
@Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); }
BCryptPasswordEncoder
實(shí)現(xiàn)PasswordEncoder
(顧名思義),因此已經(jīng)為encode()
和定義了好的方法matches()
。
請(qǐng)注意,這將(當(dāng)然)使當(dāng)前在您的數(shù)據(jù)庫中的任何密碼都無法使用,盡管鑒于這些密碼以明文形式存儲(chǔ),我假設(shè)(并希望/祈禱)這是在測(cè)試環(huán)境中,而不是在生產(chǎn)環(huán)境中。

TA貢獻(xiàn)1860條經(jīng)驗(yàn) 獲得超9個(gè)贊
當(dāng)我們加密存儲(chǔ)密碼時(shí),我們通常對(duì)它們進(jìn)行哈希處理,以便它是一種單向加密,即即使我們知道哈希算法,我們也無法從加密的密碼中檢索到原始密碼。
我們遵循的主要程序如下。
取字符串“密碼”
向密碼添加鹽(一個(gè)隨機(jī)字符串,以確保具有相同密碼的多個(gè)用戶沒有相同的散列密碼):隨機(jī)鹽:“A3fcherf42”,生成的字符串:“A3fcherf42password”
使用加密算法散列此字符串,您可能會(huì)得到:“d143d1w132dd23dsgrg5”
將鹽附加到加密密碼以供將來驗(yàn)證用戶登錄時(shí)使用:“A3fcherf42d143d1w132dd23dsgrg5”
用用戶id保存在數(shù)據(jù)庫中
現(xiàn)在驗(yàn)證用戶登錄:
從登錄表單中獲取密碼,即“密碼”
讀取存儲(chǔ)在數(shù)據(jù)庫中的哈希值:“A3fcherf42d143d1w132dd23dsgrg5”
從存儲(chǔ)的散列密碼中提取鹽:“A3fcherf42”
將鹽附加到用戶輸入的密碼:“A3fcherf42password”
哈希密碼,現(xiàn)在生成的哈希值應(yīng)該與存儲(chǔ)在數(shù)據(jù)庫中的哈希值匹配。
使用 Bcrypt 執(zhí)行此操作是一個(gè)簡(jiǎn)單的過程,因?yàn)榇蟛糠止ぷ鞫加蓭焯幚?。我解釋了上面的?chǎng)景,以便您對(duì)幕后發(fā)生的事情有一個(gè)很好的理解。您執(zhí)行以下操作以生成并保存散列密碼。
String?pw_hash?=?BCrypt.hashpw(plain_password,?BCrypt.gensalt());
現(xiàn)在您有了散列字符串,將其存儲(chǔ)到數(shù)據(jù)庫中。
當(dāng)用戶登錄時(shí),您獲取他輸入的密碼、數(shù)據(jù)庫存儲(chǔ)的哈希字符串,并對(duì)其進(jìn)行驗(yàn)證。
if?(BCrypt.checkpw(entered_pw,?stored_hash)) ????return?True;
添加回答
舉報(bào)