返回顶部
首页 > 资讯 > 后端开发 > Python >MyBatis-Plus如何实现自动加密解密
  • 354
分享到

MyBatis-Plus如何实现自动加密解密

2024-04-02 19:04:59 354人浏览 八月长安

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

摘要

目录mybatis-Plus 自动加密解密实现TypeHandler添加注解查询加密字段MyBatis-Plus 敏感数据的加密写加密解密的工具类继承BaseTypeHandler

MyBatis-Plus 自动加密解密

通过使用MyBatis的typeHandler功能,对入参和出参进行处理,实现无缝加密解密(将明文加密后保存至数据库;从数据库读取时,自动将密文解密成明文)

实现TypeHandler


@Slf4j
public class UserTypeHandler extends BaseTypeHandler<Object> {
    
    @Override
    public void setNonNullParameter(PreparedStatement preparedStatement, int i, Object parameter, JdbcType jdbcType) {
        try {
            if (StrUtil.isBlank((String) parameter)) {
                return;
            }
            // todo 加密操作
            String encrypt = "";
            preparedStatement.setString(i, encrypt);
        } catch (Exception e) {
            log.error("typeHandler加密异常:" + e);
        }
    }
    
    @Override
    public Object getNullableResult(ResultSet resultSet, String columnName) throws sqlException {
        String col = resultSet.getString(columnName);
        try {
            if (StrUtil.isBlank(col)) {
                return col;
            }
            // todo 对结果col进行解密操作
            return "";
        } catch (Exception e) {
            log.error("typeHandler解密异常:" + e);
        }
        return col;
    }
    
    @Override
    public Object getNullableResult(ResultSet resultSet, int columnIndex) throws SQLException {
        String col = resultSet.getString(columnIndex);
        try {
            if (StrUtil.isBlank(col)) {
                return col;
            }
            // todo 对结果col进行解密操作
            return "";
        } catch (Exception e) {
            log.error("typeHandler解密异常:" + e);
        }
        return col;
    }
    
    @Override
    public Object getNullableResult(CallableStatement callableStatement, int columnIndex) throws SQLException {
        String col = callableStatement.getString(columnIndex);
        try {
            if (StrUtil.isBlank(col)) {
                return col;
            }
            // todo 对结果col进行解密操作
            return "";
        } catch (Exception e) {
            log.error("typeHandler解密异常:" + e);
        }
        return col;
    }
}

添加注解

在对应的实体类中

  • 在 @TableName 注解中,设置 autoResultMap 参数为true
  • 在需要加解密的字段上,添加注解 @TableField(typeHandler = UserTypeHandler.class)

@Data
@TableName(value = "t_user", autoResultMap = true)
public class UserEntity {
    
    @TableId(type = IdType.AUTO)
    private Integer id;
    private String name;
    private Integer age;
    @TableField(typeHandler = UserTypeHandler.class)
    private String passWord;
    private String role;
}

查询加密字段

MyBatis-Plus的QueryWrapper在查询加密字段时,并不会进入TypeHandler,需要手写sql,指定字段进行TypeHandler中的流程。

注解方式


@Results(id= "resultMap", value = {
    @Result(column = "password", property = "password", typeHandler = UserTypeHandler.class)
})
@Select("select * from t_user where password = #{password, typeHandler=com.mybatisdemo.config.UserTypeHandler}")
List<UserEntity> list(UserQuery userQuery);

XML方式


<resultMap id="userMap" type="com.mybatisdemo.entity.UserEntity">
    <result column="password" property="password" typeHandler="com.mybatisdemo.config.UserTypeHandler" />
</resultMap>
<select id="list" resultMap="userMap">
    select * from t_user where password = #{password,typeHandler=com.mybatisdemo.config.UserTypeHandler}
</select>

MyBatis-Plus 敏感数据的加密

最近在做项目,需要实现对身份证,密码等敏感数据的加密,即不能以明文存储密码到数据库。

上网查了一下资料,解决办法如下:

写加密解密的工具类


import org.apache.commons.codec.binary.Base64;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecreTKEySpec;
public class AES {
    // 密钥
    public static String key = "AD42F6697B035B7580E4FEF93BE20BAD";
    private static String charset = "utf-8";
    // 偏移量
    private static int offset = 16;
    private static String transfORMation = "AES/CBC/PKCS5Padding";
    private static String alGorithm = "AES";
    
    public static String encrypt(String content) {
        return encrypt(content, key);
    }
    
    public static String decrypt(String content) {
        return decrypt(content, key);
    }
    
    public static String encrypt(String content, String key) {
        try {
            SecretKeySpec skey = new SecretKeySpec(key.getBytes(), algorithm);
            IvParameterSpec iv = new IvParameterSpec(key.getBytes(), 0, offset);
            Cipher cipher = Cipher.getInstance(transformation);
            byte[] byteContent = content.getBytes(charset);
            cipher.init(Cipher.ENCRYPT_MODE, skey, iv);// 初始化
            byte[] result = cipher.doFinal(byteContent);
            return new Base64().encodeToString(result); // 加密
        } catch (Exception e) {
            // LogUtil.exception(e);
        }
        return null;
    }
    
    public static String decrypt(String content, String key) {
        try {
            SecretKeySpec skey = new SecretKeySpec(key.getBytes(), algorithm);
            IvParameterSpec iv = new IvParameterSpec(key.getBytes(), 0, offset);
            Cipher cipher = Cipher.getInstance(transformation);
            cipher.init(Cipher.DECRYPT_MODE, skey, iv);// 初始化
            byte[] result = cipher.doFinal(new Base64().decode(content));
            return new String(result); // 解密
        } catch (Exception e) {
            //LogUtil.exception(e);
        }
        return null;
    }
    public static void main(String[] args) throws Exception {
        String s = "hello world";
        // 加密
        System.out.println("加密前:" + s);
        String encryptResultStr = encrypt(s);
        System.out.println("加密后:" + encryptResultStr);
        // 解密
        System.out.println("解密后:" + decrypt(encryptResultStr));
    }
}

继承BaseTypeHandler ,实现对数据的转换


import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class AESEncryptHandler extends BaseTypeHandler {
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {
        ps.setString(i, AES.encrypt((String)parameter));
    }
    @Override
    public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
        String columnValue = rs.getString(columnName);
        return AES.decrypt(columnValue);
    }
    @Override
    public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        String columnValue = rs.getString(columnIndex);
        return AES.decrypt(columnValue);
    }
    @Override
    public String getNullableResult(CallableStatement cs, int columnIndex)
            throws SQLException {
        String columnValue = cs.getString(columnIndex);
        return AES.decrypt(columnValue);
    }
}

有po类中,实现相关类型注解



@Data
@EqualsAndHashCode(callSuper = false)
@TableName(autoResultMap = true)
public class SysOrgUser extends BaseUpdateModel {
    
    private String loginName;
    
    @TableField(typeHandler = AESEncryptHandler.class)
    private String password;

至此,密码等敏感信息已处理好。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: MyBatis-Plus如何实现自动加密解密

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

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

猜你喜欢
  • MyBatis-Plus如何实现自动加密解密
    目录MyBatis-Plus 自动加密解密实现TypeHandler添加注解查询加密字段MyBatis-Plus 敏感数据的加密写加密解密的工具类继承BaseTypeHandler ...
    99+
    2024-04-02
  • 基于Mybatis-Plus拦截器实现MySQL数据加解密
    一、背景 用户的一些敏感数据,例如手机号、邮箱、身份证等信息,在数据库以明文存储时会存在数据泄露的风险,因此需要进行加密, 但存储数据再被取出时,需要进行解密,因此加密算法需要使用对称加密算法。 常用的对称加密算法有AES、DES、RC、B...
    99+
    2023-09-01
    数据加密 Mybatis-Plus拦截器 对称加密
  • mybatis-plus 拦截器敏感字段加解密的实现
    目录背景一、查询拦截器二、插入和更新拦截器三、注解背景 数据库在保存数据时,对于某些敏感数据需要脱敏或者加密处理,如果一个一个的去加显然工作量大而且容易出错,这个时候可以考虑使用拦截...
    99+
    2024-04-02
  • VBS如何实现加密解密
    这篇文章主要为大家展示了“VBS如何实现加密解密”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“VBS如何实现加密解密”这篇文章吧。用法: 1.copy下面代码至文本文档 2.将文件后缀名改为.v...
    99+
    2023-06-08
  • PHP如何实现加密解密
    这篇文章主要为大家展示了“PHP如何实现加密解密”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“PHP如何实现加密解密”这篇文章吧。加密解密function encrypt($data,...
    99+
    2023-06-03
  • MyBatis-Plus拦截器对敏感数据实现加密
    目录一、定义注解二、定义拦截器类做课程项目petstore时遇到需要加密属性的问题,而MyBatis-Plus为开发者提供了拦截器的相关接口,用于与数据库交互的过程中实现特定功能,本...
    99+
    2024-04-02
  • mybatis中数据加密与解密的实现
    目录1、需求2、解决方案3、使用拦截器方式3.1 定义加密接口3.2 定义加密注解3.3 拦截器加密数据3.4 拦截器解密数据3.5 解密工具类3.6 实体类样例4、使用类型转换器4...
    99+
    2024-04-02
  • JavaScript如何实现加密与解密
    这篇“JavaScript如何实现加密与解密”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“JavaScript如何实现加密与...
    99+
    2023-06-30
  • C#如何实现加密与解密
    这篇文章主要讲解了“C#如何实现加密与解密”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#如何实现加密与解密”吧!一、Hash加密,使用HashAlgorithm哈希算法类的派生类(MD5...
    99+
    2023-06-30
  • Tang+luks实现磁盘自动加解密
    文章目录 1、描述2、Tang服务器安装3、客户端3.1、依赖安装3.2、创建加密磁盘分区3.3、luks加密3.4、打开luks加密盘3.5、操作和配置luks加密盘 4、开机自动...
    99+
    2023-09-10
    运维 linux centos luks
  • Java操作MyBatis-Plus通过自定义拦截器对mysql字段以注解形式实现自动加解密
    一.需求背景 跟大学室友闲谈时,了解到他公司正在做项目内对数据库敏感字段实现自动加解密的需求,使用的技术是Springboot,Mybatis-Plus,MySql等技术栈,加密算法是用的AES,密钥是放在华为云,这里实现一个阉割版的dem...
    99+
    2023-09-06
    mybatis mysql java
  • mybatis如何实现特殊字段加密
    这篇文章主要为大家展示了“mybatis如何实现特殊字段加密”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“mybatis如何实现特殊字段加密”这篇文章吧。一、背景在我们数据库中有些时候会保存一些...
    99+
    2023-06-29
  • python如何实现凯撒密码加密解密
    这篇文章主要介绍了python如何实现凯撒密码加密解密的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇python如何实现凯撒密码加密解密文章都会有所收获,下面我们一起来看看吧。凯撒加密就是通过将字母移动一定的位...
    99+
    2023-07-02
  • 如何实现VBS加密与VBE解密
    这篇文章主要介绍了如何实现VBS加密与VBE解密,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。用Script Encoder加密VBS脚本Script Encoder 是一个...
    99+
    2023-06-08
  • PHP 程序如何实现加密解密?
    PHP 中有很多加密和解密的函数可用,以下是一些常用的加密解密方式和函数: 对称加密: 对称加密是一种加密方式,使用同一个密钥加密和解密数据。PHP 中可用的对称加密算法包括 AES、DES、3DES 等。以下是一些常用的对称加密函数:...
    99+
    2023-10-02
    加密 php Powered by 金山文档
  • VBS脚本如何实现加密/解密
    这篇文章主要为大家展示了“VBS脚本如何实现加密/解密”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“VBS脚本如何实现加密/解密”这篇文章吧。Dim WshSHell,FSO ...
    99+
    2023-06-08
  • Mybatis的TypeHandler加解密数据实现
    目录一、背景 二、解决方案 三、需求 四、实现思路 五、实现代码 六、参考文档 一、背景 在我们数据库中有些时候会保存一些用户的敏感信息,比如: 手机号、银行卡等信息,如果这些信息...
    99+
    2024-04-02
  • MyBatis-Plus如何实现字段自动填充功能
    这篇文章给大家分享的是有关MyBatis-Plus如何实现字段自动填充功能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、前言在项目中,我们有一些公共的字段需要做修改如:gmt_create:创建时间creat...
    99+
    2023-06-25
  • 如何理解C#DES加密解密的实现
    这篇文章将为大家详细讲解有关如何理解C#DES加密解密的实现,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。C# DES加密解密的实现,DES算法为密码体制中的对称密码体制,由IBM公司研制的...
    99+
    2023-06-17
  • 如何通过一个注解实现MyBatis字段加解密
    目录简介模块使用方法配置项说明开源链接总结简介 mybatis-crypto 是一个基于 mybatis 插件机制实现的字段加解密组件,通过一个注解即可对敏感数据进行加解密处理。 支...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作