MyBatis 一个简单配置搞定加密、解密,不能太方便了~!TypeHandler

这篇具有很好参考价值的文章主要介绍了MyBatis 一个简单配置搞定加密、解密,不能太方便了~!TypeHandler。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、背景
二、解决方案
三、需求
四、实现思路
五、实现代码

一、背景


在我们数据库中有些时候会保存一些用户的敏感信息,比如:手机号、银行卡等信息,如果这些信息以明文的方式保存,那么是不安全的。假如:黑客黑进了数据库,或者离职人员导出了数据,那么就可能导致这些敏感数据的泄漏。因此我们就需要找到一种方法来解决这个问题。

二、解决方案


由于我们系统中使用了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来加解密数据。

三、需求


我们有一张客户表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;
    }
}
package com.huan.study.mybatis.entity;

import com.huan.study.mybatis.typehandler.Encrypt;

import java.util.List;

/**
 * @author huan.fu 2021/5/18 - 上午10:42
 */
public class Customer {
    
    private Integer id;
    
    private Encrypt phone;
    
    private List<String> address;
    
    public Integer getId() {
        return id;
    }
    
    public void setId(Integer id) {
        this.id = id;
    }
    
    public Encrypt getPhone() {
        return phone;
    }
    
    public void setPhone(Encrypt phone) {
        this.phone = phone;
    }
    
    public List<String> getAddress() {
        return address;
    }
    
    public void setAddress(List<String> address) {
        this.address = address;
    }
}


2、编写一个加解密的TypeHandler设置参数时,加密数据。
从数据库获取记录时,解密数据。

package com.huan.study.mybatis.typehandler;

import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.symmetric.AES;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;

import java.nio.charset.StandardCharsets;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * 加解密TypeHandler
 *
 * @author huan.fu 2021/5/18 - 上午9:20
 */
@MappedJdbcTypes(JdbcType.VARCHAR)
@MappedTypes(Encrypt.class)
public class EncryptTypeHandler extends BaseTypeHandler<Encrypt> {

    private static final byte[] KEYS = "12345678abcdefgh".getBytes(StandardCharsets.UTF_8);

    /**
     * 设置参数
     */
    @Override
    public 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);
    }

    /**
     * 获取值
     */
    @Override
    public Encrypt getNullableResult(ResultSet rs, String columnName) throws SQLException {
        return decrypt(rs.getString(columnName));
    }

    /**
     * 获取值
     */
    @Override
    public Encrypt getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        return decrypt(rs.getString(columnIndex));
    }

    /**
     * 获取值
     */
    @Override
    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层的截图。

MyBatis 一个简单配置搞定加密、解密,不能太方便了~!TypeHandler,oracle,数据库

 

6、测试结果

MyBatis 一个简单配置搞定加密、解密,不能太方便了~!TypeHandler,oracle,数据库

 

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

五、实现代码

https://gitee.com/huan1993/spring-cloud-parent/tree/master/mybatis/mybatis-typehandler-encrypt

参考链接:

面试官问:Mybatis中的TypeHandler你用过吗?文章来源地址https://www.toymoban.com/news/detail-679190.html

到了这里,关于MyBatis 一个简单配置搞定加密、解密,不能太方便了~!TypeHandler的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 加密的PDF怎么解密?其实很简单,只要掌握这个技巧

    如今大家在工作中或学习中,使用频率较高的文档格式就是PDF,因为它具有较高的稳定性,在传输过程中不会发生内容排版错乱等现象。而有时我们为了保护PDF文件里的内容信息,就需要对其使用加密处理,避免他人未经授权进行查看。 可当大家要对该文档进行打印或编辑时

    2024年02月11日
    浏览(46)
  • flutter使用shared_preferences依赖库实现简单的本地数据存储,封装成一个简单的单例类,方便前端同学使用

    shared_preferences 仓库地址:shared_preferences | Flutter Package shared_preferences这个依赖库还是非常好用的,全平台支持,就像前端经常使用的localstorage一样方便,所以就想着封装成一个简单的类,方便前端同学使用。封装好的代码支持json或者数组等这种类型的存储和获取。 在utils里面

    2024年01月20日
    浏览(48)
  • 【Jasypt】Spring Boot 配置文件加解密 Jasypt 配置文件加密

    Jasypt是一个Java简易加密库,用于加密配置文件中的敏感信息,如数据库密码。jasypt库与springboot集成,在实际开发中非常方便。 1、Jasypt Spring Boot 为 spring boot 应用程序中的属性源提供加密支持,出于安全考虑,Spring boot 配置文件中的敏感信息通常需要对它进行加密/脱敏处理,

    2024年02月03日
    浏览(45)
  • DeepBI一个AI开源数据软件是如何简单几句话搞定数亿条数据分析

    重磅消息 : DeepBI 已经支持 Starrocks 了,几句话搞定 数亿条 数据分析已经实锤了!!! 传统数据分析就像是一座大山,压得人喘不过气。采集、存储、筛选、整合、人工预测、技术实现,每一步都如同攀登峭壁,艰难而耗时。而随着AI时代的到来, DeepBI 如同一股清流,简化

    2024年01月23日
    浏览(42)
  • 用java语言写一个AES算法,使用AES(CBC模式)对数据进行加密或解密。加解密用到的密钥(Key)和密钥偏移量(IV),代码实例类编写。

    以下是一个使用Java编写的AES算法实例,使用AES(CBC模式)对数据进行加密和解密。代码中包括了生成随机密钥和密钥偏移量的方法。 java Copy code import javax.crypto.*; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.security.InvalidAlgorithmParameterException; import

    2024年02月07日
    浏览(60)
  • STM32 Hal库FreeRTOS统计CPU占比 找出有问题的任务 仅需一个函数搞定 超简单

    一、实现目标 STM32F103 基于Hal库跑FreeRTOS,统计CPU占比 找出有问题的任务,类似实现一个windows 系统的任务查看界面。 代码运行结果如下 二、思路 记录任务的时间点,相减获得任务所占用的时间,所得时间/总时间,得到该CPU占比。  三、实现函数 只需要调用一个vTaskGetRunT

    2024年01月24日
    浏览(42)
  • 在Spring Boot微服务使用jasypt-spring-boot加密和解密yml配置文件

    记录 :424 场景 :在Spring Boot微服务,使用jasypt-spring-boot加密和解密yml配置文件中的配置信息。 版本 :JDK 1.8,Spring Boot 2.6.3,jasypt-1.9.3,jasypt-spring-boot-2.1.2, jasypt-spring-boot-3.0.5。 开源地址 :https://github.com/ulisesbocchio/jasypt-spring-boot 1.在Spring Boot微服务使用jasypt-spring-boot-3.0.5版本

    2024年02月09日
    浏览(68)
  • 实现 MyBatis-Plus 中的配置加密功能(使用 AES 算法)

    在项目开发过程中,为了增强数据安全性,我们常常需要对敏感信息进行加密处理。MyBatis-Plus 提供了方便的配置加密功能,使我们能够对配置文件中的敏感信息进行加密和解密操作。本文将详细介绍如何实现 MyBatis-Plus 中的配置加密功能,并给出相应的代码示例。 首先,我们

    2024年02月07日
    浏览(40)
  • FlexCompress组件方便的压缩和加密算法

    FlexCompress组件是一个非常强大的 ComponentAce 产品的名称,它已作为高速压缩库发布,为 Delphi 应用程序提供归档功能。使用这个强大的工具,程序员将能够压缩您的编程项目。您面前的组件使用了非常先进和方便的压缩和加密算法,尽管有这个功能,您仍然可以轻松快速地执行

    2024年02月05日
    浏览(29)
  • C++并发操作解密:轻松搞定数据同步

      概述: 在C++中,通过互斥锁解决并发数据同步问题。定义共享数据和互斥锁,编写线程函数,使用互斥锁确保操作的原子性。主函数中创建并启动线程,保障线程安全。实例源代码演示了简单而有效的同步机制。 在C++中解决并发操作时的数据同步问题通常需要使用互斥锁

    2024年02月04日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包