精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

SpringBoot + MyBatis 攔截器輕松實現數據加減密

開發 開發工具
通過本篇文章,我們探討了如何使用 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極客技術
相關推薦

2024-12-27 08:39:10

2025-08-01 07:07:18

2025-07-15 02:00:00

2025-05-09 08:20:50

2020-03-25 17:55:30

SpringBoot攔截器Java

2009-07-08 17:02:11

JDK實現調用攔截器

2011-11-21 14:21:26

SpringMVCJava框架

2024-02-28 09:35:52

2009-06-24 16:00:00

2025-07-30 01:00:25

2023-09-15 11:26:16

2009-09-27 17:37:32

Hibernate攔截

2025-02-28 08:14:53

2021-07-19 05:48:30

springboot 攔截器項目

2009-06-25 15:59:21

Struts2教程攔截器

2023-03-10 19:36:47

2025-08-18 01:45:00

2023-09-05 08:58:07

2019-12-19 08:56:21

MybatisSQL執行器

2011-05-16 10:14:11

Hibernate
點贊
收藏

51CTO技術棧公眾號

美女性感视频久久| 神马久久影院| 一区二区三区久久久| 国产精品9999久久久久仙踪林| 欧美日韩精品亚洲精品| 欧美三级电影在线| 欧美亚洲图片小说| 久久久久福利视频| 黄色视屏网站在线免费观看| 日本成人在线视频网站| 超碰精品一区二区三区乱码| 99久久免费看精品国产一区| 久久xxx视频| 一区二区视频在线看| 久久婷婷开心| 国产又黄又大又爽| 中文精品在线| 久久精品成人欧美大片| v8888av| av国产精品| 狠狠爱在线视频一区| 免费成人深夜夜行网站视频| 亚洲日本中文字幕在线| 激情综合网激情| 欧美做受高潮电影o| 天堂网avav| 日韩精品久久| 日韩av在线导航| 免费国偷自产拍精品视频| 88xx成人免费观看视频库| 亚洲第一主播视频| 成人在线免费观看网址| 国产免费av高清在线| 成人午夜激情视频| 亚洲xxxxx| 伊人网视频在线| 亚洲一区二区三区高清不卡| 欧美精品少妇videofree| 怡红院一区二区三区| 久久夜色电影| 欧美电影免费观看完整版| 九九热精品国产| 99久久er| 欧美视频你懂的| 国产免费人做人爱午夜视频| 欧美大胆a人体大胆做受| 一二三区精品福利视频| 男女激烈动态图| 国产激情在线视频| 国产精品高清亚洲| 亚洲欧美日本国产有色| av在线电影播放| 久久精品人人做人人综合| 欧美极品视频一区二区三区| 午夜小视频在线播放| 成人av网站在线观看| 国产精品一区二区在线观看| 亚洲av无码乱码国产精品久久| 国产一区二区三区免费| 成人黄色av网站| 国产人妻精品一区二区三区| 国产一区二区福利| 99re在线视频观看| 99精品在线视频观看| 国产精品18久久久久久久网站| 亚洲精品免费av| 亚洲AV午夜精品| www.视频一区| 久久一区二区精品| 91这里只有精品| 综合欧美亚洲日本| 欧美日韩视频免费| 久热在线观看视频| 欧美影片第一页| 一区二区免费av| 91成人短视频| 日韩精品视频免费在线观看| 夜夜春很很躁夜夜躁| 99成人在线视频| 久久久精品久久久| 国产在线综合网| 亚洲一区欧美激情| 国产精品美女久久久免费 | 99re6这里只有精品| www高清在线视频日韩欧美| 免费在线观看a级片| 国产伊人精品| 国产91色在线| 夜夜躁很很躁日日躁麻豆| 国产美女精品一区二区三区| 国产精品久久久久久久久久久久冷 | 最新日韩av| 国产精品大陆在线观看| 999久久久久久| 99国产精品久久久久久久久久久 | 精品欧美国产一区二区三区| 国产精品久久久久9999小说| 高清不卡一区| 亚洲精品一区二区三区婷婷月| 国产精品18在线| 激情亚洲成人| 国产欧美精品一区二区| 图片区 小说区 区 亚洲五月| 国产午夜亚洲精品羞羞网站| 日韩国产小视频| 成人自拍视频网| 亚洲激情在线观看| 国产日韩欧美在线观看视频| 亚洲一区二区毛片| 99r国产精品视频| 成人午夜电影在线观看| 性感美女久久精品| 欧美午夜精品理论片| 台湾色综合娱乐中文网| 免费av在线一区| 日韩av免费播放| 成人av资源网站| 小说区视频区图片区| 美女福利一区二区| 亚洲高清久久网| 日本a级片视频| 老汉av免费一区二区三区| 精品亚洲第一| 欧美寡妇性猛交xxx免费| 欧美日韩国产色站一区二区三区| 久久无码人妻精品一区二区三区 | 国内精品模特av私拍在线观看| 99re热视频| www.视频一区| 人妻少妇精品无码专区二区| 国产剧情一区二区在线观看| 在线观看国产成人av片| 少妇太紧太爽又黄又硬又爽| 国产成人免费xxxxxxxx| 精品国产无码在线| 久久av影院| 中文字幕久久久av一区| 在线观看免费av片| 91在线精品一区二区三区| 欧美亚洲色图视频| 日韩精品三级| 久久亚洲精品网站| 91 中文字幕| 国产精品久久午夜| 中文字幕国产免费| 欧美独立站高清久久| 国产欧美日韩免费| 91高清在线| 欧美日韩国产片| 亚洲女同二女同志奶水| 久久精品99国产精品日本| 午夜精品一区二区在线观看| 日韩美女在线看免费观看| 亚洲欧美在线看| 黄瓜视频在线免费观看| 久久午夜羞羞影院免费观看| 毛片一区二区三区四区| 神马久久av| 国产精品aaa| 日本最新在线视频| 国产在线视频一区二区| 亚洲成人av动漫| 在线不卡一区| 久久夜色撩人精品| 性欧美videos另类hd| 亚洲国产日日夜夜| 真人bbbbbbbbb毛片| 性欧美videos另类喷潮| 日韩欧美亚洲精品| 久久亚洲国产精品尤物| 久久天天躁日日躁| 国 产 黄 色 大 片| 五月激情六月综合| 亚洲熟妇一区二区三区| 免费欧美在线视频| 400部精品国偷自产在线观看| 在这里有精品| 欧美孕妇毛茸茸xxxx| yourporn在线观看视频| 欧美军同video69gay| 久久婷婷一区二区| 91免费视频网| 青青草久久伊人| 亚洲视频狠狠| 日韩影院一区| 国产一区 二区| 97视频色精品| 日本美女高清在线观看免费| 精品少妇一区二区三区视频免付费 | 欧美日韩免费在线观看| 欧美aaa级片| 不卡一区二区在线| 男女污污的视频| 中国成人一区| 欧美一区二视频在线免费观看| 日韩一级特黄| 欧美一级淫片播放口| 好吊日视频在线观看| 亚洲国产精品小视频| 91亚洲国产成人久久精品麻豆| 亚洲图片欧美色图| 长河落日免费高清观看| www.日韩精品| 亚洲天堂一区二区在线观看| 国产精品色网| 大陆极品少妇内射aaaaaa| 色棕色天天综合网| 97超碰人人看人人| 久久爱.com| 欧美亚洲日本网站| 男女在线观看视频| 正在播放欧美一区| 偷拍自拍在线| 日韩码欧中文字| 成年人的黄色片| 国产精品夜夜嗨| 久久撸在线视频| 亚洲自啪免费| 男人c女人视频| 欧美丰满老妇| 性刺激综合网| 免费精品国产的网站免费观看| 97神马电影| 外国成人毛片| 国产精品高清免费在线观看| h片在线观看下载| 久久天堂电影网| 欧美精品hd| 中文字幕精品www乱入免费视频| 色综合888| 亚洲国内精品视频| 亚洲免费视频网| 欧美大片在线观看| 国产99久一区二区三区a片 | 97在线视频精品| 色网在线观看| 欧美成人激情在线| 高清全集视频免费在线| 久久精品久久久久久| 日本www在线观看视频| 在线免费观看羞羞视频一区二区| 免费黄色在线视频网站| 日韩av网站导航| 手机看片国产1024| 亚洲成人999| 后进极品白嫩翘臀在线视频| 欧美一区二区三区精品| 国产又粗又大又爽视频| 69堂成人精品免费视频| 一二三区在线播放| 91精品欧美综合在线观看最新| 一区精品在线观看| 51精品视频一区二区三区| 91在线你懂的| 91精品在线一区二区| www.午夜激情| 在线观看区一区二| 欧美日韩在线视频播放| 欧美日韩午夜在线| 国产精品久久久久久免费免熟| 欧美剧在线免费观看网站 | 日韩一区二区三区观看| 国产精品热久久| 欧美一区二区私人影院日本| www日本高清| 亚洲国产精品中文| 国产日韩精品在线看| 日韩网站免费观看高清| 性xxxfreexxxx性欧美| 国内精久久久久久久久久人| 樱花草涩涩www在线播放| 国产精品27p| 欧美高清xxx| 91久色国产| 日韩mv欧美mv国产网站| 色噜噜色狠狠狠狠狠综合色一| 天天精品视频| 青青青免费在线| 日韩高清欧美激情| 欧美性受xxxx黒人xyx性爽| 波多野洁衣一区| 日本二区在线观看| 亚洲三级视频在线观看| 日韩av在线播| 欧美色窝79yyyycom| 亚洲国产欧美另类| 亚洲性视频网站| 午夜小视频在线观看| 欧美一级电影免费在线观看| 欧美成人免费全部网站| 国产精品大全| 日韩欧美精品| 日韩xxxx视频| 美国一区二区三区在线播放| 精品国产免费久久久久久婷婷| 国产午夜精品一区二区| 男女免费视频网站| 在线一区二区视频| 成人高潮片免费视频| 一区二区成人av| 欧美人与性动交α欧美精品济南到| 日韩av成人在线观看| 久久久久久亚洲精品美女| 鲁鲁视频www一区二区| 中国成人一区| 中文字幕欧美人妻精品一区| 国产成人自拍在线| 中文字幕第69页| 欧美日韩日本国产| 亚洲国产精品suv| 日韩有码在线电影| www.com.cn成人| 国产伦精品一区二区三区四区免费| 四虎成人av| 日日摸天天爽天天爽视频| 粉嫩aⅴ一区二区三区四区| 五月激情四射婷婷| 岛国av在线不卡| 精品久久国产视频| xxxxx成人.com| 亚洲伦乱视频| 蜜桃av噜噜一区二区三| 亚洲国产一区二区三区a毛片| 亚洲男人天堂av在线| 国产亚洲欧美日韩俺去了| 五月天婷婷网站| 日韩一区二区精品在线观看| 丝袜美腿美女被狂躁在线观看| 国产91|九色| 欧美精品中文| 免费观看美女裸体网站| 国产盗摄女厕一区二区三区| 91视频综合网| 欧美精品第一页| 成黄免费在线| 国产精品久久久久久久9999| 亚洲涩涩av| 虎白女粉嫩尤物福利视频| av一区二区三区四区| 久久无码精品丰满人妻| 欧美v国产在线一区二区三区| av免费在线观看网站| 91在线免费看网站| 91精品综合久久久久久久久久久 | 国产又大又长又粗又黄| 久久精品国产网站| 日本少妇aaa| 91精品国产综合久久香蕉的特点| 91涩漫在线观看| 国产欧美日韩中文字幕| 91精品国产自产在线观看永久∴| 手机免费看av网站| 亚洲精品videosex极品| 精品乱子伦一区二区| 欧美另类老女人| japanese色系久久精品| 国产高清av在线播放| 99精品国产99久久久久久白柏| aaa人片在线| 国产亚洲欧美aaaa| 亚洲狼人在线| 大陆极品少妇内射aaaaaa| 成人va在线观看| 亚洲另类在线观看| 中文字幕av一区中文字幕天堂| 国产成人精品一区二区三区在线 | 99国产精品自拍| 玖玖爱在线观看| 欧美日韩在线三区| a在线免费观看| 国产在线精品日韩| 久久激情一区| 日韩久久一级片| 久久综合久久综合亚洲| 真实的国产乱xxxx在线91| 日韩一区二区久久久| 日韩中文字幕无砖| 黄色一级视频片| 国产精品嫩草影院com| www.久久色| 欧美专区国产专区| 93在线视频精品免费观看| 又大又长粗又爽又黄少妇视频| 天天操天天色综合| 91精品大全| 国产欧美一区二区三区另类精品 | 99精品一区| 理论片大全免费理伦片| 在线一区二区视频| 污网站在线免费看| 欧美激情论坛| 国产成人亚洲综合a∨婷婷| 欧美黑人一区二区| 欧美成人国产va精品日本一级| 亚洲人成亚洲精品| 日韩精品xxx| 欧美视频在线一区二区三区 | 91久久国产最好的精华液| 中文字幕资源网在线观看| 欧美精品一区二区三区久久|