<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ù)如何進行模糊查詢??被問懵了。。

          共 3910字,需瀏覽 8分鐘

           ·

          2022-09-17 21:25


          我們知道加密后的數(shù)據(jù)對模糊查詢不是很友好,本篇就針對加密數(shù)據(jù)模糊查詢這個問題來展開講一講實現(xiàn)的思路,希望對大家有所啟發(fā)。
          為了數(shù)據(jù)安全我們在開發(fā)過程中經(jīng)常會對重要的數(shù)據(jù)進行加密存儲,常見的有:密碼、手機號、電話號碼、詳細地址、銀行卡號、信用卡驗證碼等信息,這些信息對加解密的要求也不一樣,比如說密碼我們需要加密存儲,一般使用的都是不可逆的慢hash算法,慢hash算法可以避免暴力破解(典型的用時間換安全性)。
          在檢索時我們既不需要解密也不需要模糊查找,直接使用密文完全匹配,但是手機號就不能這樣做,因為手機號我們要查看原信息,并且對手機號還需要支持模糊查找,因此我們今天就針對可逆加解密的數(shù)據(jù)支持模糊查詢來看看有哪些實現(xiàn)方式。
          在網(wǎng)上隨便搜索了一下,關于《加密后的模糊查詢》 的帖子很多順便整理了一下實現(xiàn)的方法,不得不說很多都是不靠譜的做法,甚至有一些沙雕做法,接下來我們就對這些做法來講講實現(xiàn)思路和優(yōu)劣性。

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

          我整理了一下對加密的數(shù)據(jù)模糊查詢大致分為三類做法,如下所示:
          • 沙雕做法(不動腦思考直男的思路,只管實現(xiàn)功能從不深入思考問題)
          • 常規(guī)做法(思考了查詢性能問題,也會使用一些存儲空間換性能等做法)
          • 超神做法(比較高端的做法從算法層面上思考)
          我們就對這三種實現(xiàn)方法一一來講講實現(xiàn)思路和優(yōu)劣性,首先我們先看沙雕做法。

          沙雕做法

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

          沙雕一

          我們先來看看第一個做法,將所有數(shù)據(jù)加載到內(nèi)存中進行解密,這個如果數(shù)據(jù)量小的話可以使用這個方式來做,這樣做既簡單又實惠,如果數(shù)據(jù)量大的話那就是災難,我們來大致算一下。
          一個英文字母(不分大小寫)占一個字節(jié)的空間,一個中文漢字占兩個字節(jié)的空間,用DES來舉例,13800138000加密后的串HE9T75xNx6c5yLmS5l4r6Q==24個字節(jié)。
          條數(shù)BytesMB
          100w
          2400萬
          22.89
          1000w
          2.4億
          228.89
          1億
          24億
          2288.89
          輕則上百兆,重則上千兆,這樣分分鐘給應用程序整成Out of memory,這樣做如果數(shù)據(jù)少只有幾百、幾千、幾萬條時是完全可以這樣做的,但是數(shù)據(jù)量大就強烈不建議了。
          沙雕二
          我們再來看第二個做法,將密文數(shù)據(jù)映射一份明文映射表,然后模糊查詢映射表來關聯(lián)密文數(shù)據(jù),what????。?!那我們?yōu)槭裁匆獙?shù)據(jù)加密呢,直接不加密不是更好么!
          我們既然對數(shù)據(jù)加密肯定是有安全訴求才會這樣做,增加一個明文的映射表就違背了安全訴求,這樣做既不安全也不方便完全是脫褲子放x,多此一舉,強且不推薦。

          常規(guī)做法

          我們接下來看看常規(guī)的做法,也是最廣泛使用的方法,此類方法及滿足的數(shù)據(jù)安全性,又對查詢友好。
          • 在數(shù)據(jù)庫實現(xiàn)加密算法函數(shù),在模糊查詢的時候使用decode(key) like '%partial%
          • 對密文數(shù)據(jù)進行分詞組合,將分詞組合的結(jié)果集分別進行加密,然后存儲到擴展列,查詢時通過key like '%partial%'

          常規(guī)一

          在數(shù)據(jù)庫中實現(xiàn)與程序一致的加解密算法,修改模糊查詢條件,使用數(shù)據(jù)庫加解密函數(shù)先解密再模糊查找,這樣做的優(yōu)點是實現(xiàn)成本低,開發(fā)使用成本低,只需要將以往的模糊查找稍微修改一下就可以實現(xiàn),但是缺點也很明顯,這樣做無法利用數(shù)據(jù)庫的索引來優(yōu)化查詢,甚至有一些數(shù)據(jù)庫可能無法保證與程序?qū)崿F(xiàn)一致的加解密算法,但是對于常規(guī)的加解密算法都可以保證與應用程序一致。
          如果對查詢性能要求不是特別高、對數(shù)據(jù)安全性要求一般,可以使用常見的加解密算法比如說AES、DES之類的也是一個不錯的選擇。
          如果公司有自己的算法實現(xiàn),并且沒有提供多端的算法實現(xiàn),要么找個算法好的人去研究吃透補全多端實現(xiàn),要么放棄使用這個辦法。

          常規(guī)二

          對密文數(shù)據(jù)進行分詞組合,將分詞組合的結(jié)果集分別進行加密,然后存儲到擴展列,查詢時通過key like '%partial%',這是一個比較劃算的實現(xiàn)方法,我們先來分析一下它的實現(xiàn)思路。
          先對字符進行固定長度的分組,將一個字段拆分為多個,比如說根據(jù)4位英文字符(半角),2個中文字符(全角)為一個檢索條件,舉個例子:
          ningyu1使用4個字符為一組的加密方式,第一組ning ,第二組ingy ,第三組ngyu ,第四組gyu1 … 依次類推。
          如果需要檢索所有包含檢索條件4個字符的數(shù)據(jù)比如:ingy ,加密字符后通過 key like “%partial%” 查庫。
          我們都知道加密后長度會增長,增長的這部分長度存儲就是我們要花費的額外成本,典型的使用成本來換取速度,密文增長的幅度隨著算法不同而不同以DES舉例,13800138000加密前占11個字節(jié),加密后的串HE9T75xNx6c5yLmS5l4r6Q==占24個字節(jié),增長是2.18倍,所以一個優(yōu)秀的算法是多么的重要,能為公司節(jié)省不少成本,但是話又說回來算法工程師的工資也不低,所以我也不知道是節(jié)省成本還是增加成本,哈哈哈…你們自己算吧。
          回到主題,這個方法雖然可以實現(xiàn)加密數(shù)據(jù)的模糊查詢,但是對模糊查詢的字符長度是有要求的,以我上面舉的例子模糊查詢字符原文長度必須大于等于4個英文/數(shù)字,或者2個漢字,再短的長度不建議支持,因為分詞組合會增多從而導致存儲的成本增加,反而安全性降低。
          大家是否都對接過 淘寶、拼多多、JD他們的api,他們對平臺訂單數(shù)據(jù)中的用戶敏感數(shù)據(jù)就是加密的同時支持模糊查詢,使用就是這個方法,下面我整理了幾家電商平臺的密文字段檢索方案的說明,感興趣的可以查看下面鏈接。
          • 淘寶密文字段檢索方案: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
          這個方法優(yōu)點就是實現(xiàn)起來不算復雜,使用起來也較為簡單,算是一個折中的做法,因為會有擴展字段存儲成本會有升高,但是可利用數(shù)據(jù)庫索引優(yōu)化查詢速度,推薦使用這個方法。

          超神做法

          我們接下來看看優(yōu)秀的做法,此類做法難度較高,都是從算法層面來考慮,有些甚至會設計一個新算法,雖然已有一些現(xiàn)成的算法參考,但是大多都是半成品無法拿來直接使用,所以還是要有人去深入研究和整合到自己的應用中去。
          從算法層面思考,甚至會設計一個新算法來支持模糊查找
          這個層面大多是專業(yè)算法工程師的研究領域,想要設計一個有序的、非不可逆的、密文長度不能增長過快的算法不是一件簡單的事情,大致的思路是這樣的,使用譯碼的方式進行加解密,保留密文和原文一樣的順序,從而支持密文模糊匹配,說的比較籠統(tǒng)因為我也不是這方面的專家沒有更深一步的研究過,所以我從網(wǎng)上找了一些資料可以參考一下。
          • 數(shù)據(jù)庫中字符數(shù)據(jù)的模糊匹配加密方法:https://www.jiamisoft.com/blog/6542-zifushujumohupipeijiamifangfa.html
          這里提到的Hill密碼處理和模糊匹配加密方法FMES可以重點看看.
          • 一種基于BloomFilter的改進型加密文本模糊搜索機制研究:http://kzyjc.cnjournals.com/html/2019/1/20190112.htm
          • 支持快速查詢的數(shù)據(jù)庫如何加密:https://www.jiamisoft.com/blog/5961-kuaisuchaxunshujukujiami.html
          • 基于Lucene的云端搜索與密文基礎上的模糊查詢:https://www.cnblogs.com/arthurqin/p/6307153.html
          基于Lucene的思路就跟我們上面介紹的常規(guī)做法二類似,對字符進行等長度分詞,將分詞后的結(jié)果集加密后存儲,只不過存儲的db不一樣,一個是關系型數(shù)據(jù)庫,一個是es搜索引擎。
          • 云存儲中一種支持可驗證的模糊查詢加密方案:http://jeit.ie.ac.cn/fileDZYXXXB/journal/article/dzyxxxb/2017/7/PDF/160971.pdf

          總結(jié)

          我們到這里對加密數(shù)據(jù)的檢索方案全部介紹完了,我們首先提到的是網(wǎng)上搜索隨處可見的沙雕做法,在這里也講了不推薦使用這些沙雕做法,盡量使用常規(guī)做法,如果公司有專業(yè)算法方向人才的話不妨可以考慮基于算法層面的超神做法。
          總的來說從投入、產(chǎn)出比、及實現(xiàn)、使用成本來算的話常規(guī)做法二是非常推薦的。
          來源:ningyu1.github.io/20201230/encrypted-data-fuzzy-query.html

          推薦閱讀:

          世界的真實格局分析,地球人類社會底層運行原理

          不是你需要中臺,而是一名合格的架構(gòu)師(附各大廠中臺建設PPT)

          企業(yè)IT技術架構(gòu)規(guī)劃方案

          論數(shù)字化轉(zhuǎn)型——轉(zhuǎn)什么,如何轉(zhuǎn)?

          華為干部與人才發(fā)展手冊(附PPT)

          企業(yè)10大管理流程圖,數(shù)字化轉(zhuǎn)型從業(yè)者必備!

          【中臺實踐】華為大數(shù)據(jù)中臺架構(gòu)分享.pdf

          華為的數(shù)字化轉(zhuǎn)型方法論

          華為如何實施數(shù)字化轉(zhuǎn)型(附PPT)

          超詳細280頁Docker實戰(zhàn)文檔!開放下載

          華為大數(shù)據(jù)解決方案(PPT)


          瀏覽 11
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <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>
                  亚洲v区| 国产操逼视频。 | 国产在线最新 | 国产黄色电影在线看 | 亚洲AV电影在线 |