在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

加密后的敏感字段還能進行模糊查詢嗎?該如何實現?

jf_ro2CN3Fa ? 來源:CSDN ? 2023-06-05 16:43 ? 次閱讀

前言

有一個問題不知道大家想過沒?敏感字段數據是加密存儲在數據庫的表中,如果需要對這些敏感字段進行模模糊查詢,還用原來的通過sql的where從句的like來模糊查詢的方式肯定是不行的,那么應該怎么實現呢?這篇文章就來解決這個問題。

場景分析

假如有類似這樣的一個場景:有一個人員管理的功能,人員信息列表的主要字段有姓名、性別、用戶賬號、手機號碼、身份證號碼、家庭住址、注冊日期等,可以對任意一條數據進行增、刪、改、查,其中姓名、身份證號碼、手機號碼字段要支持模糊查詢。

簡單分析一個場景,可以知道:手機號碼、身份證號碼、家庭人址字段數據是敏感數據,這些字段的數據是要加密存儲在數據庫里,在頁面上展示的時候需要進行脫敏處理的。

如果用戶想要查詢真實姓名是包含有“張三”的所有人員信息,可以在頁面上輸入一個關鍵字,如“張三”,點擊開始查詢后,這個參數會傳遞到后臺,后臺會執行一條sql,如“select * from sys_person where real_name like ‘%張三%’”,執行結果中包含了所有用戶真實姓名包含有“張三”的所有數據記錄,如“張三”,“張三豐”等。

如果用戶要查詢手機號碼尾號是“0537”的用戶,后臺執行類似與姓名模糊查詢的sql,"select * from sys_person where phone like '%0537'",肯定是得不到正確的結果的,因為手機號碼字段在數據庫中的數據是加密后的結果,而‘0537’是明文。身份證號碼、家庭住址等其他敏感字段在模糊查詢的時候也都有類似這樣的問題,這也是敏感字段模糊查詢的痛點,即模糊查詢關鍵字與實際存儲的數據不一致。

實現方案

下面分享幾種解決方案:

第一種,先解密再查詢

查詢出目標表內所有的數據,在內存中對要模糊查詢的敏感字段的加密數據進行解密,然后再遍歷解密后的數據,與模糊查詢關鍵字進行比較,篩選出包含有模糊查詢關鍵字的數據行。

這種方法是最容易想到的,但有一個比較明顯的問題是,模糊查詢的過程是在內存中進行的,如果數據量特別大,很容易導致內存溢出,因此不推薦在生產中使用這種方法;

第二種,明文映射表

新建一張映射表,存儲敏感字段解密后的數據與目標表主鍵的映射表,需要模糊查詢的時候,先對明文映射表進行模糊查詢,得到符合條件的目標數據的主鍵,再返回來根據主鍵查詢目標表;

這種方法,實際上是有點掩耳盜鈴的感覺,敏感字段加密存儲的字段主要是考慮到安全性,使用明文映射表來存儲解密后的敏感字段,實際上相當于敏感字段沒有加密存儲,與最被要對敏感字段加密的初衷相違背,因此不推薦在生產中使用這種方法;

第三種,數據庫層面進行解密查詢

后臺在執行查詢sql時對敏感字段先解密,然后再執行like,以上面的人員管理列表模糊查詢為例,即對sql的改造為:“select * from sys_person where AES_DECRYPT(phone,'key') like '%0537'”;

這種方法的優點是,成本比較小,容易實現,但是缺點很明顯,該字段無法通過數據庫索引來優化查詢,另外有一些數據庫無法保證數據庫的加解密算法與程序的加解密算法一致,可能會導致可以程序中加密,但是無法在數據庫中解密的或者可以在數據庫加密無法在程序中解密的問題,因此不推薦在生產中使用這種方法;

第四種,分詞密文映射表

這種方法是對第二種思路的基礎上進行延伸優化,也是主流的方法。新建一張分詞密文映射表,在敏感字段數據新增、修改的后,對敏感字段進行分詞組合,如“15503770537”的分詞組合有“155”、“0377”、“0537”等,再對每個分詞進行加密,建立起敏感字段的分詞密文與目標數據行主鍵的關聯關系;在處理模糊查詢的時候,對模糊查詢關鍵字進行加密,用加密后的模糊查詢關鍵字,對分詞密文映射表進行like查詢,得到目標數據行的主鍵,再以目標數據行的主鍵為條件返回目標表進行精確查詢。

cc9384c0-037b-11ee-90ce-dac502259ad0.png

圖片一:分組組合加密前

ccc196f8-037b-11ee-90ce-dac502259ad0.png

圖片二:分組組合加密后

這種方法的優點就是原理簡單,實現起來也不復雜,但是有一定的局限性,算是一個對性能、業務相折中的一個方案,相比較之下,在能想的方法中,比較推薦這種方法,但是要特別注意的是,對模糊查詢的關鍵字的長度,要在業務層面進行限制;以手機號為例,可以要求對模糊查詢的關鍵字是四位或者是五位,具體可以再根據具體的場景進行詳細劃分。

為什么要增加這樣的限制呢?因為明文加密后長度為變長,有額外的存儲成本和查詢性能成本,分詞組合越多,需要的存儲空間以及所消耗的查詢性能成本也就更大,并且分詞越短,被硬破解的可能性也就越大,也會在一定程度上導致安全性降低;

環境配置

jdk版本:1.8開發工具:Intellij iDEA 2020.1

springboot:2.3.9.RELEASE

mybatis-spring-boot-starter:2.1.4

依賴配置

示例主要用到了SpringAop,加密是對稱加密,用到了hutool工具包里的加密解密工具類,也可以使用自己封裝的加密解密工具類。


org.springframework.boot
spring-boot-starter-aop


cn.hutool
hutool-all
5.3.3

代碼實現

1、新建分詞密文映射表;

如果是多個模糊查詢的字段,可以共用在一張分詞密文映射表中擴展多個字段,以示例中的人員管理功能為例,新建sys_person_phone_encrypt表(人員的手機號碼分詞密文映射表),用于存儲人員id與分詞組合密文的映射關系

createtableifnotexistssys_person_phone_encrypt
(
idbigintauto_incrementcomment'主鍵'primarykey,
person_idintnotnullcomment'關聯人員信息表主鍵',
phone_keyvarchar(500)notnullcomment'手機號碼分詞密文'
)
comment'人員的手機號碼分詞密文映射表';

2、敏感字段數據在保存入庫的時候,對敏感字段進行分詞組合并加密碼,存儲在分詞密文映射表;

在注冊人員信息的時候,先取出通過AOP進行加密過的手機號碼進行解密;手機號碼解密之后,對手機號碼按照連續四位進行分詞組合,并對每一個手機號碼的分詞進行加密,最后把所有的加密后手機號碼分詞拼接成一個字符串,與人員id一起保存到人員的手機號碼分詞密文映射表;

publicPersonregiste(Personperson){
this.personDao.insert(person);
Stringphone=this.decrypt(person.getPhoneNumber());
StringphoneKeywords=this.phoneKeywords(phone);
this.personDao.insertPhoneKeyworkds(person.getId(),phoneKeywords);
returnperson;
}
privateStringphoneKeywords(Stringphone){
Stringkeywords=this.keywords(phone,4);
System.out.println(keywords.length());
returnkeywords;
}

//分詞組合加密
privateStringkeywords(Stringword,intlen){
StringBuildersb=newStringBuilder();
for(inti=0;i

3、模糊查詢的時候,對模糊查詢關鍵字進行加密,以加密后的關鍵字密文為查詢條件,查詢密文映射表,得到目標數據行的id,再以目標數據行id為查詢條件,查詢目標數據表;

根據手機號碼的四位進行模糊查詢的時候,以加密后模糊查詢的關鍵字為條件,查詢sys_person_phone_encrypt表(人員的手機號碼分詞密文映射表),得到人員信息id;再以人員信息id,查詢人員信息表;

publicListgetPersonList(StringphoneVal){
if(phoneVal!=null){
returnthis.personDao.queryByPhoneEncrypt(this.encrypt(phoneVal));
}
returnthis.personDao.queryList(phoneVal);
}

select*fromsys_personwhereidin
(selectperson_idfromsys_person_phone_encrypt
wherephone_keylikeconcat('%',#{phoneVal},'%'))

cd085a98-037b-11ee-90ce-dac502259ad0.png

圖片三:模糊查詢“6666”





審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 存儲器
    +關注

    關注

    38

    文章

    7496

    瀏覽量

    163932
  • SQL
    SQL
    +關注

    關注

    1

    文章

    766

    瀏覽量

    44164
  • AOP
    AOP
    +關注

    關注

    0

    文章

    40

    瀏覽量

    11103
  • 加密解密算法

    關注

    0

    文章

    7

    瀏覽量

    1617

原文標題:加密后的敏感字段還能進行模糊查詢嗎?該如何實現?

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    有什么方法能使連接外部看門狗還能進行程序的升級?

    單片機連接外部硬件看門狗,程序下載不了,拆除硬件看門狗,程序就可以下載了。應該是程序下載過程中外狗一直復位單片機,導致程序下載不了。有什么方法能使連接外部看門狗還能進行程序的升級
    發表于 09-16 13:48

    加密版C6748不能進行io置位嗎?

    接口。那么可不可以像非加密版的6748通過sfh_OMAP-L138工具進行串口燒寫(經驗證sfh_OMAP-L138工具不能用于加密版芯片)?實現串口燒寫是否需要開發二次boot來支
    發表于 10-14 16:49

    FPGA通過串口得到數據 得到數據進行加密 無法得到加密結果的信號

    1.可以實現串口的回環通信 2.串口接受完信號發送一個信號給加密模塊進行加密 無法得到
    發表于 04-01 20:49

    注塑機被水淹應該怎么處理?還能進行維修嗎?

    注塑機被水淹應該怎么處理?還能進行維修嗎?
    發表于 11-12 07:43

    怎樣去實現Stm32在啟用IWDG看門狗還能進行休眠呢

    怎樣去實現Stm32在啟用IWDG看門狗還能進行休眠呢?有哪些方法?
    發表于 01-17 06:04

    基于動態查詢表的模糊控制策略及其應用

    研究基于動態查詢表的模糊控制策略及其在轉臂式倒立擺中的應用Z 采用一種新的倒立擺系統的控制方法, 將傳感器檢測的倒立擺的兩個角度信息傳送到控制器, 控制器利用信息的
    發表于 07-15 09:01 ?22次下載

    Delphi教程之標準/模糊查詢

    Delphi教程之標準/模糊查詢,學習Delphi的必備資料。
    發表于 03-31 11:29 ?2次下載

    MySQL 教程—聯合查詢

    聯合查詢:union,將多次查詢(多條select語句)的結果,在字段數相同的情況下,在記錄的層次上進行拼接。
    發表于 09-11 12:56 ?5次下載
    MySQL 教程—聯合<b class='flag-5'>查詢</b>

    面向云數據庫的屬性基加密查詢轉換中間件

    針對云數據庫租戶隱私數據的加密查詢問題,提出并實現了一種面向云數據庫的屬性基加密( ABE)和查詢轉換服務中間件。首先,服務中間件的加解密
    發表于 01-15 14:45 ?5次下載
    面向云數據庫的屬性基<b class='flag-5'>加密</b>和<b class='flag-5'>查詢</b>轉換中間件

    MongoDB引入字段級數據庫加密安全功能

    MongoDB 引入了一個全新的安全功能:字段級數據庫加密。在有了靜態存儲加密和傳輸加密之后,為什么還要字段
    的頭像 發表于 04-02 17:56 ?2862次閱讀
    MongoDB引入<b class='flag-5'>字段</b>級數據庫<b class='flag-5'>加密</b>安全功能

    Oracle:查看所有表和字段、表注釋、字段注釋的步驟

    小伙伴們按照我寫的文章順利安裝好Oracle數據庫,又在微信上問我:我想查看Oracle數據庫中所有表和字段以及表注釋和字段的注釋,我怎么操作呢?看著小伙伴們這么高的學習熱情,這些
    發表于 08-10 16:21 ?4010次閱讀
    Oracle:查看所有表和<b class='flag-5'>字段</b>、表注釋、<b class='flag-5'>字段</b>注釋的步驟

    一種基于星座模糊的物理層加密方案

    為在物理層中進行信息安全傳輸,提出一種基于星座模糊的物理層加密方案。將信道系數作為密鑰,采用信道系數與已調符號矢量疊加的方式實現加密。考慮信
    發表于 04-02 11:13 ?4次下載
    一種基于星座<b class='flag-5'>模糊</b>的物理層<b class='flag-5'>加密</b>方案

    如何對加密的數據進行模糊查詢

    我們先來看看第一個做法,將所有數據加載到內存中進行解密,這個如果數據量小的話可以使用這個方式來做,這樣做既簡單又實惠,如果數據量大的話那就是災難,我們來大致算一下。
    的頭像 發表于 08-16 10:14 ?1548次閱讀

    Redis的分頁+多條件模糊查詢組合實現方案

    Redis是key-value類型的內存數據庫,通過key直接取數據雖然很方便,但是并未提供像mysql那樣方便的sql條件查詢支持。因此我們需要借助Redis提供的結構和功能去自己實現模糊條件
    的頭像 發表于 11-20 14:26 ?933次閱讀
    Redis的分頁+多條件<b class='flag-5'>模糊</b><b class='flag-5'>查詢</b>組合<b class='flag-5'>實現</b>方案

    oracle更新clob字段腳本寫法

    ; BEGIN -- 先查詢要更新的CLOB字段的內容 SELECT clob_column INTO clob_var FROM your_table WHERE id = 1 ; -- 修改
    的頭像 發表于 11-21 11:28 ?3258次閱讀
    主站蜘蛛池模板: 日a在线| 在线看黄网| 丁香婷婷久久大综合| 狠狠色噜噜狠狠狠狠| 狠狠色欧美亚洲狠狠色www| 精品一区视频| 国产美女免费| 夜夜天天操| 日日操狠狠操| 狠狠的操| 午夜小视频在线观看| 午夜视频在线观看完整高清在线 | 一级特黄毛片| 性欧美xxxxhd| 欧美色老头| 国产女人和拘做受视频免费| 99久久无色码中文字幕| 精品亚洲欧美无人区乱码| 国产三级a三级三级野外| 一级特色黄大片| se94se欧美| 天天摸夜夜添夜夜添国产| 狠狠色狠狠色狠狠五月ady| h黄视频| 一级特级aaaa毛片免费观看| 日日噜噜噜夜夜爽爽狠狠视频| 久精品视频村上里沙| 2022欧美高清中文字幕在线看| bt在线天堂| 天天操网| 啪啪网站免费看| 久久久久久免费播放一级毛片| 天堂男人网| 精品国产香港三级| 久久极品| 窝窝午夜视频| 中国人69xxx大全| 伊人亚洲| 久色99| 狠狠干奇米| 天天搞夜夜|