mybatis-plus进行数据字段加密解密入库
1.依赖
<!-- AES加密解密需要包-->
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.15</version>
</dependency>
2.AES 加密的工具类
package com.example.demo.entity;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Base64;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
/**
* aes 加密的工具类
* 1.存储 加密的秘钥key
* 2.实现 aes 加密
* 3.实现aes解密的功能
* @author xrp
*/
@Slf4j
public class AesUtil {
/**
* 定义 aes 加密的key
* 密钥 必须是16位, 自定义,
* 如果不是16位, 则会出现InvalidKeyException: Illegal key size
* 解决方案有两种:
* 需要安装Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files(可以在Oracle下载).
* .设置设置key的长度为16个字母和数字的字符窜(128 Bit/8=16字符)就不报错了。
*/
private static final String KEY = "KEYBYACSJAVAZXLL";
/**
* 偏移量
*/
private static final int OFFSET = 16;
private static final String TRANSFORMATION = "AES/CBC/PKCS5Padding";
private static final String ALGORITHM = "AES";
/**
* 加密
* @param content content
* @return String
*/
public static String encrypt(String content) {
return encrypt(content, KEY);
}
/**
* 解密
*
* @param content content
* @return String
*/
public static String decrypt(String content) {
return decrypt(content, KEY);
}
/**
* 加密
*
* @param content 需要加密的内容
* @param key 加密密码
* @return String
*/
public static String encrypt(String content, String key) {
try {
SecretKeySpec skey = new SecretKeySpec(key.getBytes(), ALGORITHM);
IvParameterSpec iv = new IvParameterSpec(key.getBytes(), 0, OFFSET);
Cipher cipher = Cipher.getInstance(TRANSFORMATION);
//定义加密编码
String charset = "utf-8";
byte[] byteContent = content.getBytes(charset);
// 初始化
cipher.init(Cipher.ENCRYPT_MODE, skey, iv);
byte[] result = cipher.doFinal(byteContent);
// 加密
return new Base64().encodeToString(result);
} catch (Exception e) {
log.debug("加密失败:{}",e.getMessage());
}
return null;
}
/**
* AES(256)解密
*
* @param content 待解密内容
* @param key 解密密钥
* @return 解密之后
*/
public static String decrypt(String content, String key) {
try {
SecretKeySpec skey = new SecretKeySpec(key.getBytes(), ALGORITHM);
IvParameterSpec iv = new IvParameterSpec(key.getBytes(), 0, OFFSET);
Cipher cipher = Cipher.getInstance(TRANSFORMATION);
// 初始化
cipher.init(Cipher.DECRYPT_MODE, skey, iv);
byte[] result = cipher.doFinal(new Base64().decode(content));
// 解密
return new String(result);
} catch (Exception e) {
log.debug("解密失败:{}",e.getMessage());
}
return null;
}
}
3.继承Mybatis的 BaseTypeHandler类,重写方法
package com.example.demo.handler;
import com.example.demo.entity.AesUtil;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* @author xrp
*/
public class TypeHandler extends BaseTypeHandler<String> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
ps.setString(i, AesUtil.encrypt(parameter));
}
@Override
public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
return AesUtil.decrypt(rs.getString(columnName));
}
@Override
public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return AesUtil.decrypt(rs.getString(columnIndex));
}
@Override
public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return AesUtil.decrypt(cs.getString(columnIndex));
}
}
4.简单模拟增加查询
entity
在类头加上注解@TableName(value = “sys_user”,autoResultMap = true) ;
在需要加密的字段加上@TableField(typeHandler = TypeHandler.class)
package com.example.demo.userinfo.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import com.example.demo.handler.TypeHandler;
import lombok.*;
import java.io.Serializable;
/**
* (sys_user)实体类
*
* @author xrp
*/
@NoArgsConstructor
@AllArgsConstructor
@Setter
@Getter
@TableName(value = "sys_user",autoResultMap = true)
public class SysUser extends Model<SysUser> implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@TableId
private Integer id;
/**
* 姓名
*/
@TableField(typeHandler = TypeHandler.class)
private String name;
/**
* 身份证
*/
@TableField(typeHandler = TypeHandler.class)
private String identity;
/**
* 银行卡号
*/
@TableField(typeHandler = TypeHandler.class)
private String bank;
}
controller
package com.example.demo.userinfo.controller;
import com.example.demo.userinfo.entity.SysUser;
import com.example.demo.userinfo.service.SysUserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.Map;
/**
* 服务控制器
*
* @author xrp
*/
@Slf4j
@RestController
@RequestMapping("/sysUser")
public class SysUserController {
@Resource
private SysUserService sysUserService;
/**
* 添加数据
*/
@PostMapping("save")
public Map<String,Object> saveUserInfo(@RequestBody SysUser sysUser) {
return sysUserService.saveUserInfo(sysUser);
}
/**
* 获取数据
*/
@PostMapping("get")
public Map<String,Object> getUserInfo(@RequestParam("id") Integer id) {
return sysUserService.getUserInfo(id);
}
/**
* 更新数据
*/
@PostMapping("update")
public Map<String,Object> updateUserInfo(@RequestBody SysUser sysUser) {
return sysUserService.updateUserInfo(sysUser);
}
}
Mapper
package com.example.demo.userinfo.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.userinfo.entity.SysUser;
import org.apache.ibatis.annotations.Mapper;
/**
* (sys_user)数据Mapper
*
* @author xrp
*/
@Mapper
public interface SysUserMapper extends BaseMapper<SysUser> {
}
service 和 impl
package com.example.demo.userinfo.service;
import com.example.demo.userinfo.entity.SysUser;
import java.util.Map;
/**
* 服务接口
* @author xrp
*/
public interface SysUserService {
/**
* 添加数据
* @param sysUser 用户对象
* @return Map<String, Object>
*/
Map<String, Object> saveUserInfo(SysUser sysUser);
/**
* 获取信息
* @param id id
* @return SysUser
*/
Map<String,Object> getUserInfo(Integer id);
/**
* 修改数据
* @param sysUser SysUser
* @param sysUser
* @return Map<String, Object>
*/
Map<String, Object> updateUserInfo(SysUser sysUser);
}
package com.example.demo.userinfo.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.userinfo.entity.SysUser;
import com.example.demo.userinfo.mapper.SysUserMapper;
import com.example.demo.userinfo.service.SysUserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.Map;
/**
* 服务接口实现
*
* @author xrp
*/
@Slf4j
@Service
public class SysUserServiceImpl extends ServiceImpl<SysUserMapper,SysUser> implements SysUserService {
@Override
public Map<String, Object> saveUserInfo(SysUser sysUser) {
Map<String,Object> resultMap =new HashMap<>(1);
int insert = baseMapper.insert(sysUser);
resultMap.put("code",insert);
return resultMap;
}
@Override
public Map<String,Object> getUserInfo(Integer id) {
Map<String, Object> resultMap = new HashMap<>(1);
resultMap.put("data",baseMapper.selectById(id));
return resultMap;
}
@Override
public Map<String, Object> updateUserInfo(SysUser sysUser) {
Map<String, Object> resultMap = new HashMap<>(1);
resultMap.put("data",baseMapper.updateById(sysUser));
return resultMap;
}
}
测试
添加
加密保存成功