<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          被問懵了,加密后的數(shù)據(jù)如何進(jìn)行模糊查詢?

          共 3917字,需瀏覽 8分鐘

           ·

          2022-08-25 10:00

          點(diǎn)擊關(guān)注公眾號(hào),實(shí)用技術(shù)文章及時(shí)了解

          我們知道加密后的數(shù)據(jù)對(duì)模糊查詢不是很友好,本篇就針對(duì)加密數(shù)據(jù)模糊查詢這個(gè)問題來展開講一講實(shí)現(xiàn)的思路,希望對(duì)大家有所啟發(fā)。

          為了數(shù)據(jù)安全我們?cè)陂_發(fā)過程中經(jīng)常會(huì)對(duì)重要的數(shù)據(jù)進(jìn)行加密存儲(chǔ),常見的有:密碼、手機(jī)號(hào)、電話號(hào)碼、詳細(xì)地址、銀行卡號(hào)、信用卡驗(yàn)證碼等信息,這些信息對(duì)加解密的要求也不一樣,比如說密碼我們需要加密存儲(chǔ),一般使用的都是不可逆的慢hash算法,慢hash算法可以避免暴力破解(典型的用時(shí)間換安全性)。

          在檢索時(shí)我們既不需要解密也不需要模糊查找,直接使用密文完全匹配,但是手機(jī)號(hào)就不能這樣做,因?yàn)槭謾C(jī)號(hào)我們要查看原信息,并且對(duì)手機(jī)號(hào)還需要支持模糊查找,因此我們今天就針對(duì)可逆加解密的數(shù)據(jù)支持模糊查詢來看看有哪些實(shí)現(xiàn)方式。

          在網(wǎng)上隨便搜索了一下,關(guān)于《加密后的模糊查詢》 的帖子很多,順便整理了一下實(shí)現(xiàn)的方法,不得不說很多都是不靠譜的做法,甚至有一些沙雕做法,接下來我們就對(duì)這些做法來講講實(shí)現(xiàn)思路和優(yōu)劣性。

          如何對(duì)加密后的數(shù)據(jù)進(jìn)行模糊查詢

          我整理了一下對(duì)加密的數(shù)據(jù)模糊查詢大致分為三類做法,如下所示:

          • 沙雕做法(不動(dòng)腦思考直男的思路,只管實(shí)現(xiàn)功能從不深入思考問題)
          • 常規(guī)做法(思考了查詢性能問題,也會(huì)使用一些存儲(chǔ)空間換性能等做法)
          • 超神做法(比較高端的做法從算法層面上思考)

          我們就對(duì)這三種實(shí)現(xiàn)方法一一來講講實(shí)現(xiàn)思路和優(yōu)劣性,首先我們先看沙雕做法。

          沙雕做法

          • 將所有數(shù)據(jù)加載到內(nèi)存中進(jìn)行解密,解密后通過程序算法來模糊匹配
          • 將密文數(shù)據(jù)映射一份明文映射表,俗稱tag表,然后模糊查詢tag來關(guān)聯(lián)密文數(shù)據(jù)

          沙雕一

          我們先來看看第一個(gè)做法,將所有數(shù)據(jù)加載到內(nèi)存中進(jìn)行解密,這個(gè)如果數(shù)據(jù)量小的話可以使用這個(gè)方式來做,這樣做既簡單又實(shí)惠,如果數(shù)據(jù)量大的話那就是災(zāi)難,我們來大致算一下。

          一個(gè)英文字母(不分大小寫)占一個(gè)字節(jié)的空間,一個(gè)中文漢字占兩個(gè)字節(jié)的空間,用DES來舉例,13800138000加密后的串HE9T75xNx6c5yLmS5l4r6Q==占24個(gè)字節(jié)。

          輕則上百兆,重則上千兆,這樣分分鐘給應(yīng)用程序整成Out of memory,這樣做如果數(shù)據(jù)少只有幾百、幾千、幾萬條時(shí)是完全可以這樣做的,但是數(shù)據(jù)量大就強(qiáng)烈不建議了。

          沙雕二

          我們?cè)賮砜吹诙€(gè)做法,將密文數(shù)據(jù)映射一份明文映射表,然后模糊查詢映射表來關(guān)聯(lián)密文數(shù)據(jù),what???!!!那我們?yōu)槭裁匆獙?duì)數(shù)據(jù)加密呢,直接不加密不是更好么!

          我們既然對(duì)數(shù)據(jù)加密肯定是有安全訴求才會(huì)這樣做,增加一個(gè)明文的映射表就違背了安全訴求,這樣做既不安全也不方便完全是脫褲子放x,多此一舉,強(qiáng)且不推薦。

          常規(guī)做法

          我們接下來看看常規(guī)的做法,也是最廣泛使用的方法,此類方法及滿足的數(shù)據(jù)安全性,又對(duì)查詢友好。

          • 在數(shù)據(jù)庫實(shí)現(xiàn)加密算法函數(shù),在模糊查詢的時(shí)候使用decode(key) like '%partial%
          • 對(duì)密文數(shù)據(jù)進(jìn)行分詞組合,將分詞組合的結(jié)果集分別進(jìn)行加密,然后存儲(chǔ)到擴(kuò)展列,查詢時(shí)通過key like '%partial%'

          常規(guī)一

          在數(shù)據(jù)庫中實(shí)現(xiàn)與程序一致的加解密算法,修改模糊查詢條件,使用數(shù)據(jù)庫加解密函數(shù)先解密再模糊查找,這樣做的優(yōu)點(diǎn)是實(shí)現(xiàn)成本低,開發(fā)使用成本低,只需要將以往的模糊查找稍微修改一下就可以實(shí)現(xiàn),但是缺點(diǎn)也很明顯,這樣做無法利用數(shù)據(jù)庫的索引來優(yōu)化查詢,甚至有一些數(shù)據(jù)庫可能無法保證與程序?qū)崿F(xiàn)一致的加解密算法,但是對(duì)于常規(guī)的加解密算法都可以保證與應(yīng)用程序一致。

          如果對(duì)查詢性能要求不是特別高、對(duì)數(shù)據(jù)安全性要求一般,可以使用常見的加解密算法比如說AES、DES之類的也是一個(gè)不錯(cuò)的選擇。

          如果公司有自己的算法實(shí)現(xiàn),并且沒有提供多端的算法實(shí)現(xiàn),要么找個(gè)算法好的人去研究吃透補(bǔ)全多端實(shí)現(xiàn),要么放棄使用這個(gè)辦法。

          常規(guī)二

          對(duì)密文數(shù)據(jù)進(jìn)行分詞組合,將分詞組合的結(jié)果集分別進(jìn)行加密,然后存儲(chǔ)到擴(kuò)展列,查詢時(shí)通過key like '%partial%',這是一個(gè)比較劃算的實(shí)現(xiàn)方法,我們先來分析一下它的實(shí)現(xiàn)思路。

          先對(duì)字符進(jìn)行固定長度的分組,將一個(gè)字段拆分為多個(gè),比如說根據(jù)4位英文字符(半角),2個(gè)中文字符(全角)為一個(gè)檢索條件,舉個(gè)例子:

          ningyu1使用4個(gè)字符為一組的加密方式,第一組ning ,第二組ingy ,第三組ngyu ,第四組gyu1 … 依次類推。

          如果需要檢索所有包含檢索條件4個(gè)字符的數(shù)據(jù)比如:ingy ,加密字符后通過 key like “%partial%” 查庫。

          我們都知道加密后長度會(huì)增長,增長的這部分長度存儲(chǔ)就是我們要花費(fèi)的額外成本,典型的使用成本來換取速度,密文增長的幅度隨著算法不同而不同以DES舉例,13800138000加密前占11個(gè)字節(jié),加密后的串HE9T75xNx6c5yLmS5l4r6Q==占24個(gè)字節(jié),增長是2.18倍,所以一個(gè)優(yōu)秀的算法是多么的重要,能為公司節(jié)省不少成本,但是話又說回來算法工程師的工資也不低,所以我也不知道是節(jié)省成本還是增加成本,哈哈哈…你們自己算吧。

          回到主題,這個(gè)方法雖然可以實(shí)現(xiàn)加密數(shù)據(jù)的模糊查詢,但是對(duì)模糊查詢的字符長度是有要求的,以我上面舉的例子模糊查詢字符原文長度必須大于等于4個(gè)英文/數(shù)字,或者2個(gè)漢字,再短的長度不建議支持,因?yàn)榉衷~組合會(huì)增多從而導(dǎo)致存儲(chǔ)的成本增加,反而安全性降低。

          大家是否都對(duì)接過 淘寶、拼多多、JD他們的api,他們對(duì)平臺(tái)訂單數(shù)據(jù)中的用戶敏感數(shù)據(jù)就是加密的同時(shí)支持模糊查詢,使用就是這個(gè)方法,下面我整理了幾家電商平臺(tái)的密文字段檢索方案的說明,感興趣的可以查看下面鏈接。

          • 淘寶密文字段檢索方案:https://open.taobao.com/docV3.htm?docId=106213&docType=1

          • 阿里巴巴文字段檢索方案:https://jaq-doc.alibaba.com/docs/doc.htm?treeId=1&articleId=106213&docType=1

          • 拼多多密文字段檢索方案:https://open.pinduoduo.com/application/document/browse?idStr=3407B605226E77F2

          • 京東密文字段檢索方案:https://jos.jd.com/commondoc?listId=345

          ps. 基本上都是一樣的,果然都是互相抄襲,連加密后的數(shù)據(jù)格式都一致。

          這個(gè)方法優(yōu)點(diǎn)就是實(shí)現(xiàn)起來不算復(fù)雜,使用起來也較為簡單,算是一個(gè)折中的做法,因?yàn)闀?huì)有擴(kuò)展字段存儲(chǔ)成本會(huì)有升高,但是可利用數(shù)據(jù)庫索引優(yōu)化查詢速度,推薦使用這個(gè)方法。

          超神做法

          我們接下來看看優(yōu)秀的做法,此類做法難度較高,都是從算法層面來考慮,有些甚至?xí)O(shè)計(jì)一個(gè)新算法,雖然已有一些現(xiàn)成的算法參考,但是大多都是半成品無法拿來直接使用,所以還是要有人去深入研究和整合到自己的應(yīng)用中去。

          從算法層面思考,甚至?xí)O(shè)計(jì)一個(gè)新算法來支持模糊查找

          這個(gè)層面大多是專業(yè)算法工程師的研究領(lǐng)域,想要設(shè)計(jì)一個(gè)有序的、非不可逆的、密文長度不能增長過快的算法不是一件簡單的事情,大致的思路是這樣的,使用譯碼的方式進(jìn)行加解密,保留密文和原文一樣的順序,從而支持密文模糊匹配,說的比較籠統(tǒng)因?yàn)槲乙膊皇沁@方面的專家沒有更深一步的研究過,所以我從網(wǎng)上找了一些資料可以參考一下。

          • 數(shù)據(jù)庫中字符數(shù)據(jù)的模糊匹配加密方法:https://www.jiamisoft.com/blog/6542-zifushujumohupipeijiamifangfa.html

          這里提到的Hill密碼處理和模糊匹配加密方法FMES可以重點(diǎn)看看.

          • 一種基于BloomFilter的改進(jìn)型加密文本模糊搜索機(jī)制研究:http://kzyjc.cnjournals.com/html/2019/1/20190112.htm

          • 支持快速查詢的數(shù)據(jù)庫如何加密:https://www.jiamisoft.com/blog/5961-kuaisuchaxunshujukujiami.html

          • 基于Lucene的云端搜索與密文基礎(chǔ)上的模糊查詢:https://www.cnblogs.com/arthurqin/p/6307153.html

          基于Lucene的思路就跟我們上面介紹的常規(guī)做法二類似,對(duì)字符進(jìn)行等長度分詞,將分詞后的結(jié)果集加密后存儲(chǔ),只不過存儲(chǔ)的db不一樣,一個(gè)是關(guān)系型數(shù)據(jù)庫,一個(gè)是es搜索引擎。

          • 云存儲(chǔ)中一種支持可驗(yàn)證的模糊查詢加密方案:http://jeit.ie.ac.cn/fileDZYXXXB/journal/article/dzyxxxb/2017/7/PDF/160971.pdf

          總結(jié)

          我們到這里對(duì)加密數(shù)據(jù)的檢索方案全部介紹完了,我們首先提到的是網(wǎng)上搜索隨處可見的沙雕做法,在這里也講了不推薦使用這些沙雕做法,盡量使用常規(guī)做法,如果公司有專業(yè)算法方向人才的話不妨可以考慮基于算法層面的超神做法。

          總的來說從投入、產(chǎn)出比、及實(shí)現(xiàn)、使用成本來算的話常規(guī)做法二是非常推薦的。

          來源:ningyu1.github.io/20201230/encrypted

          -data-fuzzy-query.html

          程序汪資料鏈接

          程序汪接的7個(gè)私活都在這里,經(jīng)驗(yàn)整理

          Java項(xiàng)目分享  最新整理全集,找項(xiàng)目不累啦 07版

          堪稱神級(jí)的Spring Boot手冊(cè),從基礎(chǔ)入門到實(shí)戰(zhàn)進(jìn)階

          臥槽!字節(jié)跳動(dòng)《算法中文手冊(cè)》火了,完整版 PDF 開放下載!

          臥槽!阿里大佬總結(jié)的《圖解Java》火了,完整版PDF開放下載!

          字節(jié)跳動(dòng)總結(jié)的設(shè)計(jì)模式 PDF 火了,完整版開放下載!

          歡迎添加程序汪個(gè)人微信 itwang009  進(jìn)粉絲群或圍觀朋友圈


          瀏覽 16
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  豆花av在线播放 豆花av在线观看 | 韩国成人电影一区二区三区 | 亚洲啪AV永久无码精品放毛片 | 久久视频这里有精品 | 国产高清激情视频 |