Spring Boot实现数据加密脱敏:注解 + 反射 + AOP
- ☆* o(≧▽≦)o *☆嗨~我是IT·陈寒
- ✨博客主页:IT·陈寒的博客
- 该系列文章专栏:架构设计
- 其他专栏:Java学习路线 Java面试技巧 Java实战项目 AIGC人工智能 数据结构学习
- 文章作者技术和水平有限,如果文中出现错误,希望大家能指正
- 欢迎大家关注! ❤️
随着信息安全的日益重要,对敏感数据进行加密和脱敏已成为业务开发中不可忽视的一环。本文将介绍如何在Spring Boot项目中利用注解、反射和AOP的组合,实现对敏感数据的加密和脱敏,提高数据安全性。
在实际应用中,我们常常需要对一些敏感数据进行保护,以防止敏感信息泄露。数据加密用于将原始数据进行加密,使得即便数据被非法获取,也难以解密;而数据脱敏则是在数据显示时对敏感信息进行掩盖,确保展示给用户的数据不包含真实的敏感信息。
首先,我们需要创建一个基本的Spring Boot项目。可以使用Spring Initializer(https://start.spring.io/)进行快速初始化,选择相应的依赖项。
为了方便对敏感数据进行加密,我们设计一个自定义注解 @SensitiveData
。
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface SensitiveData {
}
创建一个工具类 SensitiveDataUtils
,用于实现对敏感数据的加密和脱敏操作。
import org.springframework.stereotype.Component;
@Component
public class SensitiveDataUtils {
// 模拟加密操作
public String encrypt(String data) {
// 实际项目中使用加密算法进行操作
return "Encrypted-" + data;
}
// 模拟脱敏操作
public String mask(String data) {
// 实际项目中使用脱敏算法进行操作
return "****" + data.substring(data.length() - 4);
}
}
创建一个包含敏感数据的实体类,并在需要加密或脱敏的字段上添加 @SensitiveData
注解。
public class User {
private Long id;
@SensitiveData
private String username;
@SensitiveData
private String password;
// 省略其他字段的 getter 和 setter 方法
}
通过AOP(面向切面编程),我们可以在方法执行前后对敏感数据进行加密和脱敏。
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class SensitiveDataAspect {
@Autowired
private SensitiveDataUtils sensitiveDataUtils;
@Pointcut("@annotation(SensitiveData)")
public void sensitiveDataPointcut() {
}
@Before("sensitiveDataPointcut()")
public void beforeMethodExecution() {
// 获取当前方法中标记了@SensitiveData注解的字段,进行加密或脱敏
// 利用反射获取字段值,调用SensitiveDataUtils中的加密或脱敏方法
}
}
在上述AOP切面中,通过 @Pointcut
注解定义了一个切入点,指定了被 @SensitiveData
注解标记的方法。在 @Before
注解的方法中,我们可以获取到标记了 @SensitiveData
注解的字段,并调用 SensitiveDataUtils
中的相应方法进行加密或脱敏。
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.FieldSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.lang.reflect.Field;
@Aspect
@Component
public class SensitiveDataAspect {
@Autowired
private SensitiveDataUtils sensitiveDataUtils;
@Pointcut("@annotation(SensitiveData)")
public void sensitiveDataPointcut() {
}
@Before("sensitiveDataPointcut()")
public void beforeMethodExecution(JoinPoint joinPoint) {
Object target = joinPoint.getTarget();
Field field = ((FieldSignature) joinPoint.getSignature()).getField();
field.setAccessible(true);
try {
Object fieldValue = field.get(target);
if (fieldValue instanceof String) {
String encryptedValue = sensitiveDataUtils.encrypt((String) fieldValue);
field.set(target, encryptedValue);
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
在完善后的AOP切面中,我们通过反射获取了标记了 @SensitiveData
注解的字段,并对其进行加密操作。这样,在调用标记了 @SensitiveData
注解的方法前,会先对敏感数据进行加密。
创建一个简单的Controller进行测试。
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@SensitiveData
private String password = "userPassword123";
@GetMapping("/user")
public User getUser() {
User user = new User();
user.setId(1L);
user.setUsername("john_doe");
user.setPassword(password);
return user;
}
}
在上述示例中,password
字段被标记了 @SensitiveData
注解,因此在返回 User
对象时,password
字段会被加密。
在实际项目中,可以根据安全需求选择更为复杂和安全的加密算法,例如AES、RSA等。这可以通过在 SensitiveDataUtils
中调用相应的加密算法来实现。
为了提高灵活性,可以考虑通过配置文件或数据库动态配置哪些字段需要加密或脱敏。这样可以根据具体业务需求动态调整敏感数据的处理策略。
通过结合注解、反射和AOP,我们成功实现了Spring Boot项目中对敏感数据的加密和脱敏。这一方案不仅提高了数据的安全性,也保障了业务开发的灵活性。在实际项目中,应该根据具体需求选择合适的加密算法,并考虑动态配置的方式,以便更好地适应业务变化。希望本文对你在Spring Boot项目中实现数据加密和脱敏提供了一些有用的思路。
结尾 ❤️ 感谢您的支持和鼓励!
您可能感兴趣的内容:
- 【Java面试技巧】Java面试八股文 - 掌握面试必备知识(目录篇)
- 【Java学习路线】2023年完整版Java学习路线图
- 【AIGC人工智能】Chat GPT是什么,初学者怎么使用Chat GPT,需要注意些什么
- 【Java实战项目】SpringBoot+SSM实战:打造高效便捷的企业级Java外卖订购系统
- 【数据结构学习】从零起步:学习数据结构的完整路径