使用SpringBoot+MyBatis實(shí)現(xiàn)數(shù)據(jù)庫字段級加密
為什么需要字段級加密?
在當(dāng)今數(shù)據(jù)驅(qū)動(dòng)的時(shí)代,個(gè)人信息保護(hù)法、網(wǎng)絡(luò)安全法等相關(guān)法規(guī)相繼出臺(tái),對用戶數(shù)據(jù)安全提出了更高要求。特別是金融、醫(yī)療、教育等行業(yè),用戶的身份信息、聯(lián)系方式、財(cái)務(wù)數(shù)據(jù)等一旦泄露,后果不堪設(shè)想。
傳統(tǒng)做法是直接將數(shù)據(jù)明文存儲(chǔ)在數(shù)據(jù)庫中,這種方式存在巨大安全隱患:
- 數(shù)據(jù)庫泄露風(fēng)險(xiǎn):一旦數(shù)據(jù)庫被黑客攻破,所有數(shù)據(jù)一覽無余
- 內(nèi)部人員風(fēng)險(xiǎn):內(nèi)部員工可以直接查看敏感數(shù)據(jù)
- 備份泄露風(fēng)險(xiǎn):數(shù)據(jù)庫備份文件丟失也會(huì)導(dǎo)致數(shù)據(jù)泄露
- 合規(guī)風(fēng)險(xiǎn):不符合GDPR、個(gè)人信息保護(hù)法等法規(guī)要求
字段級加密正是解決這些問題的有效手段。
技術(shù)選型:為什么選擇Spring Boot + MyBatis?
Spring Boot的優(yōu)勢
- 快速開發(fā):約定優(yōu)于配置,極大提升開發(fā)效率
- 生態(tài)完善:豐富的starter組件,開箱即用
- 易于集成:與各類中間件無縫集成
MyBatis的優(yōu)勢
- SQL可控:可以精確控制每一條SQL語句
- 靈活性強(qiáng):支持復(fù)雜查詢和動(dòng)態(tài)SQL
- 攔截機(jī)制:提供了強(qiáng)大的插件機(jī)制,便于擴(kuò)展
核心實(shí)現(xiàn)思路
我們的目標(biāo)是實(shí)現(xiàn)一個(gè)透明的字段級加密系統(tǒng),整體架構(gòu)如下:
業(yè)務(wù)層 -> MyBatis攔截器 -> 數(shù)據(jù)庫
<- MyBatis攔截器 <-
1. 加密注解設(shè)計(jì)
首先,我們需要定義一個(gè)注解來標(biāo)記哪些字段需要加密:
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Encrypt {
}
2. 實(shí)體類標(biāo)記
在實(shí)體類中使用注解標(biāo)記需要加密的字段:
@Data
public class User {
private Long id;
private String username;
@Encrypt
private String password;
@Encrypt
private String email;
@Encrypt
private String phone;
}
3. 加密工具類
實(shí)現(xiàn)AES加密算法的工具類:
public class EncryptionUtil {
private static final String ALGORITHM = "AES";
private static final String TRANSFORMATION = "AES/ECB/PKCS5Padding";
// AES加密
public static String encrypt(String plainText, String key) {
try {
SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), ALGORITHM);
Cipher cipher = Cipher.getInstance(TRANSFORMATION);
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] encryptedBytes = cipher.doFinal(plainText.getBytes(StandardCharsets.UTF_8));
return Base64.getEncoder().encodeToString(encryptedBytes);
} catch (Exception e) {
throw new RuntimeException("加密失敗", e);
}
}
// AES解密
public static String decrypt(String cipherText, String key) {
try {
SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), ALGORITHM);
Cipher cipher = Cipher.getInstance(TRANSFORMATION);
cipher.init(Cipher.DECRYPT_MODE, secretKey);
byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(cipherText));
return new String(decryptedBytes, StandardCharsets.UTF_8);
} catch (Exception e) {
throw new RuntimeException("解密失敗", e);
}
}
}
4. MyBatis攔截器實(shí)現(xiàn)
這是整個(gè)系統(tǒng)的核心部分,通過MyBatis攔截器實(shí)現(xiàn)自動(dòng)加解密:
// 加密攔截器
@Intercepts({
@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})
})
@Component
public class FieldEncryptionInterceptor implements Interceptor {
@Value("${encryption.key:mySecretKey12345}")
private String encryptionKey;
@Override
public Object intercept(Invocation invocation) throws Throwable {
Object[] args = invocation.getArgs();
MappedStatement mappedStatement = (MappedStatement) args[0];
Object parameter = args[1];
// 獲取SQL命令類型
String sqlCommandType = mappedStatement.getSqlCommandType().toString();
// 對INSERT和UPDATE操作進(jìn)行加密處理
if ("INSERT".equals(sqlCommandType) || "UPDATE".equals(sqlCommandType)) {
encryptFields(parameter);
}
return invocation.proceed();
}
// 解密攔截器
@Intercepts({
@Signature(type = ResultSetHandler.class, method = "handleResultSets", args = {Statement.class})
})
@Component
public class FieldDecryptionInterceptor implements Interceptor {
@Value("${encryption.key:mySecretKey12345}")
private String encryptionKey;
@Override
public Object intercept(Invocation invocation) throws Throwable {
// 執(zhí)行原始方法
Object result = invocation.proceed();
// 對查詢結(jié)果進(jìn)行解密處理
if (result instanceof List) {
List<?> list = (List<?>) result;
for (Object item : list) {
decryptFields(item);
}
} else {
decryptFields(result);
}
return result;
}
}
}
實(shí)際應(yīng)用場景
這套字段級加密系統(tǒng)可以在多個(gè)場景中發(fā)揮作用:
1. 用戶信息保護(hù)
在用戶注冊時(shí),自動(dòng)加密用戶的密碼、郵箱、手機(jī)號等敏感信息,即使數(shù)據(jù)庫泄露也不會(huì)造成用戶隱私泄露。
2. 金融數(shù)據(jù)安全
對用戶的銀行卡號、交易記錄等金融數(shù)據(jù)進(jìn)行加密存儲(chǔ),滿足金融行業(yè)的合規(guī)要求。
3. 醫(yī)療數(shù)據(jù)保護(hù)
對患者的病歷、診斷結(jié)果等醫(yī)療隱私數(shù)據(jù)進(jìn)行加密,保護(hù)患者隱私。
4. 企業(yè)數(shù)據(jù)安全
對企業(yè)內(nèi)部的商業(yè)機(jī)密、客戶資料等重要數(shù)據(jù)進(jìn)行加密保護(hù)。
安全性考慮
雖然字段級加密功能強(qiáng)大,但在生產(chǎn)環(huán)境中使用時(shí)必須注意安全性:
- 密鑰管理:不要在代碼中硬編碼密鑰,應(yīng)使用專業(yè)的密鑰管理系統(tǒng)
- 算法選擇:使用經(jīng)過驗(yàn)證的加密算法,如AES-256
- 性能優(yōu)化:合理選擇需要加密的字段,避免對所有字段都進(jìn)行加密
- 審計(jì)日志:記錄所有加密解密操作,便于安全審計(jì)
- 定期輪換:定期更換加密密鑰,降低密鑰泄露風(fēng)險(xiǎn)
總結(jié)
通過Spring Boot + MyBatis實(shí)現(xiàn)數(shù)據(jù)庫字段級加密,我們可以構(gòu)建一個(gè)既安全又透明的數(shù)據(jù)保護(hù)系統(tǒng)。這套方案已經(jīng)在眾多企業(yè)級應(yīng)用中得到驗(yàn)證,能夠有效保護(hù)用戶敏感數(shù)據(jù)安全,滿足合規(guī)要求。
當(dāng)然,任何技術(shù)都不是銀彈,在享受便利的同時(shí)也要注意潛在的風(fēng)險(xiǎn)。希望今天的分享能給大家?guī)硪恍﹩l(fā),讓我們一起探索更多有趣的技術(shù)方案!
以上就是使用SpringBoot+MyBatis實(shí)現(xiàn)數(shù)據(jù)庫字段級加密的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot MyBatis數(shù)據(jù)庫字段級加密的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java實(shí)現(xiàn)一鍵將Word文檔轉(zhuǎn)為PDF
在開發(fā)中,經(jīng)常會(huì)碰到需要把 Word 文檔轉(zhuǎn)換成 PDF 格式的需求,Java 有不少好用的庫能實(shí)現(xiàn)這個(gè)功能,本文為大家介紹了兩個(gè)常用的方法,需要的可以了解下2025-02-02
idea中配置tomcat啟動(dòng)jsp項(xiàng)目過程
在IntelliJ IDEA中配置Tomcat并啟動(dòng)JSP項(xiàng)目,首先需要在IDEA中安裝和配置Tomcat服務(wù)器,接著將項(xiàng)目與Tomcat關(guān)聯(lián),設(shè)置正確的部署路徑和端口號,通過這些步驟,可以實(shí)現(xiàn)JSP項(xiàng)目的本地運(yùn)行和調(diào)試,使得開發(fā)和測試工作更加高效2024-10-10
Springboot服務(wù)HTTP/HTTPS雙監(jiān)聽及路由的實(shí)現(xiàn)示例
本文主要介紹了通過SpringBoot中配置額外的HTTPS監(jiān)聽端口和在SpringCloudGateway中添加自定義配置和過濾器來重寫URI實(shí)現(xiàn)HTTPS路由,這樣的設(shè)計(jì)旨在減少生產(chǎn)環(huán)境中切換到HTTPS時(shí)的困難和風(fēng)險(xiǎn)2025-10-10
ActiveMQ中consumer的消息確認(rèn)機(jī)制詳解
這篇文章主要介紹了ActiveMQ中consumer的消息確認(rèn)機(jī)制詳解,對于broker而言,只有接收到確認(rèn)指令,才會(huì)認(rèn)為消息被正確的接收或者處理成功了,InforSuiteMQ提供以下幾種Consumer與Broker之間的消息確認(rèn)方式,需要的朋友可以參考下2023-10-10
在eclipse中使用SVN的實(shí)現(xiàn)方法(圖文教程)
這篇文章主要介紹了在eclipse中使用SVN的實(shí)現(xiàn)方法(圖文教程),文中通過圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
SpringQuartz集群支持JDBC存儲(chǔ)與分布式執(zhí)行的最佳實(shí)踐
SpringQuartz集群通過JDBC存儲(chǔ)和分布式執(zhí)行機(jī)制,有效解決了單點(diǎn)故障和擴(kuò)展性問題,本文將詳細(xì)介紹SpringQuartz集群支持的實(shí)現(xiàn)原理、配置方法和最佳實(shí)踐,助力開發(fā)者構(gòu)建穩(wěn)定可靠的分布式調(diào)度系統(tǒng),感興趣的朋友一起看看吧2025-04-04

