1 问题背景

在数据库存储人员的信息时,有一些信息是敏感数据,如身份证号、出生地等。为了防止信息泄漏,这些信息不允许直接在数据库中查看,此时就需要对这些字段进行加密存储,但在页面查看的仍旧是解密后的数据。这里就涉及到加解密的问题,有两种解决方案。

2 解决方案

2.1 使用数据库加密算法

通过数据库自带的加密算法,在sql里直接使用算法加解密,这种有较多缺点,不推荐使用。

  • 写法繁琐,不易开发维护

  • 适配多种数据库时,算法难以统一,工作量也剧增

2.2 使用mybatis的自定义参数类型转换器

通过自定义Java类型和类型转换器,并在mapper.xml里标注类型,通过mybatis进行加解密。

  • 加密算法可自由选择

  • 开发维护比较简单方便

  • 不存在适配多种数据库的问题

3 一般web项目使用

3.1 创建自定义Java类型

创建一个空白类,在mapper.xml文件查询和新增修改时标注说明,表示需要mybatis进行相关类型转换。

@Alias("SecretField")
public class SecretField {
}
复制代码

3.2 自定义类的转换处理器

这里使用国密SM4进行加解密,当然算法可自由选择别的如AES等。

@MappedTypes注解映射刚才的自定义Java类

@MappedTypes(SecretField.class)
public class SecretFieldTypeHandler extends BaseTypeHandler<String> {private static final Logger log = LoggerFactory.getLogger(SecretFieldTypeHandler.class);@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {try {if (StringUtils.hasText(parameter)) {String encryptStr = Sm4Util.encryptData_ECB(parameter);ps.setString(i, encryptStr);}} catch (Exception e) {ps.setString(i, parameter);log.error("mybatis加密参数异常,i:{},parameter:{}", i, parameter);}}@Overridepublic String getNullableResult(ResultSet rs, String columnName) throws SQLException {String columnValue = rs.getString(columnName);try {if (StringUtils.hasText(columnValue)) {columnValue = Sm4Util.decryptData_ECB(columnValue);}} catch (Exception e) {log.error("mybatis解密参数异常,columnName:{}, columnValue:{}", columnName, columnValue);}return columnValue;}@Overridepublic String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {return null;}@Overridepublic String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {return null;}
}
复制代码

3.3 配置自定义类型和类型转换器

这一步也可使用相关注解完成。

配置文件为mybatis的配置文件,如mybatis-config.xml。

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE configuration PUBLIC "-//mybaties.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><settings></settings><typeAliases><typeAlias type="com.banxian.mybatis.alias.SecretField" alias="SecretField"/></typeAliases><typeHandlers><typeHandler handler="com.banxian.mybatis.typehandler.SecretFieldTypeHandler" /></typeHandlers></configuration>
复制代码

3.4 查询使用

查询返回需通过resultMap映射,在加密字段进行javaType指明需要的类型转换器

另外如果旧代码中结果集大量直接使用map返回,时间紧张的情况下,则可考虑写一个工具类,在service里调用进行手动解密,没得办法呀!。

    <resultMap id="BaseResultMap" type="User"><result column="sfz" property="sfz"  javaType="SecretField"/></resultMap>
复制代码

3.5 新增修改使用

在设置相关参数值时,也就是在#{}里,使用javaType指明需要的类型转换器

   insert into ... values(...<if test="sfz!= null">#{sfz,jdbcType=VARCHAR,javaType=SecretField},</if>)
复制代码

4. springboot项目使用

  • 自定义类型和类型转换器代码和上面一样,这里不在赘述。

  • 项目使用了mybatis-plus插件。

4.1 配置自定义类型和类型转换器

在项目配置文件里application.yml里加上配置type-handlers-package 和   type-aliases-package:分别指出你的类型转换器所在包名和自定义类所在包名。

mybatis-plus:global-config:db-config:logic-delete-field: deletedlogic-not-delete-value: "0"logic-delete-value: "1"mapper-locations: "classpath*:/mapper/**/*.xml"configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpltype-handlers-package: com.banxian.mybatis.typehandlertype-aliases-package: com.banxian.mybatis.alias
复制代码

4.2 mybatis-plus的使用

当然上面web项目的查询、新增和修改使用方法这里也是可以正常使用的

1)在实体类上使用注解 @TableName(autoResultMap = true)

2)在加密字段上指明类型@TableField(value = "sfz", typeHandler = SecretFieldTypeHandler.class)

@Data
@TableName(autoResultMap = true)
public class User implements Serializable {private static final long serialVersionUID = 4344848828462926573L;@TableId(value = "id", type = IdType.ASSIGN_ID)private Integer id;/*** 名称*/private String userName;/*** 是否删除 1:是  0:否*/@TableLogicprivate String deleted;/*** 是否有效 1:是  0:否*/private String valid;/*** 创建时间*/@TableField(value = "create_at", fill = FieldFill.INSERT)private LocalDateTime createAt;/*** 更新时间*/@TableField(value = "update_at", fill = FieldFill.INSERT_UPDATE)private LocalDateTime updateAt;@TableField(value = "sfz", typeHandler = SecretFieldTypeHandler.class)private String sfz;
}

通过mybatis自定义参数类型转换器,进行数据库字段加密脱敏相关推荐

  1. 使用 mybatis 自定义日期类型转换器

    文章目录 前言 一.resources 1.1 sqlMapConfig.xml 1.2 log4j.properties 1.3 userMapper.xml 二.java结构 2.1 dao 2. ...

  2. 自定义的类型转换器中怎样自定义错误消息?(待解答)

    1.HTTP没有"类型"的概念,每一项表单输入只可能是一个字符串或一个字符串数组.从HTML表单到服务器端,必须把String转换为特定的数据类型. 2.字符串和基本数据类型之间的 ...

  3. SpringMVC的请求参数,类型转换器(日期格式),请求映射

    SpringMVC的请求参数,类型转换器(日期格式),请求映射 请求参数 springMVC将传递的参数封装到处理的方法形参中,达到快速访问参数的目的 普通参数类型 参数名与处理器方法形参名保持一致 ...

  4. Spring MVC__自定义日期类型转换器

    WEB层采用Spring MVC框架,将查询到的数据传递给APP端或客户端,这没啥,但是坑的是实体类中有日期类型的属性,但是你必须提前格式化好之后返回给它们.说真的,以前真没这样做过,之前都是一口气查 ...

  5. myBatis自定义jdbcType类型

    myBatis自定义jdbcType类型 DATE类的定义 DATE类配置自定义处理类–>mybatis-config.xml DATE类sql处理 JSONArray类型的定义 JSONArr ...

  6. Mybatis传入参数类型为Map

    转载自   Mybatis传入参数类型为Map mybatis更新sql语句: <update id="publishT00_notice" parameterType=&q ...

  7. Mybatis传入参数类型为ListIntergert作为条件进行查询

    Mybatis传入参数类型为List作为条件进行查询 higher2017关注 2017.02.07 10:23:16字数 130阅读 5,658 表结构: 表名称为constant 需求: 现在想查 ...

  8. oracle to_char 和 to_date的区别,斜杠和横杠日期转换,mybatis中入参日期,数据库字段是date的写法

    文章目录 斜线日期转换为横线 这样的时间字符串如何转换20201212040506258 ORA-01830: 日期格式图片在转换整个输入字符串之前结束 mybatis中入参日期,数据库字段是date ...

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

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

最新文章

  1. 【资源汇总分享】Android开发资源汇总之一
  2. SAP中服务性订单的替代解决方案
  3. 44. 源代码解读-RocketMQ-架构
  4. LeetCode —— 365. 水壶问题(Python3)
  5. 2021年前端还好找工作吗?
  6. C语言程序设计:现代方法 中文高清PDF版下载
  7. Atitit 综合原则 软件与项目开发中的理念信念 目录 1.1. 建议组合使用扬长避短 1 1.2. 常见数据库 mysql oracle mssql mongodb postgre sqlit
  8. Mysql分页查询出现重复数据
  9. docker(9):高级网络配置
  10. jsp中的https强转访问
  11. 王小川告别搜狗那一天
  12. React全家桶详细讲解-图文并茂
  13. 数字芯片设计中的时钟分频电路,你了解多少?
  14. 尼尔机器人技能快捷键_《尼尔:机械部队》组合按键技能使用攻略
  15. 请注意:黑客开始用云隐藏IP地址
  16. 1 什么是末端柔顺控制?
  17. 多线程 (进阶+初阶)
  18. MODBUS通讯详解(博客园)
  19. 计算机一级考试理论题第5套,计算机等级考试一级windows笔试模拟试题5套
  20. Flowable入门系列文章62 - 异步延续

热门文章

  1. 看它就够了,让你明白什么是【ajax】
  2. Deep learning with JavaScript:
  3. 光照传感器哪个好_论文|多传感器环境下的温室蓝莓智能控制系统研究
  4. 乘法逆元 +数论分块 +平方和公式
  5. 生产无线充线圈要选好设备
  6. #145-(EZOI模拟练习)[模拟]保龄球
  7. 【软件测试】软件本地化测试
  8. 读完研究生转行,研究生学历有什么用?
  9. android 10.0 SystemUI导航栏默认背景色的修改
  10. 最新英国签证申请过程--2020.1