mybatisplus对敏感信息加密
时间: 2023-08-17 18:15:22 浏览: 229
MyBatis-Plus提供了拦截器的相关接口,可以在与数据库交互的过程中实现特定功能。通过自定义一个拦截器类,可以实现对敏感数据如用户密码的加密功能。具体步骤如下:
1. 定义一个注解,用于标记需要加密的字段。
2. 在实体类中使用该注解标记需要加密的字段。
3. 在拦截器类中实现加密逻辑。可以使用MyBatis-Plus提供的拦截器接口,在写入数据库时将明文转换为密文。
4. 配置加密算法和密钥。可以在配置文件中指定加密算法的类型和密钥。
5. 在调用接口时,加密逻辑会自动生效,敏感信息会被加密后存储到数据库中。
需要注意的是,目前MyBatis-Plus的加密算法只支持AES和SM4两种方式。如果不指定加密类型,则默认使用AES方式进行加密。可以在实体类上实现Encrypted接口,并在要加密的字段上添加注解,即可完成加密操作。[2][3]
相关问题
mybatisplus数据库配置加密
MyBatisPlus提供了一种在Yaml配置文件中加密数据库配置的方法。具体步骤如下:
1. 首先,生成一个16位的随机AES密钥,可以使用AES.generateRandomKey()方法来生成。
2. 使用生成的随机密钥对敏感信息进行加密,可以使用AES.encrypt(data, randomKey)方法进行加密,其中data是要加密的内容。
3. 在Yaml配置文件中,以"mpw:"开头,紧接着是加密后的配置内容。例如,对于datasource的url、password和username三个配置项,可以分别将它们加密后的内容分别放在mpw:后面。
示例配置:
```yaml
spring:
datasource:
url: mpw:SgzR0RIVp7tcrVAgfKQC6XRa62hnW102m2Xd6l2asvI3TB8ZXT1YsuC79omFCvi/C1tfCQyDUDKngrIrhuQtg==
password: mpw:npBEYOUyNaSPGiXp9/hVhQ==
username: mpw:dwDIspd5OkIv9yIyqttPEw==
```
这样配置之后,敏感信息就会以加密形式存在配置文件中,保护了数据库配置的安全性。
值得注意的是,加密配置必须以"mpw:"字符串开头。所提供的示例配置中,url、password和username的配置项都是以"mpw:"开头的,这样MyBatisPlus会自动识别并解密这些配置项。
这就是使用MyBatisPlus实现Yaml配置参数AES算法加密的方法。通过这种方式,可以在一定程度上保护数据库配置及数据的安全性。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
mybatisplus在springboot中配置敏感数据加密拦截器
Mybatis-plus提供了加密拦截器`MybatisPlusInterceptor`,可以在查询和修改时对敏感数据进行加密和解密操作。以下是在Spring Boot中配置Mybatis-plus加密拦截器的步骤:
1. 首先,需要在pom.xml文件中添加mybatis-plus-boot-starter依赖:
```xml
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
```
2. 创建一个`MetaObjectHandler`实现类,该类可以在插入和更新时自动填充公共字段,例如创建时间、修改时间等。在该类中,需要实现`insertFill`和`updateFill`方法,并在需要自动填充的字段上添加`@TableField(fill = FieldFill.INSERT)`和`@TableField(fill = FieldFill.UPDATE)`注解。
```java
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "createTime", LocalDateTime::now, LocalDateTime.class);
}
@Override
public void updateFill(MetaObject metaObject) {
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime::now, LocalDateTime.class);
}
}
```
3. 创建一个加密拦截器`EncryptInterceptor`,该拦截器可以在查询和修改时对敏感数据进行加密和解密操作。在该拦截器中,需要实现`intercept`方法,并在需要加密的字段上添加`@TableField(fill = FieldFill.INSERT_UPDATE)`注解。
```java
@Component
public class EncryptInterceptor implements Interceptor {
private static final String AES_KEY = "1234567890123456";
private static final String CHARSET = "UTF-8";
@Override
public Object intercept(Invocation invocation) throws Throwable {
Object parameter = invocation.getArgs()[1];
if (parameter instanceof MappedStatement && ((MappedStatement) parameter).getId().contains("update")) {
MetaObject metaObject = SystemMetaObject.forObject(parameter);
String[] propertyNames = metaObject.getSetterNames();
for (String propertyName : propertyNames) {
if (metaObject.hasSetter(propertyName) && metaObject.hasGetter(propertyName)) {
TableField tableField = metaObject.getOriginalObject().getClass().getDeclaredField(propertyName)
.getAnnotation(TableField.class);
if (tableField != null && tableField.fill() == FieldFill.UPDATE) {
Object value = metaObject.getValue(propertyName);
if (value != null && value instanceof String) {
metaObject.setValue(propertyName, encrypt((String) value));
}
}
}
}
}
return invocation.proceed();
}
private String encrypt(String content) throws Exception {
KeyGenerator keygen = KeyGenerator.getInstance("AES");
SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
random.setSeed(AES_KEY.getBytes());
keygen.init(128, random);
SecretKey secretKey = keygen.generateKey();
byte[] enCodeFormat = secretKey.getEncoded();
SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
Cipher cipher = Cipher.getInstance("AES");
byte[] byteContent = content.getBytes(CHARSET);
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] byteRresult = cipher.doFinal(byteContent);
return Base64.encodeBase64String(byteRresult);
}
}
```
4. 在配置文件中配置Mybatis-plus的加密拦截器和自动填充功能:
```yaml
mybatis-plus:
global-config:
meta-object-handler: com.example.demo.handler.MyMetaObjectHandler
configuration:
map-underscore-to-camel-case: true
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
interceptors:
- com.example.demo.interceptor.EncryptInterceptor
```
5. 在需要加密的字段上添加`@TableField(fill = FieldFill.INSERT_UPDATE)`注解,例如:
```java
@TableField(fill = FieldFill.INSERT_UPDATE)
private String password;
```
通过以上步骤,就可以在Spring Boot中配置Mybatis-plus加密拦截器了。注意,在实际应用中,需要对加密算法、加密密钥等进行更加严格的保护。
阅读全文