Spring Boot + MyBatis:实现数据库字段级加密
Spring Boot + MyBatis:实现数据库字段级加密,让敏感数据固若金汤!
你是否曾经为用户敏感数据的安全存储而头疼?是否担心数据库一旦泄露就会造成巨大损失?今天,我要分享一个既优雅又实用的解决方案——使用Spring Boot + MyBatis实现数据库字段级加密,让你的敏感数据固若金汤!
为什么需要字段级加密?
在当今数据驱动的时代,个人信息保护法、网络安全法等相关法规相继出台,对用户数据安全提出了更高要求。特别是金融、医疗、教育等行业,用户的身份信息、联系方式、财务数据等一旦泄露,后果不堪设想。
传统做法是直接将数据明文存储在数据库中,这种方式存在巨大安全隐患:
- 数据库泄露风险:一旦数据库被黑客攻破,所有数据一览无余
- 内部人员风险:内部员工可以直接查看敏感数据
- 备份泄露风险:数据库备份文件丢失也会导致数据泄露
- 合规风险:不符合GDPR、个人信息保护法等法规要求
字段级加密正是解决这些问题的有效手段。
技术选型:为什么选择Spring Boot + MyBatis?
Spring Boot的优势
- 快速开发:约定优于配置,极大提升开发效率
- 生态完善:丰富的starter组件,开箱即用
- 易于集成:与各类中间件无缝集成
MyBatis的优势
- SQL可控:可以精确控制每一条SQL语句
- 灵活性强:支持复杂查询和动态SQL
- 拦截机制:提供了强大的插件机制,便于扩展
核心实现思路
我们的目标是实现一个透明的字段级加密系统,整体架构如下:
业务层 -> MyBatis拦截器 -> 数据库
<- MyBatis拦截器 <-
1. 加密注解设计
首先,我们需要定义一个注解来标记哪些字段需要加密:
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Encrypt {
}
2. 实体类标记
在实体类中使用注解标记需要加密的字段:
@Data
public class User {
private Long id;
private String username;
@Encrypt
private String password;
@Encrypt
private String email;
@Encrypt
private String phone;
}
3. 加密工具类
实现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拦截器实现
这是整个系统的核心部分,通过MyBatis拦截器实现自动加解密:
// 加密拦截器
@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操作进行加密处理
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 {
// 执行原始方法
Object result = invocation.proceed();
// 对查询结果进行解密处理
if (result instanceof List) {
List<?> list = (List<?>) result;
for (Object item : list) {
decryptFields(item);
}
} else {
decryptFields(result);
}
return result;
}
}
}
实际应用场景
这套字段级加密系统可以在多个场景中发挥作用:
1. 用户信息保护
在用户注册时,自动加密用户的密码、邮箱、手机号等敏感信息,即使数据库泄露也不会造成用户隐私泄露。
2. 金融数据安全
对用户的银行卡号、交易记录等金融数据进行加密存储,满足金融行业的合规要求。
3. 医疗数据保护
对患者的病历、诊断结果等医疗隐私数据进行加密,保护患者隐私。
4. 企业数据安全
对企业内部的商业机密、客户资料等重要数据进行加密保护。
安全性考虑
虽然字段级加密功能强大,但在生产环境中使用时必须注意安全性:
- 密钥管理:不要在代码中硬编码密钥,应使用专业的密钥管理系统
- 算法选择:使用经过验证的加密算法,如AES-256
- 性能优化:合理选择需要加密的字段,避免对所有字段都进行加密
- 审计日志:记录所有加密解密操作,便于安全审计
- 定期轮换:定期更换加密密钥,降低密钥泄露风险
总结
通过Spring Boot + MyBatis实现数据库字段级加密,我们可以构建一个既安全又透明的数据保护系统。这套方案已经在众多企业级应用中得到验证,能够有效保护用户敏感数据安全,满足合规要求。
当然,任何技术都不是银弹,在享受便利的同时也要注意潜在的风险。希望今天的分享能给大家带来一些启发,让我们一起探索更多有趣的技术方案!
项目源码:关注公众号并回复"mybatis-encryption"获取完整源码
交流学习:欢迎加入我们的技术交流群,一起探讨更多后端技术干货
标题:Spring Boot + MyBatis:实现数据库字段级加密
作者:jiangyi
地址:http://jiangyi.space/articles/2025/12/21/1766304274466.html