返回顶部
首页 > 资讯 > 后端开发 > Python >mybatis实现特殊字段加密方式
  • 414
分享到

mybatis实现特殊字段加密方式

2024-04-02 19:04:59 414人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录一、背景二、解决方案三、需求四、实现思路五、实现代码前言:介绍一个简单的mybatis加解密方式,日常学习工作中提及这种方法的比较少,所以拿来说说,如果已经知道这种方法的忽略本文

前言:介绍一个简单的mybatis加解密方式,日常学习工作中提及这种方法的比较少,所以拿来说说,如果已经知道这种方法的忽略本文!

一、背景

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

二、解决方案

由于我们系统中使用了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) {
}

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;

@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);
    }
     * 获取值
    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字段加密内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: mybatis实现特殊字段加密方式

本文链接: https://lsjlt.com/news/144564.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • mybatis实现特殊字段加密方式
    目录一、背景二、解决方案三、需求四、实现思路五、实现代码前言:介绍一个简单的MyBatis加解密方式,日常学习工作中提及这种方法的比较少,所以拿来说说,如果已经知道这种方法的忽略本文...
    99+
    2024-04-02
  • mybatis如何实现特殊字段加密
    这篇文章主要为大家展示了“mybatis如何实现特殊字段加密”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“mybatis如何实现特殊字段加密”这篇文章吧。一、背景在我们数据库中有些时候会保存一些...
    99+
    2023-06-29
  • Mybatis特殊字符转义查询实现
    目录1. 问题描述2. 解决方案3. 设计实现3.1 环境准备3.2 代码实现3.3 拦截器实现4. 测试验证1. 问题描述 MyBatis作为目前最常用的ORM数据库访问持久层框架...
    99+
    2023-02-03
    Mybatis特殊字符转义查询 Mybatis特殊字符转义
  • mybatis foreach list特殊处理方式
    目录foreach list特殊处理foreach用法 List和Array,对象1、array数组的类型2、list的类型3、对象类型foreach list特殊处理 最近做一个功...
    99+
    2024-04-02
  • mybatis-plus 拦截器敏感字段加解密的实现
    目录背景一、查询拦截器二、插入和更新拦截器三、注解背景 数据库在保存数据时,对于某些敏感数据需要脱敏或者加密处理,如果一个一个的去加显然工作量大而且容易出错,这个时候可以考虑使用拦截...
    99+
    2024-04-02
  • 如何通过一个注解实现MyBatis字段加解密
    目录简介模块使用方法配置项说明开源链接总结简介 mybatis-crypto 是一个基于 mybatis 插件机制实现的字段加解密组件,通过一个注解即可对敏感数据进行加解密处理。 支...
    99+
    2024-04-02
  • 怎么通过一个注解实现MyBatis字段加解密
    这篇文章主要讲解了“怎么通过一个注解实现MyBatis字段加解密”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么通过一个注解实现MyBatis字段加解密”吧!简介mybatis-crypt...
    99+
    2023-06-29
  • mybatis-plus拦截器敏感字段加解密的实现方法是什么
    本篇内容主要讲解“mybatis-plus拦截器敏感字段加解密的实现方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“mybatis-plus拦截器敏感字段加解密的实现方法是什么”吧!背景...
    99+
    2023-06-25
  • sql如何实现对密码字段加密
    在SQL中实现对密码字段加密的方法有很多种,以下是其中一种常见的方法: 使用加密函数:可以使用内置的加密函数如MD5、SHA1等来...
    99+
    2024-04-02
  • mybatis like模糊查询特殊字符报错转义处理方式
    目录like模糊查询特殊字符报错转义处理方案1方案2like模糊查询中包含有特殊字符(_、\、%)处理注意like模糊查询特殊字符报错转义处理 方案1     <if test...
    99+
    2024-04-02
  • mybatis/mybatis-plus模糊查询语句特殊字符转义拦截器的实现
    目录1.使用mybatis提供的拦截器拦截所有的查询请求。 2.定义SQL语句转义模板,分别对Map和Object对象进行处理 mybatis/mybatis-plus模糊查询语句特...
    99+
    2024-04-02
  • Node.js Mongodb 密码特殊字符 @的解决方法
    在去年的 DB 勒索事件之后, 不少的同学开始加强 Mongodb 的安全性, 其中一种办法就是设置复杂的密码. 那么问题来了, 如果设置的密码里包含一些如 “@”, “:” 一样的特殊字符怎么办?...
    99+
    2022-06-04
    解决方法 特殊字符 密码
  • mybatis/mybatis-plus模糊查询语句特殊字符转义拦截器的实现方法是什么
    本篇内容主要讲解“mybatis/mybatis-plus模糊查询语句特殊字符转义拦截器的实现方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“mybatis/mybatis-plus模糊...
    99+
    2023-06-25
  • Java利用StringBuffer替换特殊字符的方法实现
    在本实例中为保证学生输入的 Java 文件名合格,将利用 StringBuffer 类实现对 Java 文件名中的特殊符号进行替换,包括将中文状态下的“。”和全角状态下的“.”替换为...
    99+
    2024-04-02
  • mybatis 实现字段大小写赋值
    目录mybatis 字段大小写赋值遇到一个问题在使用mybatis的请务必注意字段的大小写问题insert时务必注意mapper的返回值类型mybatis 字段大小写赋值 遇到一个问...
    99+
    2024-04-02
  • C#特殊字符的匹配怎么实现
    本篇内容主要讲解“C#特殊字符的匹配怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#特殊字符的匹配怎么实现”吧!下面提供一些简单的C#正则表达式之特殊字符的匹配示例:string&nb...
    99+
    2023-06-17
  • RSA加密实现之JAVA方式
    package com.xxxx.tax.util;import com.xxxxx.tax.util.ExceptionUtil;import lombok.extern.log4j.Log4j;import java.io.ByteAr...
    99+
    2023-09-28
    java 开发语言
  • SM2加密实现之JAVA方式
    package com.xxx.tax.util;import lombok.extern.slf4j.Slf4j;import org.apache.commons.lang3.StringUtils;import org.bouncyc...
    99+
    2023-09-06
    爬虫
  • springboot实现敏感字段加密存储解密显示功能
    springboot实现敏感字段加密存储,解密显示,通过mybatis,自定义注解+AOP切面,Base64加解密方式实现功能。 1.代码实现: 创建springboot项目 添加依...
    99+
    2024-04-02
  • Android自定义密码样式 黑点转换成特殊字符
    本文为大家分享了Android自定义密码样式的制作代码,黑点换成¥、%等特殊字符,供大家参考,具体内容如下复制下面代码即可:布局:<?xml version="1.0" encoding="utf-8"?><...
    99+
    2023-05-30
    android 密码样式 roi
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作