章鱼吃什么| 方形脸适合什么发型| 洗劫一空是什么意思| 突然视力模糊是什么原因引起的| 2005属什么生肖| 鳞状上皮细胞是什么| 生长激素是什么| 731是什么意思| 丈二和尚摸不着头脑是什么意思| 鳄鱼吃什么| 精索静脉曲张吃什么药| 东北有什么好玩的景点| 梦见别人给自己剪头发是什么意思| 正月初四是什么星座| 舌下含服是什么意思| 宝宝病毒感染吃什么药效果好| 乳腺增生吃什么食物好| 真狗是什么意思| 晚上吃什么不发胖| 7月一日是什么节日| 9月25日什么星座| 什么又什么又什么| 羟丁酸脱氢酶高是什么原因| 身骑白马是什么方言| 精子像果冻是什么原因| 殚精竭虑什么意思| 超市属于什么行业| 籺是什么意思| 用什么可以解开所有的谜| 人参和什么泡酒最好| 什么是周边| 皮肤起小水泡很痒是什么原因| 皮肤软组织感染用什么消炎药| 有鸟飞进屋是什么预兆| 珍珠母是什么东西| 04年的猴是什么命| 60岁属什么| 梦见吃杨梅是什么意思| 现在是什么星座| 为什么男人喜欢邓文迪| 皮肤过敏有什么妙招| 肝火旺盛失眠吃什么药| 罕见是什么意思| 喝完酒胃疼吃什么药| 高铁上不能带什么东西| 虔婆是什么意思| 紫色搭配什么颜色| 什么萌| 碎片是什么意思| 山西人喜欢吃什么| 什么是功德| tea是什么意思| 结肠炎有什么症状| 潮宏基是什么档次的| 家长里短是什么意思| 吃蝎子有什么好处| 经常便秘吃什么药好| 前列腺炎是什么原因引起的| 灏是什么意思| 穿什么衣服显白| 拉水便是什么原因| 直肠炎吃什么药效果好| 头发需要什么营养| 眼睛痒吃什么药| 天性是什么意思| 熊吃什么食物| 补钙多了有什么坏处| 水痘不能吃什么食物| 白带有血是什么原因| 舌系带短挂什么科| 笃怎么读什么意思| 什么是烂桃花| 绿色的鸟是什么鸟| 玳瑁是什么| 晋字五行属什么| 骨密度z值是什么意思| 疣吃什么药能治好| 大什么小什么| 战五渣是什么意思| 胃难受吃什么食物好| 收官什么意思| 龙眼是什么季节的水果| 大惊小怪是什么生肖| 古代女子成年行什么礼| 夫妇是什么意思| 真菌是什么原因引起的| 手指尖疼是什么原因| 男生吃菠萝有什么好处| 外寒内热感冒吃什么药| 男人吃什么更持久| 三道鳞是什么鱼| 晚上起夜尿多吃什么药| 景色什么| 拉肚子能吃什么| 吃葛根粉有什么好处| 佛度有缘人是什么意思| 脾虚要吃什么东西调理| 安宫牛黄丸什么时候吃最好| 小便尿色黄是什么问题| 多管闲事是什么意思| 倒车雷达什么牌子好| 蜜蜂蛰了用什么药| 双肾钙化灶是什么意思| 白色情人节什么意思| 牛肉可以炒什么菜| 白蛋白偏高是什么意思| 高血压会引起什么并发症| 便秘了吃什么容易排便| 刺猬为什么叫白仙| 三伏天喝什么汤| 什么是封闭针| 鸡飞狗跳的意思是什么| 乳腺结节不能吃什么食物| 五个月宝宝可以吃什么水果| 恩施玉露属于什么茶| 什么季节掉头发最厉害| 粉色药片是什么药| 牙周炎是什么| 阴沟肠杆菌是什么病| 打喷嚏很臭是什么原因| 马和驴为什么能杂交| 人授和试管有什么区别| 财星是什么意思| 六零年属什么生肖| 静谧是什么意思| 前列腺钙化是什么病| 男生圆脸适合什么发型| 花甲和什么不能一起吃| 油嘴滑舌是什么意思| 早餐吃什么不会胖| 同位分是什么意思| nb什么牌子| 雨渐耳符咒有什么用| 周杰伦有什么病| 肝病有什么反应| 痔疮有什么症状| 金铃子是什么昆虫| 壶嘴为什么不能对着人| 什么是三重一大事项| 月经来有血块是什么原因| 脚冰凉是什么原因| 扁桃体发炎能吃什么水果| aids是什么病的简称| 脚底板发热是什么原因| 大黄和芒硝混合外敷有什么作用| 维生素d低是什么原因| 藏红花泡水喝有什么功效| 水逆退散什么意思| 肺与什么相表里| 女左上眼皮跳是什么预兆| 明亮的什么| 抽筋什么原因| 鲫鱼是什么鱼| 嘴苦是什么原因造成的| 淋病是什么| 梦见手机摔碎了是什么意思| 肌钙蛋白高说明什么| 火字旁的有什么字| 核磁共振是查什么的| 血离子是检查什么的| faleda是什么牌子的手表| 若叶青汁有什么功效| 前年是什么年| 鸡的贵人是什么生肖| 梦见自己死了又活了是什么意思| 办准生证需要什么资料| 高光是什么意思| 六字真言是什么| 叶公好龙的寓意是什么| 肠道菌群失调吃什么药| 肠道紊乱的症状是什么| 降逆是什么意思| 慢性胃炎吃什么食物好| 缺黄体酮会有什么症状| 藏青色t恤配什么颜色裤子| 金银花为什么叫忍冬| yy飞机票是什么| 炒菜用什么锅最好| 胃难受吃什么药| 艺不压身是什么意思| 碱中毒是什么引起的| 贲门不舒服有什么症状| 乳腺结节看什么科| 黄芪泡水有什么好处| 女性腋臭什么年龄消失| 减肥喝什么| 请人帮忙用什么词| 9是什么意思| 长期大便不成形是什么原因造成的| 肝肾不足是什么意思| 臭氧是什么东西| 什么叫蛋白质| 或字多两撇是什么字| 15一16岁青少年腰疼是什么病| 什么不周| bp是什么意思| 孕妇生气对胎儿有什么影响| 六月份种什么菜| 文书是什么| 为什么不能在一起| 肉炒什么菜谱大全| 淋巴细胞绝对值偏高是什么意思| 什么什么生机| 世界第八大奇迹是什么| 四维彩超是检查什么| 体内湿气太重吃什么药能快速除湿| 胃火旺吃什么| 欲加之罪何患无辞是什么意思| 女生的隐私部位长什么样| 杏和什么不能一起吃| 什么叫血糖| 种草是什么意思| 乙肝肝炎表面抗体阳性是什么意思| 鼠标dpi是什么| 血儿茶酚胺是查什么的| 小孩流鼻血是什么原因| 胡萝卜和什么榨汁好喝| 有痰咳嗽吃什么药| 炖猪排骨放什么调料| 999足金是什么意思| 为什么尿液一直是黄的| 临字五行属什么| 牙痛吃什么药最快见效| 什么的朋友| 宰相和丞相有什么区别| 直言不讳是什么意思| 眼睛怕光是什么原因| winbond是什么品牌| 新陈代谢是指什么| 舌头发麻是什么病兆| 红颜知己的意思是什么| 膝关节弹响是什么原因| 天之骄子是什么意思| 血糖高去医院挂什么科| 孕妇贫血吃什么补血最好| 思想包袱是什么意思| 禾字五行属什么的| 做梦下大雨是什么兆头| 精神出轨什么意思| 孔雀喜欢吃什么食物| pb是什么单位| 为什么一吃饭就胃疼| 古来稀是什么意思| 左旋是什么| 超声波是什么原理| 老天爷叫什么名字| 最毒妇人心是什么意思| 脊柱侧弯有什么症状| 9点到11点是什么经络| 头顶疼是什么原因引起的| 男士补肾吃什么| 喝什么茶清肺效果最好| 出汗有异味是什么原因| 回头是岸是什么生肖| 儒家思想的核心是什么| 孕妇贫血吃什么药| 静脉曲张吃什么食物| 囡囡是什么意思| 包皮开裂用什么药| 苦胆是什么| 晚上8点到9点是什么时辰| 血压高什么原因| 尿尿泡沫多是什么原因| 榴莲为什么会苦| 百度

全国"扫黄打非"办公布五起假冒记者诈骗或敲诈勒索案

开发 开发工具
通过本篇文章,我们探讨了如何使用 MyBatis 拦截器实现数据加密与解密功能。通过自定义 MyBatis 插件,我们能够在数据查询和插入过程中,自动对敏感信息进行加密或解密处理,从而提高系统的安全性。

1. 引言

百度 德意志高于一切的开头段落在转成了小调后,变成了一种散播邪恶的病态污痕。

小编上一篇文章分享了利用mybatis拦截器实现数据脱敏,这次小编在数据脱敏的基础上进行数据加减密。思路就是保存的时候对数据进行加密,查询的时候对数据进行解密,如果要脱敏就进行脱敏。

2. MyBatis 拦截器的实现数据加减密并脱敏

2.1 自定义加减密注解

首先需要知晓具体是哪个类中的哪些属性需要进行加减密处理,因此,需要自定义注解来实现对需要加减密的属性进行标注。

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.FIELD })
public @interface EncryptField {

}

2.2 加减密策略

有了标注后,对于加减密也会涉及到加减密策略的问题。不同的属性,对应加密或者解密,例如,新增的时候是加密,查询的时候是解密,这里使用枚举类类枚出不同属性对应的正则处理。

import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public enum DecryptEncryptEnum {
    DECRYPT(s -> DecryptEncryptUtils.sm4Decrypt(s)),
    ENCRYPT(s -> DecryptEncryptUtils.sm4Encrypt(s)),
    ;

    private final Desensitizer desensitizer;
}

2.3 加解密执行者

对于加解密处理还需要一个执行者,将属性值和正则表达式进行匹配和替换,进而完成加解密处理。这里我们利用了JDK8提供的一个非常好用的接口Fuction,它提供了apply方法,这个方法作用是为了实现函数映射,也就是将一个值转换为另一个值。如果不了解的同学可以百度下 Fuction 接口。

import java.util.function.Function;

public interface Desensitizer extends Function<String, String> {
}

2.4 加减密工具类

对于加解密,我们还需要一个工具类来处理,小编使用的是SM4来进行加减密。

import cn.hutool.core.util.CharsetUtil;
import cn.hutool.crypto.SmUtil;
import cn.hutool.crypto.symmetric.SymmetricCrypto;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class DecryptEncryptUtils {
 // 这里设置自己的加减密key
    private static final String key = "";

    /**
     * 加密
     * @param text
     * @param key
     * @return
     */
    private static String sm4Encrypt(String text, String key) {
        SymmetricCrypto sm4 = SmUtil.sm4(key.getBytes());
        return sm4.encryptBase64(text);
    }

    /**
     * 解密
     * @param hexString
     * @param key
     * @return
     */
    private static String sm4Decrypt(String hexString, String key) {
        try {
            SymmetricCrypto sm4 = SmUtil.sm4(key.getBytes());
            return sm4.decryptStr(hexString, CharsetUtil.CHARSET_UTF_8);
        } catch(Exception e) {
            // 解密失败,直接返回明文,不影响业务进程
            return hexString;
        }
    }

    public static String sm4Encrypt(String text) {
        return sm4Encrypt(text, key);
    }
    
    public static String sm4Decrypt(String hexString) {
        return sm4Decrypt(hexString, key);
    }

2.5 自定义数据加密拦截器

因为要对参数集进行加密处理,所以要拦截的对象是ParameterHandler,拦截的方法是setParameters。

public interface ParameterHandler {
    Object getParameterObject();

    void setParameters(PreparedStatement var1) throws SQLException;
}

来看下具体的实现:

import org.apache.ibatis.executor.parameter.ParameterHandler;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Signature;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.reflection.SystemMetaObject;
import org.springframework.stereotype.Component;

import java.lang.reflect.Field;
import java.sql.PreparedStatement;
import java.util.stream.Stream;

@Component
@Intercepts(@Signature(type = ParameterHandler.class, method = "setParameters", args = PreparedStatement.class))
public class DecryptPlugin implements Interceptor {

    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        // 获取参数处理器实例
        ParameterHandler parameterHandler = (ParameterHandler) invocation.getTarget();
        // 获取参数对象
        Object parameters = parameterHandler.getParameterObject();
        // 加密
        desensitization(parameters);
        // 执行原始方法
        invocation.proceed();
        return null;
    }

    /**
     * 判断哪些需要加密
     * @param source 加密之前的源对象
     */
    private void desensitization(Object source) {
        // 反射获取类型中的所有属性,判断哪个需要进行脱敏
        Class<?> sourceClass = source.getClass();
        MetaObject metaObject = SystemMetaObject.forObject(source);
        // 对有加减密注解的字段进行加密
        Stream.of(sourceClass.getDeclaredFields())
                .filter(field -> field.isAnnotationPresent(EncryptField.class))
                .forEach(field -> doEncrypt(metaObject, field));
    }

    /**
     * 加密
     * @param metaObject
     * @param field
     */
    private void doEncrypt(MetaObject metaObject, Field field) {
        String name = field.getName();
        Object value = metaObject.getValue(name);
        if (value != null && metaObject.getGetterType(name) == String.class) {
            DecryptEncryptEnum encrypt = DecryptEncryptEnum.ENCRYPT;
            String apply = encrypt.getDesensitizer().apply((String) value);
            metaObject.setValue(name, apply);
        }
    }
}

数据加减密字段:

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.example.cl.mybatisPlugin.Desensitization;
import com.example.cl.mybatisPlugin.EncryptField;
import com.example.cl.mybatisPlugin.StrategyEnum;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class User {
    @TableId(type = IdType.AUTO)
    private Long id;
    @Desensitization(strategy = StrategyEnum.NAME)
    @EncryptField
    private String name;
    private Integer age;
}

看下加密效果:

图片

2.6 自定义数据解密拦截器(先解密,再脱敏)

import org.apache.ibatis.executor.resultset.ResultSetHandler;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Signature;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.reflection.SystemMetaObject;
import org.springframework.stereotype.Component;

import java.lang.reflect.Field;
import java.sql.Statement;
import java.util.List;
import java.util.stream.Stream;

@Component
@Intercepts(@Signature(type = ResultSetHandler.class, method = "handleResultSets", args = Statement.class))
public class DesensitizationPlugin implements Interceptor {

    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        // 获取结果集
        List<Object> records = (List<Object>) invocation.proceed();
        // 处理结果集
        records.forEach(this::desensitization);
        return records;
    }

    /**
     * 2 * 判断哪些需要脱敏处理
     * 3 * @param source 脱敏之前的源对象
     * 4
     */
    private void desensitization(Object source) {
        // 反射获取类型中的所有属性,判断哪个需要进行脱敏
        Class<?> sourceClass = source.getClass();
        MetaObject metaObject = SystemMetaObject.forObject(source);
        // 有加密先解密
        Stream.of(sourceClass.getDeclaredFields())
                .filter(field -> field.isAnnotationPresent(EncryptField.class))
                .forEach(field -> doDecrypt(metaObject, field));
        // 再看是否需要脱敏
        Stream.of(sourceClass.getDeclaredFields())
                .filter(field -> field.isAnnotationPresent(Desensitization.class))
                .forEach(field -> doDesensitization(metaObject, field));
    }

    /**
     * 解密
     * @param metaObject
     * @param field
     */
    private void doDecrypt(MetaObject metaObject, Field field) {
        String name = field.getName();
        Object value = metaObject.getValue(name);
        if (value != null && metaObject.getGetterType(name) == String.class) {
            DecryptEncryptEnum decrypt = DecryptEncryptEnum.DECRYPT;
            String apply = decrypt.getDesensitizer().apply((String) value);
            metaObject.setValue(name, apply);
        }
    }

    /**
     * 真正的脱敏处理
     * @param metaObject
     *
     */
    private void doDesensitization(MetaObject metaObject, Field field) {
        String name = field.getName();
        Object value = metaObject.getValue(name);
        if (value != null && metaObject.getGetterType(name) == String.class) {
            Desensitization annotation = field.getAnnotation(Desensitization.class);
            StrategyEnum strategy = annotation.strategy();
            String apply = strategy.getDesensitizer().apply((String) value);
            metaObject.setValue(name, apply);
        }
    }
}

最后看下效果:

图片

3. 总结

通过本篇文章,我们探讨了如何使用 MyBatis 拦截器实现数据加密与解密功能。通过自定义 MyBatis 插件,我们能够在数据查询和插入过程中,自动对敏感信息进行加密或解密处理,从而提高系统的安全性。利用拦截器的灵活性,我们不仅能够轻松集成加密逻辑,还能确保代码的简洁性和可维护性。这个方法为开发者提供了一个高效、优雅的解决方案,确保敏感数据在存储与传输中的安全。

责任编辑:武晓燕 来源: Java极客技术
相关推荐

2025-08-05 08:39:10

2025-08-05 08:20:50

2025-08-05 02:00:00

2025-08-05 17:55:30

SpringBoot拦截器Java

2025-08-05 14:21:26

SpringMVCJava框架

2025-08-05 17:02:11

JDK实现调用拦截器

2025-08-05 09:35:52

2025-08-05 16:00:00

2025-08-05 01:00:25

2025-08-05 11:26:16

2025-08-05 17:37:32

Hibernate拦截

2025-08-05 08:14:53

2025-08-05 05:48:30

springboot 拦截器项目

2025-08-05 15:59:21

Struts2教程拦截器

2025-08-05 19:36:47

2025-08-05 08:56:21

MybatisSQL执行器

2025-08-05 08:58:07

2025-08-05 10:14:11

Hibernate

2025-08-05 14:45:06

2025-08-05 08:01:25

Struts2拦截器原理
点赞
收藏

51CTO技术栈公众号

ce是什么意思 已知晓是什么意思 梦见捡到钱是什么征兆 农历五月二十八是什么日子 干扰素是什么药
沉脉是什么意思 为什么一吃饭就胃疼 睡着后抽搐抖动是什么 天麻什么时候种植 鲍鱼是什么意思
为什么会得白癜风 美女是什么意思 尿床去医院挂什么科 吃六味地黄丸有什么好处 念珠菌性阴道炎有什么症状
什么的东风填词语 rma是什么意思 长沙有什么特产 舌头边上有锯齿状是什么原因 流鼻涕吃什么药
什么动物的牙齿最多hcv9jop2ns1r.cn 咖啡色五行属什么520myf.com 子宫肌层回声欠均匀是什么意思hcv8jop8ns2r.cn 黑曜石属于五行属什么hcv9jop6ns4r.cn 黎明是什么时候hcv8jop2ns3r.cn
什么布料最凉快hcv8jop8ns3r.cn rh阴性血是什么血型hcv9jop6ns2r.cn 血糖降不下来是什么原因导致hcv8jop7ns3r.cn 突然呕吐是什么原因hcv9jop4ns5r.cn 什么病不能吃牛肉hcv8jop4ns0r.cn
咋啦是什么意思dayuxmw.com 老实人为什么总被欺负helloaicloud.com 贞操是什么意思jiuxinfghf.com 5月23是什么星座hcv8jop6ns3r.cn 兵字五行属什么hcv9jop3ns8r.cn
讨厌是什么意思hcv8jop9ns6r.cn 肾结石吃什么水果最好hcv7jop5ns2r.cn 黄疸肝炎有什么症状hcv7jop9ns8r.cn 手串14颗代表什么意思hcv9jop1ns5r.cn 癔症是什么hcv8jop1ns0r.cn
百度