一、背景

在我们数据库中有些时候会保存一些用户的敏感信息,比如:手机号、银行卡等信息,如果这些信息以明文的方式保存,那么是不安全的。

假如:黑客黑进了数据库,或者离职人员导出了数据,那么就可能导致这些敏感数据的泄漏。因此我们就需要找到一种方法来解决这个问题。

二、解决方案

由于我们系统中使用了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)是需要加密保存到数据库中的。

1、 在添加客户信息时,自动将客户手机号加密保存到数据中;

2、 在查询客户信息时,自动解密客户手机号;

四、实现思路

1、 编写一个实体类,凡是此实体类的数据都表示需要加解密的;

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;}
}

2、编写一个加解密的TypeHandler

  • 设置参数时,加密数据。

  • 从数据库获取记录时,解密数据。

package com.huan.study.mybatis.typehandler;@MappedJdbcTypes(JdbcType.VARCHAR)
@MappedTypes(Encrypt.class)
public class EncryptTypeHandler extends BaseTypeHandler<Encrypt> {private static final byte[] KEYS = "12345678abcdefgh".getBytes(StandardCharsets.UTF_8);/*** 设置参数*/@Overridepublic 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);}/*** 获取值*/@Overridepublic Encrypt getNullableResult(ResultSet rs, String columnName) throws SQLException {return decrypt(rs.getString(columnName));}/*** 获取值*/@Overridepublic Encrypt getNullableResult(ResultSet rs, int columnIndex) throws SQLException {return decrypt(rs.getString(columnIndex));}/*** 获取值*/@Overridepublic 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、编写后台代码

  • 提供一个添加方法

  • 提供一个根据手机号查询的方法

后台代码比较简单,直接查看。

贴一个mapper层的截图。

6、测试结果

从测试结果中可知,添加数据时,需要加密的数据(phone)在数据库中已经加密了,在查询的时候,加密的数据已经自动解密了。

MyBatis配置加密, 解密相关推荐

  1. Spring-Web - 数据库 字段加密 解密

      在工作中,为了保证数据安全,需要对数据库字段进行加解密,之前工作中就遇到了这种情况,因为线上数据库有很多的人都有权限,运维,账务,运营(通过后台系统查看),出口太多了,但有用户向我们平台举报,说有 ...

  2. 使用mybatis拦截器实现字段加密解密

    前言 .项目中我们存储一些用户信息的使用后根据规定,不可以存储明文,尤其是密码,实现的办法有好多种,今天承接上一篇文章mybatis拦截器,利用拦截器实现使用注解的方式在数据插入前进行加密,查询是自动 ...

  3. Spring Cloud构建微服务架构:分布式配置中心(加密解密)

    最近正好想发一篇关于配置中心加密的细节内容,结果发现基础的加密解密居然漏了,所以在这个入门系列中补充一下.后面再更新一下,使用配置中心的一些经验和教训. 在微服务架构中,我们通常都会采用DevOps的 ...

  4. android xml加密解密,华为配置加解密工具

    华为配置加解密工具是一款实用的加密解密软件,支持XML加解密,支持CFG加解密,支持密文解密等等,加密强度高非常安全,解密快不影响源文件,可以有效保障隐私重要文件的安全,有需要的朋友欢迎使用. 常见问 ...

  5. Spring Cloud Config 配置的加密解密

    配置内容的加密解密 很多场景下很多场景下,对于某些敏感的配置内容,例如数据库账号密码等应当加密存储.Config Server为配置内容的加密与解密提供了支持. 安装JCE Config Server ...

  6. delphi7aes加密解密与java互转_惊呆了!不改一行Java代码竟然就能轻松解决敏感信息加解密|原创

    前言 出于安全考虑,现需要将数据库的中敏感信息加密存储到数据库中,但是正常业务交互还是需要使用明文数据,所以查询返回我们还需要经过相应的解密才能返回给调用方. ❝ ps:日常开发中,我们要有一定的安全 ...

  7. SpringBoot 接口加密解密,新姿势!

    我是 ABin-阿斌:写一生代码,创一世佳话,筑一览芳华.如果小伙伴们觉得不错就一键三连吧~ 声明:原文作者:微信公众号:方志朋 文章目录 1 . 介绍 2 . 前置知识 2.1 hutool-cry ...

  8. 关于实现手机号,身份证号加密解密解决方案

    关于实现手机号,身份证号加密解密解决方案 要求: 1.不入侵任何业务逻辑 2.可以扩展解密解密字段 3.可以扩展加密解密算法 环境: jdk1.8.springMVC 解决方案: 基于自定义注解和my ...

  9. 如何优雅的实现 Spring Boot 接口参数加密解密?

    点击关注公众号,Java干货及时送达 加密解密本身并不是难事,问题是在何时去处理?定义一个过滤器,将请求和响应分别拦截下来进行处理也是一个办法,这种方式虽然粗暴,但是灵活,因为可以拿到一手的请求参数和 ...

最新文章

  1. 中级实训第一天的自学报告
  2. 干货 | 顾险峰:对抗生成网络的几何理论解释(附视频PPT)
  3. 20100506 学习记录:grdview添加新的一行数据
  4. [置顶] 安卓高手之路之ClassLoader(二)
  5. SQL Server2008(二)各版本的功能和主要应用范围
  6. C#中自定义类数组和结构数组的使用
  7. 九十七、轻松搞定Python中的PDF办公自动化系列
  8. spring的事物配置
  9. 【转】增量式PID控制算法
  10. 【linux】linux 安装 protobuf 2.5.0 版本
  11. python生成json_python中如何进行json转化
  12. Windows Azure Storage (1) Windows Azure Storage Service存储服务
  13. 【KE特效仿制】假面骑士 EX-AID NCOP+无彩限的怪灵世界 NCOP
  14. 希尔排序、快速排序的每一趟
  15. cdr多页面排版_CDR排版须掌握三大功能 值得收藏
  16. 贴片电阻阻值识别方法
  17. 中断向量,中断向量表 ,中断服务函数
  18. 全面解读居住证积分新政,赶紧看看你离落户上海还有多远!
  19. K210(SiPEED MaixBit)MicroPython使用参考(三、播放SD卡内视频文件)
  20. freopen函数的使用以及freopen与fopen的区别 open、fopen、freopen区别(文件操作)

热门文章

  1. 【codeforces 527A】Playing with Paper
  2. 1628:完成基于脚本的安装失败(手把手教学)
  3. vue3中导出excel表格
  4. 计算机基础知识考试模拟试题,计算机基础知识选择题考试必备考试真题模拟题...
  5. 金融科技B端市场群雄争霸 PATH四家各出奇招
  6. 关于uni-app入门看完这篇就够了
  7. linux无root权限安装软件
  8. 我的世界java边境之地_我的世界边境之地是什么 我的世界边境之地介绍
  9. 6月24日BEA成都User Group活动PPT下载
  10. mba辅导班哪个机构好?全方位解答<title>mba辅导班</title>