注解实现MyBatis对敏感数据的加密解密
注解实现MyBatis对敏感数据的加密解密
注释详细
通过注解实现数据加密解密
- 在要加密的类添加注解 @SensitiveData 默认加密解密方式为 AES
- 在要加密字段上添加注解 @EncryptField
- 在要解密的字段添加注解 @DecryptField
例如
@Data @SensitiveData public class Customer { private Integer id; @DecryptField @EncryptField private String phone; @DecryptField @EncryptField private String address; private Integer age; }
选用其他加解密方式方式
- 实现 DecryptHandler 与 EncryptHandler 重写 encryptMethod()方法
- 注意: 加密解密时 添加前缀:避免重复加密 @Slf4j @Component("rsaDecryptImpl") public class RSADecryptImpl implements DecryptHandler { private final String KEY_SENSITIVE = "sensitive_"; @Override public String decryptMethod(String decryptValue) { //...... 解密方法 if (decryptValue.startsWith(KEY_SENSITIVE)) { decryptValue = decryptValue.substring(10); return RESUtil.decrypt(decryptValue, key); } return decryptValue; } } @Slf4j @Component("rsaEncryptImpl") public class RSAEncryptImpl implements EncryptHandler { private final String KEY_SENSITIVE = "sensitive_"; @Override public String encryptMethod(String encryptValue) { //...... 加密方法 if (!encryptValue.startsWith(KEY_SENSITIVE)) { String encrypted; encrypted = RESUtil.encrypt(encryptValue, key); encrypted = KEY_SENSITIVE + encrypted; return encrypted; } return encryptValue; } }
- 使用
@SensitiveData(encryptMethod = "rsaEncryptImpl",decryptMethod = "rsaDecryptImpl") @Data public class Customer { private Integer id; @DecryptField @EncryptField private String phone; @DecryptField @EncryptField private String address; private Integer age; }
效果展示
@GetMapping("batchInset") public Integer batchInsert() { List<Customer> list = new ArrayList<>(); for (int i = 0; i < 10; i++) { Customer customer = new Customer(); customer.setAge(i); customer.setPhone("1" + i); customer.setAddress("address" + i); list.add(customer); } return customerService.batchInsert(list); }
插入单条数据
@GetMapping("addCustomer") public String addCustomer(@RequestParam("phone") String phone, @RequestParam("address") String address) { Customer customer = new Customer(); customer.setAddress(address); customer.setPhone(phone); customer.setAge(18); int result = customerService.addCustomer(customer); return "添加结果: " + result; }
查询
@PostMapping("findCustomerList") public List<Customer> findCustomerList(@RequestBody Customer customer) { return customerService.findCustomerList(customer); }