一、引言
在数据日益成为企业核心资产的今天,数据安全显得尤为重要。本文将对sgchen-security这一基于SpringBoot和Mybatis的数据安全处理项目进行深度解析,探讨其如何在数据持久层对数据进行加/解密、接口请求加密解密以及接口的脱敏处理。
二、项目简介
sgchen-security是一个专注于数据安全处理的项目,它结合了SpringBoot和Mybatis两大框架,通过注解和配置的方式,实现了数据在存储和传输过程中的加密解密以及脱敏处理。项目的主要功能包括:
- 数据加解密:通过注解在保存数据时对指定字段进行加密处理,查询时自动解密。
- 数据脱敏:通过注解在查询数据时对指定字段进行脱敏处理。
- 接口请求加密解密:实现接口请求和响应数据的加密解密。
三、项目架构与依赖
sgchen-security项目采用SpringBoot+MyBatis-Plus作为核心框架,同时引入了HuTool工具包、Lombok插件、Bouncy Castle加密包以及fastjson2工具。为了在项目中使用sgchen-security,你需要在maven项目的pom.xml文件中添加以下依赖:
<dependency>
<groupId>io.gitee.chenshaogui</groupId>
<artifactId>sgchen-security</artifactId>
<version>1.0.30</version>
</dependency>
四、配置与初始化
在SpringBoot项目的启动类中,需要添加@EnableDataSecurity
注解来启用数据安全处理功能。同时,你需要配置一个SecretConfig
类来初始化加解密的密钥和算法。例如:
@SpringBootApplication
@EnableDataSecurity
public class DataSecurityApplication {
public static void main(String[] args) {
SpringApplication.run(DataSecurityApplication.class, args);
}
@Bean
public SecretConfig loadConfig() {
return SecretConfig.builder()
.reqSecretKey(secretKey) // 请求响应的加解密密钥配置
.reqAlgorithm(SecretAlgorithm.CBCPKCS7)
.reqSecretIV(new String(iv, StandardCharsets.UTF_8)) // CBC算法时IV值必填
.dbSecretKey(secretKey) // 数据库的加解密密钥配置
.dbAlgorithm(SecretAlgorithm.PKCS7)
.build();
}
}
五、数据加解密与脱敏处理
1. 数据加解密
在实体类上添加@EncryptEntity
注解,并在需要加解密的字段上添加@EncryptField
注解。例如:
@EncryptEntity
@TableName("account")
@Data
public class AccountPo {
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@EncryptField
private String account;
@EncryptField
private String password;
private String email;
}
在Controller层,你可以通过方法注解或类注解的方式指定需要加密的请求参数和需要脱敏的响应数据。例如:@EncryptController和@EncryptRequest()二选一实现请求加解密
@EncryptController({
@DesensitizedUnit(field = "secondPhone", mode = DesensitizedMode.mobile),
@DesensitizedUnit(field = "secondReceiver", mode = DesensitizedMode.name),
// ... 其他脱敏字段配置
})
public class TestController {
}
public class TestController {
@EncryptRequest({
@DesensitizedUnit(field = "secondPhone", mode = DesensitizedMode.mobile),
@DesensitizedUnit(field = "secondReceiver", mode = DesensitizedMode.name),
// ... 其他脱敏字段配置
})
public Result<List<Student>> getList() {
// ... 方法实现
}
}
2. 数据脱敏
数据脱敏主要用于在查询时对敏感字段进行部分隐藏或替换。在Controller层或Mapper层,你可以通过注解的方式指定需要脱敏的字段和脱敏模式。
六、前后端交互中的加密解密
在前端与后端进行交互时,你可以使用CryptoJS库来实现请求参数的加密和响应结果的解密。以下是一个使用CryptoJS进行AES加密解密的示例:
const key = CryptoJS.enc.Utf8.parse("testtest12345678");
const iv = CryptoJS.enc.Utf8.parse('偏移量'); // CBC模式需要IV值
// 加密方法
function Encrypt(word) {
let srcs = CryptoJS.enc.Utf8.parse(word);
let encrypted = CryptoJS.AES.encrypt(srcs, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });
return encrypted.ciphertext.toString().toUpperCase();
}
// 解密方法
function Decrypt(word) {
let encryptedHexStr = CryptoJS.enc.Hex.parse(word);
let srcs = CryptoJS.enc.Base64.stringify(encryptedHexStr); // 注意:这里可能需要根据实际情况调整
let decrypt = CryptoJS.AES.decrypt(srcs, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });
let decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
return decryptedStr;
}
注意:在实际应用中,你需要根据后端配置的加密模式和填充方式调整前端的加密解密代码。
七、问题排查与优化
在使用过程中,如果遇到解密后数据为空的问题,可以从以下几个方面进行排查:
- 密钥和IV值是否正确:确保前后端使用的密钥和IV值完全一致。
- 加密模式和填充方式是否匹配:前后端使用的加密模式和填充方式必须一致。
- 数据格式是否正确:确保加密前的数据格式与解密时的数据格式一致。
此外,你还可以根据项目的实际情况对性能进行优化,例如使用缓存来减少数据库的访问次数等。
八、总结
sgchen-security是一个功能强大且易于使用的数据安全处理项目,它通过注解和配置的方式实现了数据在存储和传输过程中的加密解密以及脱敏处理。本文对其进行了深度解析,希望能够帮助大家更好地理解和使用这一项目。
gitee: sgchen-security: spring 接口请求加解密处理、数据库加密存储处理、接口敏感数据脱敏处理