当前位置: 首页 > 后端技术 > Java

扔掉工具!MyBatis通过简单的配置就可以搞定加解密,简直不要太方便~!

时间:2023-04-01 13:52:49 Java

来源:juejin.cn/post/6963811586184052767前言:介绍一个简单的MyBatis加解密方法,日常学习和工作中很少提到,所以说一下吧,如果你已经知道这个方法的忽略这篇文章!1.背景我们的数据库中有时会保存用户的敏感信息,如手机号、银行卡等信息。如果此信息以纯文本形式存储,则不安全。如果:黑客入侵数据库,或前员工导出数据,都可能导致这些敏感数据的泄露。所以我们需要想办法解决这个问题。2、解决方案由于我们系统中使用Mybatis作为数据库持久层,所以我们决定使用Mybatis的TypeHandler或者Plugin来解决。TypeHandler:我们需要在某些列上手动指定typeHandler来选择使用哪个typeHandler或者根据@MappedJdbcTypes和@MappedTypes注解自行推断。Plugin:可以拦截系统中的select、insert、update、delete等语句,并可以还获取sql执行前的参数和执行后的数据。经过考虑,决定使用TypeHandler来加解密数据。推荐一个SpringBoot基础教程和实例:https://github.com/javastacks...3.需求我们有一个客户表customer,里面有客户的手机号码(phone)和客户地址(address)等字段),其中客户的手机号码(phone)需要加密存入数据库。1、添加客户信息时,客户手机号码自动加密存储在数据中。2、查询客户信息时,自动解密客户手机号。四、实现思路1、写一个实体类。该实体类的所有数据表示publicclassEncrypt{privateStringvalue;publicEncrypt(){}publicEncrypt(Stringvalue){this.value=value;}publicStringgetValue(){返回值;}publicvoidsetValue(Stringvalue){this.value=value;}}2.写加解密TypeHandler时设置参数,加密数据。从数据库中获取记录时,解密数据。包com.huan.study.mybatis.typehandler;导入cn.hutool.crypto.SecureUtil;导入cn.hutool.crypto.symmetric.AES;导入org.apache.ibatis.type.BaseTypeHandler;导入org.apache.ibatis.type.JdbcType;导入org.apache.ibatis.type.MappedJdbcTypes;导入org.apache.ibatis.type.MappedTypes;导入java.nio.charset.StandardCharsets;导入java.sql.CallableStatement;导入java.sql.PreparedStatement;导入java.sql.ResultSet;importjava.sql.SQLException;/***加解密TypeHandler**@authorhuan.fu2021/5/18-上午9:20*/@MappedJdbcTypes(JdbcType.VARCHAR)@MappedTypes(Encrypt.class)publicclassEncryptTypeHandlerextendsBaseTypeHandler{privatestaticfinalbyte[]KEYS="12345678abcdefgh".getBytes(StandardCharsets.UTF_8);/***设置参数*/@OverridepublicvoidsetNonNullParameter(PreparedStatementps,inti,Encryptparameter,JdbcTypejdbcType)throwsSQLException{if(parameter==null||parameter.getValue()==null){ps.setString(i,null);返回;}AESaes=SecureUtil.aes(KEYS);Stringencrypt=aes.encryptHex(parameter.getValue());ps.setString(i,加密);}/***获取价值*/@OverridepublicEncryptgetNullableResult(ResultSetrs,StringcolumnName)throwsSQLException{returndecrypt(rs.getString(columnName));}/***获取价值*/@OverridepublicEncryptgetNullableResult(ResultSetrs,intcolumnIndex)throwsSQLException{returndecrypt(rs.getString(columnIndex));}/***获取价值*/@OverridepublicEncryptgetNullableResult(CallableStatementcs,intcolumnIndex)throwsSQLException{returndecrypt(cs.getString(columnIndex));}publicEncryptdecrypt(Stringvalue){if(null==value){returnnull;}returnnewEncrypt(SecureUtil.aes(KEYS).decryptStr(value));}}注意??:@MappedTypes:表示处理器处理的java类型@MappedJdbcTypes:表示处理器处理的Jdbc类型。3、sql语句中写法insertintocustomer(phone,address)values(#{phone},#{address})从客户中选择*wherephone=#{phone}SQL中没有什么特别的写法。4.在配置文件mybatis.type-handlers-package=com.huan.study.mybatis.typehandler中指定Typehandler的包路径5.编写后台代码,提供添加方法,提供基于手机的查询方法数字。后台代码比较简单,可以直接查看:》http://dw-z.ink/1s520贴出mapper层的截图。6.测试结果从测试结果可以看出,在添加数据的时候,需要加密的数据(手机)已经在数据库中加密了,此时加密的数据已经自动解密了。近期热点文章推荐:1.1,000+Java面试题及答案(2022最新版)2.精彩!Java协程来了...3.SpringBoot2.x教程,太全面了!4.别用bangbang爆满屏幕,试试decorator模式,这才是优雅的方式!!5.《Java开发手册(嵩山版)》最新发布,赶快下载吧!感觉不错,别忘了点赞+转发!