来源:juejin.cn/post/6963811586184052767
前言:介绍一个简单的MyBatis加解密方式,日常学习工作中提及这种方法的比较少,所以拿来说说,如果已经知道这种方法的忽略本文!
在我们数据库中有些时候会保存一些用户的敏感信息,比如:手机号、银行卡等信息,如果这些信息以明文的方式保存,那么是不安全的。
假如:黑客黑进了数据库,或者离职人员导出了数据,那么就可能导致这些敏感数据的泄漏。因此我们就需要找到一种方法来解决这个问题。
由于我们系统中使用了Mybatis作为数据库持久层,因此决定使用Mybatis的TypeHandler或Plugin来解决。
TypeHandler : 需要我们在某些列上手动指定 typeHandler 来选择使用那个typeHandler或者根据@MappedJdbcTypes
和 @MappedTypes
注解来自行推断。
<result column='phone' property='phone'
typeHandler='com.huan.study.mybatis.typehandler.EncryptTypeHandler'/>
Plugin : 可以拦截系统中的 select、insert、update、delete等语句,也能获取到sql执行前的参数和执行后的数据。
经过考虑,决定使用TypeHandler来加解密数据。另外,MyBatis 系列面试题和答案全部整理好了,微信搜索Java技术栈,在后台发送:面试,可以在线阅读。
我们有一张客户表customer,里面有客户手机号(phone)和客户地址(address)等字段,其中客户手机号(phone)是需要加密保存到数据库中的。
public class Encrypt { private String value; public Encrypt() { } public Encrypt(String value) { this.value = value; } public String getValue() { return value; } public void setValue(String value) { this.value = value; }}
设置参数时,加密数据。
从数据库获取记录时,解密数据。
@MappedTypes
:表示该处理器处理的java类型是什么。大家可以在m-appid='wxe57fd7ba3fb24ae8' data-miniprogram-path='pages/index/list' data-miniprogram-nickname='Java面试库' data-miniprogram-type='text' data-miniprogram-servicetype='' href=''>Java面试库小程序在线刷题。
@MappedJdbcTypes
:表示处理器处理的Jdbc类型。
3、sql语句中写法
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE mapper PUBLIC '-//mybatis.org//DTD Mapper 3.0//EN' 'http://mybatis.org/dtd/mybatis-3-mapper.dtd'>
<mapper namespace='com.huan.study.mybatis.mappers.CustomerMapper'>
<resultMap id='BaseResultMapper' type='com.huan.study.mybatis.entity.Customer'>
<id column='id' property='id'/>
<result column='phone' property='phone'/>
<result column='address' property='address'/>
</resultMap>
<insert id='addCustomer'>
insert into customer(phone,address) values (#{phone},#{address})
</insert>
<select id='findCustomer' resultMap='BaseResultMapper'>
select * from customer where phone = #{phone}
</select>
</mapper>
SQL中没有什么特殊的写法。
点击关注公众号,Java干货及时送达
4、配置文件中指定Typehandler的包路径
mybatis.type-handlers-package=com.huan.study.mybatis.typehandler
5、编写后台代码
后台代码比较简单,直接查看。
贴一个mapper层的截图。
6、测试结果
从测试结果中可知,添加数据时,需要加密的数据(phone)在数据库中已经加密了,在查询的时候,加密的数据已经自动解密了。
联系客服