国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

mybatis-plus 數據字段進行加解密入庫,且加密字段支持模糊搜索

這篇具有很好參考價值的文章主要介紹了mybatis-plus 數據字段進行加解密入庫,且加密字段支持模糊搜索。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前提介紹 (開發(fā)環(huán)境+需求)

1. 開發(fā)框架、環(huán)境

springboot+mybatis-plus+mysql5.7(oracle應該也是可以的,沒有測試,但實現思路是都可以滿足,懶得測oracle了,哈哈)

2. 需求介紹(背景)

需求很簡單: 就是將數據存儲到數據庫,并且將敏感數據字段進行加密處理保存(比如:身份證,手機號,銀行卡 等等)

需求也很變態(tài):加密的數據要模糊搜素??!

如果需求不需要模糊搜素,直接加密入庫就完事了,直接看這篇文章 mybatis-plus進行數據字段加密解密入庫 ,就可以了!

3.設計思路

個人 采用 映射表 分詞的 方案進行處理的

mysql 創(chuàng)建 加密 模糊搜索字段 ,將字段加密進行分詞處理,保存到 搜索映射表

分詞這邊采用 es 使用的ik分詞器,原因就是:自己寫一個分詞是不可能的了,算法沒那么牛逼 ??! ,并且ik 分詞器可以自定義詞語進行分詞

然后再使用 用 mybaitis-plus 自帶的注解 @TableField(typeHandler = TypeHandler.class)

mybatis-plus 數據字段進行加解密入庫,且加密字段支持模糊搜索,mybatis,mybatisplus

寫一個 handle 類繼承 BaseTypeHandler ,將數據進行加解密

大致思路是這樣 !

4. 具體實現

4.1 . 依賴
<!--        ik分詞器-->
        <dependency>
            <groupId>com.janeluo</groupId>
            <artifactId>ikanalyzer</artifactId>
            <version>2012_u6</version>
            <exclusions>
                <exclusion>
                    <groupId>org.apache.lucene</groupId>
                    <artifactId>lucene-core</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.apache.lucene</groupId>
                    <artifactId>lucene-queryparser</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.apache.lucene</groupId>
                    <artifactId>lucene-analyzers-common</artifactId>
                </exclusion>
            </exclusions>

        </dependency>
        
         <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.12</version>
        </dependency>
        
        <!--        AES加密解密需要包-->
        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
            <version>1.15</version>
        </dependency>
4.2 繼承Mybatis的 BaseTypeHandler類,重寫方法
package com.xiarp.encryptstorage.handler;


import com.xiarp.encryptstorage.util.AesUtil;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;

import java.sql.*;

/**
 * @author xiarp
 */
public class TypeHandler extends BaseTypeHandler<String> {


    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
        ps.setString(i, AesUtil.encrypt(parameter));
    }

    @Override
    public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
        return AesUtil.decrypt(rs.getString(columnName));
    }

    @Override
    public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        return AesUtil.decrypt(rs.getString(columnIndex));
    }

    @Override
    public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        return AesUtil.decrypt(cs.getString(columnIndex));
    }
}



4.3 AES 加密的工具類
package com.xiarp.encryptstorage.util;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Base64;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;


/**
 *  aes 加密的工具類
 *  1.存儲 加密的秘鑰key
 *  2.實現 aes 加密
 *  3.實現aes解密的功能
 * @author xiarp
 */
@Slf4j
public class AesUtil {
    /**
     * 定義 aes 加密的key
     * 密鑰  必須是16位, 自定義,
     * 如果不是16位, 則會出現InvalidKeyException: Illegal key size
     * 解決方案有兩種:
     * 需要安裝Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files(可以在Oracle下載).
     *  .設置設置key的長度為16個字母和數字的字符竄(128 Bit/8=16字符)就不報錯了。
     */
    private static final String KEY = "KEYBYACSJAVAZXLL";

    /**
     *  偏移量
     */
    private static final int OFFSET = 16;
    private static final String TRANSFORMATION = "AES/CBC/PKCS5Padding";
    private static final String ALGORITHM = "AES";

    /**
     * 加密
     * @param content content
     * @return String
     */
    public static String encrypt(String content) {
        return encrypt(content, KEY);
    }

    /**
     * 解密
     *
     * @param content content
     * @return String
     */
    public static String decrypt(String content) {
        return decrypt(content, KEY);
    }

    /**
     * 加密
     *
     * @param content 需要加密的內容
     * @param key     加密密碼
     * @return String
     */
    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);
            //定義加密編碼
            String charset = "utf-8";
            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) {
            log.debug("加密失敗:{}",e.getMessage());
        }
        return null;
    }

    /**
     * AES(256)解密
     *
     * @param content 待解密內容
     * @param key     解密密鑰
     * @return 解密之后
     */
    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);
            // 初始化
            String charset = "utf-8";
            cipher.init(Cipher.DECRYPT_MODE, skey, iv);
            byte[] result = cipher.doFinal(new Base64().decode(content));
            // 解密
            return new String(result,charset);
        } catch (Exception e) {
            log.debug("解密失敗:{}",e.getMessage());
        }
        return null;
    }

}
                                                                        
4.4 分詞器 工具類 (部分分詞 + ik【可自定義擴展分詞】)以及使用介紹
  • 工具類
package com.xiarp.encryptstorage.util;

import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.util.StrUtil;

import org.wltea.analyzer.core.IKSegmenter;
import org.wltea.analyzer.core.Lexeme;

import java.io.StringReader;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

/**
 * @author xiarp
 */
public class AnalyzerUtil {
    /**
     * ik
     *
     * @param str    str
     * @param length length
     * @return List<String>
     */
    public static List<String> ikSegmentationList(String str, Integer length) {
        List<String> list = new LinkedList<>();
        try {
            if (StrUtil.isEmpty(str)) {
                return ListUtil.empty();
            }
            StringReader stringReader = new StringReader(str);
            IKSegmenter ik = new IKSegmenter(stringReader, false);
            Lexeme le;
            while ((le = ik.next()) != null) {
                String lexemeText = le.getLexemeText();
                if (lexemeText.length() >= length) {
                    list.add(lexemeText);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return list;
    }

    /**
     * 部分分詞
     *
     * @param str    str
     * @param length length
     * @return List<String>
     */
    public static List<String> partSegmentationList(String str, Integer length) {
        List<String> list = new ArrayList<>();
        if (StrUtil.isEmpty(str)) {
            return ListUtil.empty();
        }
        int strLength = str.length();
        for (int startIndex = 0; startIndex <= strLength - length; startIndex++) {
            String substring = str.substring(startIndex, startIndex + length);
            list.add(substring);
        }
        return list;
    }
}

  • ik 分詞器 配置文件+ 自定義擴展分詞文件+ 不需要分詞文件

文件1: IKAnalyzer.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
    <comment>IKAnalyzer擴展配置</comment>
    <!--用戶的擴展字典 -->
    <entry key="ext_dict">extend.dic</entry>
    <!--用戶擴展停止詞字典 -->
    <entry key="ext_stopwords">stopword.dic</entry>
</properties>

文件2: extend.dic (擴展詞典) ,沒有使用是空白的
文件3: stopword.dic (擴展停止詞典,不要這些 分詞) 沒有使用是空白的

文件全部創(chuàng)建在resources 下

mybatis-plus 數據字段進行加解密入庫,且加密字段支持模糊搜索,mybatis,mybatisplus

4.4.1 分詞器工具類使用解析,測試

ik 分詞器 (智能分詞)
mybatis-plus 數據字段進行加解密入庫,且加密字段支持模糊搜索,mybatis,mybatisplus

mybatis-plus 數據字段進行加解密入庫,且加密字段支持模糊搜索,mybatis,mybatisplus
參數1: 需要分詞的字符串,
參數2: 結果保留幾個字符以上字符串

mybatis-plus 數據字段進行加解密入庫,且加密字段支持模糊搜索,mybatis,mybatisplus
這邊獲取了 字符 >=2 的所有分詞數據

擴展詞典 :

現在我在 extend.dic (擴展詞典) 文件中加上 “暴富的夢” 跟 “今天是星期五” ,看看結果

mybatis-plus 數據字段進行加解密入庫,且加密字段支持模糊搜索,mybatis,mybatisplus

再次運行剛才測試代碼 ,可以看到分詞加進去了
mybatis-plus 數據字段進行加解密入庫,且加密字段支持模糊搜索,mybatis,mybatisplus

取消擴展詞典:

就是這個詞,不要出現,比如分詞結果不要 “星期五” 這個詞出現

mybatis-plus 數據字段進行加解密入庫,且加密字段支持模糊搜索,mybatis,mybatisplus
再次執(zhí)行
mybatis-plus 數據字段進行加解密入庫,且加密字段支持模糊搜索,mybatis,mybatisplus

ik 分詞用來分詞手機號數字串類型的不太友好 (有處理方法,可以改ik 的工具類,這邊就不改了,懶!),因此 可以 簡單寫了個 第二種方法,不知道叫什么,就叫部分分詞了

參數同理

mybatis-plus 數據字段進行加解密入庫,且加密字段支持模糊搜索,mybatis,mybatisplus

是按照,從第0位 開始 取三位,然后 從 第1 位開始取三位 。。。。。 以此類推,直到結束

【注意】:這邊涉及到一個性能和安全問題,比如分詞的字符長度設置的太長,加密又不安全,設置的太短,有影響性能,耗費的存儲空間又多,因此,選擇合適的分詞長度 很重要 (數據量過小不用考慮)

就比如手機號就可以設置成 4 位,為一個分片,模糊搜索也可以說明 “請輸入手機號后四位查詢”

mybatis-plus 數據字段進行加解密入庫,且加密字段支持模糊搜索,mybatis,mybatisplus

4.5 SQL 創(chuàng)建 分詞 映射表(word_part_mapping) 以及模擬數據 用戶(sys_user) 表

mybatis-plus 數據字段進行加解密入庫,且加密字段支持模糊搜索,mybatis,mybatisplus

mybatis-plus 數據字段進行加解密入庫,且加密字段支持模糊搜索,mybatis,mybatisplus

使用

對應需要加密實體類加上注解
mybatis-plus 數據字段進行加解密入庫,且加密字段支持模糊搜索,mybatis,mybatisplus

簡單模擬數據 新增 查詢

新增數據 需加密字段分詞處理邏輯 (映射表)
mybatis-plus 數據字段進行加解密入庫,且加密字段支持模糊搜索,mybatis,mybatisplus
再提一句:不要再循環(huán)里添加數據,要批量?。?!

**查詢 數據 **
mybatis-plus 數據字段進行加解密入庫,且加密字段支持模糊搜索,mybatis,mybatisplus

mybatis-plus 數據字段進行加解密入庫,且加密字段支持模糊搜索,mybatis,mybatisplus
我向數據庫中 添加了五條數據

以加密的形式存在
mybatis-plus 數據字段進行加解密入庫,且加密字段支持模糊搜索,mybatis,mybatisplus

查詢結果是明文【符合加密存儲,明文輸出要求
mybatis-plus 數據字段進行加解密入庫,且加密字段支持模糊搜索,mybatis,mybatisplus

模糊搜索

輸入一個參數,輸出三條數據,符合單模糊
mybatis-plus 數據字段進行加解密入庫,且加密字段支持模糊搜索,mybatis,mybatisplus

輸入多個參數 ,輸出符合的兩條數據,符合 多模糊

mybatis-plus 數據字段進行加解密入庫,且加密字段支持模糊搜索,mybatis,mybatisplus
mybatis-plus 數據字段進行加解密入庫,且加密字段支持模糊搜索,mybatis,mybatisplus

修改數據 直接看 這篇文章即可,一樣的

注意一點是,修改到了敏感數據,需要先刪除原先敏感數據的分詞,重新分詞進行添加?。?,所以前邊說的 批量添加分詞映射表數據 可以 自己寫一個工具類!!

文章有遺漏的工具類,或者有需要的其他信息,可以打在評論區(qū)!! 歡迎討論指正,當然要是有更好的實現 方案,請指教!??!文章來源地址http://www.zghlxwxcb.cn/news/detail-704176.html

到了這里,關于mybatis-plus 數據字段進行加解密入庫,且加密字段支持模糊搜索的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • Mybatis-plus怎么更新Null字段?

    本文介紹【Mybatis-plus】updateById()方法不能更新字段為null的原因及解決辦法。 在日常項目開發(fā)過程中,經常會使用Mybatis-plus的updateById()方法,快速將接收道德參數或者查詢結果中原本不為null的字段更新為null,并且該字段在數據庫中可為null,這個時候使用updateById()并不能實現

    2024年02月13日
    瀏覽(37)
  • mybatis-plus 根據指定字段 批量 刪除/修改

    mybatis-plus 根據指定字段 批量 刪除/修改

    mybatis-plus 提供了根據id批量更新和修改的方法,這個大家都不陌生 但是當表沒有id的時候怎么辦) 這個就不說了,就是因為不想手寫SQL 所以才有這篇博客 mybatis plus 的 executeBatch 參考 mybatis plus 的updateBatchById 方法. 調用處: 接口 重寫方法 實現 這種寫法其實批量的效率還是比較慢的

    2024年02月13日
    瀏覽(17)
  • mybatis-plus更新字段為null值

    mybatis-plus更新字段為null值

    mybatis-plus相信大家都不陌生所以不在介紹 首先我們先看一下mybatis-plus的官網上的介紹 ?官網推薦的有三種方式可以實現 第一種:調整全局策略, mybatis-plus默認的全局策略為NOT_NULL非空默認策略,其實就是當更新是某個字段為空,則不對該字段進行更新,這也是我們常用的策略所此種

    2024年02月14日
    瀏覽(25)
  • Mybatis-plus通過其他字段批量更新或新增

    根據某個或者多個非ID字段進行批量更新 示例通過名稱與id兩個字段更新 引用mybatis-plus根據某個指定字段批量更新數據庫 通過其他字段批量更新或新增

    2024年02月12日
    瀏覽(19)
  • MyBatis-Plus如何將字段修改為空值

    不推薦使用原因:作用范圍太廣,調用MyBatis-Plus封裝的update會不經意將字段改為空 不推薦使用原因:相對于方案一作用范圍相對較小,但調用MyBatis-Plus封裝的update也會不經意將字段改為空 推薦原因:不影響任何地方只在此處生效

    2024年02月16日
    瀏覽(15)
  • Mybatis-Plus處理Mysql Json類型字段

    Mybatis-Plus處理Mysql Json類型字段

    Mysql 5.7.8開始支持Json對象和Json數組,但在Mysql 8版本中使用Json性能更佳。 使用Json格式的好處: 無須預定義字段:字段可以無限拓展,避免了ALTER ADD COLUMN的操作,使用更加靈活。 處理稀疏字段:避免了稀疏字段的NULL值,避免冗余存儲。 支持索引:相比于字符串格式的JSON,

    2024年02月03日
    瀏覽(28)
  • Mybatis ,Mybatis-plus列表多字段排序,包含sql以及warpper

    Mybatis ,Mybatis-plus列表多字段排序,包含sql以及warpper

    首先根據咱們返回前端的數據列來規(guī)劃好排序字段 如下: 這里的字段為返回VO的字段,要轉換成數據庫字段然后加入到排序中 示例,穿了 surname,cerRank 多字段,然后是倒序 false 首先創(chuàng)建好映射,如下代碼,第一個List 為前端字段VO, 第二個List 為數據庫字段。Util.handle 是將兩個轉換

    2024年02月14日
    瀏覽(18)
  • SpringBoot - MyBatis-Plus - 如何在查詢時排除某些字段?

    寫在前面 查詢時部分字段不想給前端顯示,怎么辦? (1)使用SELECT方法,排除字段\\\"password\\\" (2)使用SELECT方法,只顯示某些字段 (3)使用@TableField(exist = false),排除某些字段 注:表示當前屬性不是數據庫的字段,但在項目中必須使用,這樣的話在新增/查詢等使用BEAN時,

    2024年02月12日
    瀏覽(16)
  • Mybatis-Plus不能更新對象字段為空值問題解決

    Mybatis-Plus不能更新對象字段為空值問題解決

    問題描述: 在使用Mybatis-Plus調用updateById方法進行數據更新默認情況下是不能更新空值字段的,而在實際開發(fā)過程中,往往會遇到需要將字段值更新為空值的情況,該如何解決呢? 原因分析: Mybatis-Plus中字段的更新策略是通過FieldStrategy屬性控制的。在實體字段上,如果不通

    2024年02月12日
    瀏覽(20)
  • Springboot引入mybatis-plus及操作mysql的json字段

    springboot引入mybatis-plus,創(chuàng)建springboot項目省略 pom文件 配置文件 備注信息 springboot使用mybatis和mybatis-plus沒有什么區(qū)別,需要注意的是配置文件跟配置名:mybatis-plus 使用mybatis-plus的有點在于,在mybatis的基礎上記性了一系列的有效封裝,節(jié)約了開發(fā)時間,有這方面興趣額同學自行

    2024年02月06日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包