千家信息网

mybatis如何实现特殊字段加密

发表于:2025-02-06 作者:千家信息网编辑
千家信息网最后更新 2025年02月06日,这篇文章主要为大家展示了"mybatis如何实现特殊字段加密",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"mybatis如何实现特殊字段加密"这篇文章吧。
千家信息网最后更新 2025年02月06日mybatis如何实现特殊字段加密

这篇文章主要为大家展示了"mybatis如何实现特殊字段加密",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"mybatis如何实现特殊字段加密"这篇文章吧。

一、背景

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

二、解决方案

由于我们系统中使用了Mybatis作为数据库持久层,因此决定使用Mybatis的TypeHandler或Plugin来解决。

TypeHandler : 需要我们在某些列上手动指定 typeHandler 来选择使用那个typeHandler或者根据@MappedJdbcTypes@MappedTypes注解来自行推断。

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;/** * 加解密TypeHandler * * @author huan.fu 2021/5/18 - 上午9:20 */@MappedJdbcTypes(JdbcType.VARCHAR)@MappedTypes(Encrypt.class)public class EncryptTypeHandler extends BaseTypeHandler {    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语句中写法

                                             insert into customer(phone,address) values (#{phone},#{address})        

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)在数据库中已经加密了,在查询的时候,加密的数据已经自动解密了。

以上是"mybatis如何实现特殊字段加密"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

数据 加密 客户 手机 手机号 数据库 信息 特殊 字段 处理 内容 参数 方法 篇文章 查询 代码 写法 后台 处理器 实体 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 共享单车用的什么服务器 四川企业软件开发定做 网络安全与执法与计算机谁难 罗庄软件开发培训班 服务器主板维修 浙江明训网络技术有限公司 下列不属于网络安全策略的组成是 操作系统支撑软件开发是做什么 网络安全的杀手锏 局域网服务器有带宽限制吗 企业级软件开发行业背景 《网络安全法》的制定目的 苏州网络安全准入控制系统价格 换服务器seo 珠投惠东大数据库中心项目 苏州医疗健康软件开发 计算机网络安全实验四 打印机找不到服务器 计算机网络技术2级证难考嘛 几千个用户同时操作数据库 听香水榭服务器爆满 剑灵电信哪个服务器人多 生命安全健康网络安全 学c下的软件开发 广东net软件开发机构 什么网易服务器最好 长城宽带断网服务器无响应 数据库索引什么情况不走索引 爱沙尼亚5g网络安全协议 网络安全综合实验室
0