Spring Security使用多種加密方式進(jìn)行密碼校驗(yàn)的代碼示例
探索密碼校驗(yàn)技術(shù):Spring Security中的多種加密方式
在Web應(yīng)用中,密碼的安全存儲(chǔ)和驗(yàn)證是至關(guān)重要的。本文將通過一個(gè)具體的代碼示例,介紹和總結(jié)如何在Spring Security中使用多種加密方式進(jìn)行密碼校驗(yàn)。我們將重點(diǎn)講解BCrypt和MD5兩種加密方式,以及如何使用代理類來(lái)統(tǒng)一管理這些加密方式。
示例代碼
以下是我們將分析的核心代碼段:
package com.example; import org.apache.commons.codec.digest.DigestUtils; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.DelegatingPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import java.util.HashMap; import java.util.Map; public class PasswordCheckExample { /** * 代理類 */ private static final PasswordEncoder PASSWORDENCODER; static { String defaultEncodeId = "bcrypt"; PasswordEncoder md5 = new DigestMD5PasswordEncoder(); Map<String, PasswordEncoder> encoders = new HashMap<>(); encoders.put(defaultEncodeId, new BCryptPasswordEncoder()); encoders.put("MD5", md5); DelegatingPasswordEncoder passwordEncoder = new DelegatingPasswordEncoder(defaultEncodeId, encoders); passwordEncoder.setDefaultPasswordEncoderForMatches(md5); PASSWORDENCODER = passwordEncoder; } public static void main(String[] args) { // 用戶輸入的明文密碼 String rawPassword = "123123"; // 從數(shù)據(jù)庫(kù)中讀取的已加密的密碼 String encodedPassword = "{bcrypt}$2a$10$S9DHL4DrdO/zhJPM34lm..5CChFbmLThSPdOqweyVh6LLQG73ZeNa"; // 示例密文 // 驗(yàn)證密碼,返回 true 表示匹配,false 表示不匹配 boolean matches = PASSWORDENCODER.matches(rawPassword, encodedPassword); System.out.println("密碼匹配結(jié)果: " + matches); } /** * PasswordEncoder - MD5 */ private static class DigestMD5PasswordEncoder implements PasswordEncoder { @Override public String encode(CharSequence rawPassword) { return DigestUtils.md5Hex((String) rawPassword); } @Override public boolean matches(CharSequence rawPassword, String encodedPassword) { return encodedPassword.equals(encode(rawPassword)); } } }
主要技術(shù)解析
BCryptPasswordEncoder:
- Spring Security 提供的強(qiáng)加密算法。
- 通過
new BCryptPasswordEncoder()
創(chuàng)建實(shí)例,用于密碼加密和驗(yàn)證。 - 優(yōu)點(diǎn):安全性高,包含鹽值(salt),防止彩虹表攻擊。
DigestUtils.md5Hex:
- Apache Commons Codec 提供的MD5加密工具。
DigestUtils.md5Hex(String)
用于將明文密碼轉(zhuǎn)換為MD5加密后的字符串。- 優(yōu)點(diǎn):加密速度快;缺點(diǎn):安全性相對(duì)較低,不包含鹽值,容易受到彩虹表攻擊。
DelegatingPasswordEncoder:
- Spring Security 提供的代理類,用于支持多種密碼加密方式。
- 通過
new DelegatingPasswordEncoder(defaultEncodeId, encoders)
創(chuàng)建實(shí)例。 - 可以設(shè)置默認(rèn)的加密方式以及其他可選的加密方式。
示例代碼解析
- 定義代理類:
private static final PasswordEncoder PASSWORDENCODER; static { String defaultEncodeId = "bcrypt"; PasswordEncoder md5 = new DigestMD5PasswordEncoder(); Map<String, PasswordEncoder> encoders = new HashMap<>(); encoders.put(defaultEncodeId, new BCryptPasswordEncoder()); encoders.put("MD5", md5); DelegatingPasswordEncoder passwordEncoder = new DelegatingPasswordEncoder(defaultEncodeId, encoders); passwordEncoder.setDefaultPasswordEncoderForMatches(md5); PASSWORDENCODER = passwordEncoder; }
- 定義一個(gè)靜態(tài)的
PASSWORDENCODER
變量,用于統(tǒng)一管理密碼的加密和驗(yàn)證。 - 創(chuàng)建
BCryptPasswordEncoder
和自定義的DigestMD5PasswordEncoder
實(shí)例。 - 使用
DelegatingPasswordEncoder
代理類,將上述兩種加密方式進(jìn)行統(tǒng)一管理,并設(shè)置默認(rèn)的加密方式為 BCrypt。
好的,我們繼續(xù)。
- 定義一個(gè)靜態(tài)的
驗(yàn)證密碼
String encodedPassword = "{bcrypt}$2a$10$S9DHL4DrdO/zhJPM34lm..5CChFbmLThSPdOqweyVh6LLQG73ZeNa"; // 示例密文 boolean matches = PASSWORDENCODER.matches(rawPassword, encodedPassword); System.out.println("密碼匹配結(jié)果: " + matches); }
rawPassword
是用戶輸入的明文密碼。encodedPassword
是從數(shù)據(jù)庫(kù)中讀取的已加密的密碼,格式為{bcrypt}密文
,其中{bcrypt}
標(biāo)識(shí)了使用的是 BCrypt 算法。- 使用
PASSWORDENCODER.matches(rawPassword, encodedPassword)
方法來(lái)驗(yàn)證用戶輸入的密碼是否與數(shù)據(jù)庫(kù)中的加密密碼匹配。
自定義MD5加密類
private static class DigestMD5PasswordEncoder implements PasswordEncoder { @Override public String encode(CharSequence rawPassword) { return DigestUtils.md5Hex((String) rawPassword); } @Override public boolean matches(CharSequence rawPassword, String encodedPassword) { return encodedPassword.equals(encode(rawPassword)); } }
- 自定義的
DigestMD5PasswordEncoder
實(shí)現(xiàn)了PasswordEncoder
接口。 encode
方法用于將明文密碼轉(zhuǎn)換為 MD5 加密后的字符串。matches
方法用于驗(yàn)證輸入的明文密碼是否與加密后的密碼匹配。
總結(jié)
通過上面的代碼示例,我們了解了如何在Spring Security中使用多種加密方式進(jìn)行密碼校驗(yàn),并且如何通過 DelegatingPasswordEncoder
代理類統(tǒng)一管理這些加密方式。以下是本文總結(jié)的主要技術(shù)點(diǎn):
- BCryptPasswordEncoder:提供強(qiáng)加密和高安全性的密碼加密方式。
- DigestUtils.md5Hex:提供快速但相對(duì)不安全的MD5加密方式。
- DelegatingPasswordEncoder:Spring Security提供的代理類,可以同時(shí)支持多種加密方式,并設(shè)置默認(rèn)的加密方式。
- 自定義PasswordEncoder:可以根據(jù)需要實(shí)現(xiàn)自己的密碼加密和驗(yàn)證邏輯。
結(jié)語(yǔ)
本文通過一個(gè)具體的代碼示例,詳細(xì)介紹了如何在Spring Security中實(shí)現(xiàn)多種加密方式的密碼校驗(yàn)。如果你對(duì)密碼加密和驗(yàn)證有更多的需求或問題,建議進(jìn)一步閱讀Spring Security的官方文檔,或者參考相關(guān)的開源項(xiàng)目。
以上就是Spring Security使用多種加密方式進(jìn)行密碼校驗(yàn)的代碼示例的詳細(xì)內(nèi)容,更多關(guān)于Spring Security加密方式的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- springsecurity實(shí)現(xiàn)攔截器的使用示例
- SpringSecurity整合JWT的使用示例
- SpringSecurity攔截器鏈的使用詳解
- SpringSecurity實(shí)現(xiàn)權(quán)限認(rèn)證與授權(quán)的使用示例
- SpringSecurity默認(rèn)登錄頁(yè)的使用示例教程
- 使用SpringSecurity+defaultSuccessUrl不跳轉(zhuǎn)指定頁(yè)面的問題解決方法
- SpringSecurity入門使用教程
- springsecurity實(shí)現(xiàn)用戶登錄認(rèn)證快速使用示例代碼(前后端分離項(xiàng)目)
- Spring Security 使用 OncePerRequestFilter 過濾器校驗(yàn)登錄過期、請(qǐng)求日志等操作
- 新版SpringSecurity5.x使用與配置詳解
相關(guān)文章
使用java實(shí)現(xiàn)各種數(shù)據(jù)統(tǒng)計(jì)圖(柱形圖,餅圖,折線圖)
用Jfree實(shí)現(xiàn)條形柱狀圖表,java代碼實(shí)現(xiàn)??山?jīng)常用于報(bào)表的制作,代碼自動(dòng)生成后可以自由查看。可以自由配置圖表的各個(gè)屬性,用來(lái)達(dá)到自己的要求和目的。本文給大家介紹使用java實(shí)現(xiàn)各種數(shù)據(jù)統(tǒng)計(jì)圖(柱形圖,餅圖,折線圖),需要的朋友可以參考下2015-10-10idea創(chuàng)建JAVA Class時(shí)自動(dòng)生成頭部文檔注釋的方法
這篇文章主要介紹了idea創(chuàng)建JAVA Class時(shí)自動(dòng)生成頭部文檔注釋的方法,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12Spring實(shí)戰(zhàn)之注入嵌套Bean操作示例
這篇文章主要介紹了Spring實(shí)戰(zhàn)之注入嵌套Bean操作,結(jié)合實(shí)例形式分析了嵌套Bean相關(guān)配置與使用操作技巧,需要的朋友可以參考下2019-11-11feign服務(wù)端發(fā)現(xiàn)異??蛻舳颂幚淼姆椒ń榻B
這篇文章主要給大家介紹了關(guān)于feign服務(wù)端發(fā)現(xiàn)異??蛻舳颂幚淼姆椒ǎ闹型ㄟ^示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用feign具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07基于javamelody監(jiān)控springboot項(xiàng)目過程詳解
這篇文章主要介紹了基于javamelody監(jiān)控springboot項(xiàng)目過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11關(guān)于Spring @Bean 相同加載順序不同結(jié)果不同的問題記錄
本文主要探討了在Spring 5.1.3.RELEASE版本下,當(dāng)有兩個(gè)全注解類定義相同類型的Bean時(shí),由于加載順序不同,最終生成的Bean實(shí)例也會(huì)不同,文章通過分析ConfigurationClassPostProcessor的執(zhí)行過程,解釋了BeanDefinition的加載和覆蓋機(jī)制,感興趣的朋友一起看看吧2025-02-02Springboot中yml文件沒有葉子圖標(biāo)的解決
這篇文章主要介紹了Springboot中yml文件沒有葉子圖標(biāo)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09