mybatis数据加密,mybatis 加密
一.背景二。解决方案三。要求四。实现思路五、实现代码前言:介绍一种简单的MyBatis加密解密方法。这种方法在日常学习中很少提到,就来说说吧。如果你已经知道这个方法被忽略了,这篇文章!
00-1010有时候,用户的一些敏感信息会保存在我们的数据库中,比如:手机号、银行卡等信息。如果这些信息以纯文本格式保存,则是不安全的。如果:黑客侵入数据库,或者前员工导出数据,都有可能导致这些敏感数据的泄露。所以我们需要想办法解决这个问题。
00-1010由于Mybatis被用作我们系统中的数据库持久层,我们决定使用Mybatis的TypeHandler或插件来解决它。
TypeHandler:要求我们在某些列上手动指定typeHandler,以选择使用哪个typeHandler,或者根据@MappedJdbcTypes和@MappedTypes批注自行推断。
结果column= phone property= phone type handler= com . Huan . study . mybatis . type handler . encryptypehandler /http://www . Sina.com/:可以拦截select、insert、update、delete等语句。在系统中,还可以获取sql执行前的参数和执行后的数据。
经过考虑,我们决定使用TypeHandler来加密和解密数据。
00-1010我们有一个客户表customer,里面有客户的手机号(电话)和客户的地址(地址)等字段,其中客户的手机号(电话)需要加密存储在数据库中。
1.添加客户信息时,客户的手机号码会自动加密保存在数据中。
2.查询客户信息时,自动解密客户的手机号码。
目录
Plugin
公共类加密{私有字符串值;public Encrypt() { }公共加密(字符串值){ this.value=value公共字符串getValue() {返回值;公共void setValue(字符串值){ }1、编写一个实体类,凡是此实体类的数据都表示需要加解密的
设置参数时加密数据。从数据库获取记录时解密数据。包com . Huan . study . my batis . type handler;导入cn . Hu tool . crypto . secure util;导入cn . Hu tool . crypto . symmetric . AES;导入org . Apache . ibatis . type . basetypehandler;导入org . Apache . ibatis . type . JDBC type;导入org . Apache . ibatis . type . mapped JDBC types;导入org . Apache . ibatis . type . mapped types;导入Java . nio . charset . standard charsets;导入Java . SQL . callable statement;导入Java . SQL . prepared statement;导入Java . SQL . resultset;导入Java . SQL . SQL exception;/* * *加密和解密type handler * * @ author Huan . fu 2021/5/18-9:20 */@ mapped JDBC types(JDBC type . varchar)@ mapped types(Encrypt . class)公共类EncryptTypeHandler扩展basetyphandlerrencrypt { private static final byte[]KEYS= 12345678 abcdefgh 。getBytes(StandardCharsets。UTF _ 8);/* * * Set parameter */@覆盖公共void setnonnullparameter
(PreparedStatement ps, int i, Encrypt parameter, JdbcType jdbcType) throws SQLException { if (parameter == null parameter.getValue() == null) { ps.setString(i, null); return; } AES aes = SecureUtil.aes(KEYS); String encrypt = aes.encryptHex(parameter.getValue()); ps.setString(i, encrypt); } * 获取值 public Encrypt getNullableResult(ResultSet rs, String columnName) throws SQLException { return decrypt(rs.getString(columnName)); public Encrypt getNullableResult(ResultSet rs, int columnIndex) throws SQLException { return decrypt(rs.getString(columnIndex)); public Encrypt getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { return decrypt(cs.getString(columnIndex)); public Encrypt decrypt(String value) { if (null == value) { return null; return new Encrypt(SecureUtil.aes(KEYS).decryptStr(value));}注意⚠️:
@MappedTypes
:表示该处理器处理的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中没有什么特殊的写法。
4、配置文件中指定Typehandler的包路径
mybatis.type-handlers-package=com.huan.study.mybatis.typehandler
5、编写后台代码
提供一个添加方法提供一个根据手机号查询的方法后台代码比较简单,直接查看:
https://gitee.com/huan1993/spring-cloud-parent/tree/master/mybatis/mybatis-typehandler-encrypt
贴一个mapper层的截图。
6、测试结果
从测试结果中可知,添加数据时,需要加密的数据(phone)在数据库中已经加密了,在查询的时候,加密的数据已经自动解密了。
五、实现代码
https://gitee.com/huan1993/spring-cloud-parent/tree/master/mybatis/mybatis-typehandler-encrypt
到此这篇关于mybatis实现特殊字段加密的文章就介绍到这了,更多相关mybatis字段加密内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。