整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

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

          密后的數據對模糊查詢不是很友好,本篇就針對加密數據模糊查詢這個問題來展開講一講實現的思路。

          為了數據安全我們在開發過程中經常會對重要的數據進行加密存儲,常見的有:密碼、手機號、電話號碼、詳細地址、銀行卡號、信用卡驗證碼等信息,這些信息對加解密的要求也不一樣,比如說密碼我們需要加密存儲,一般使用的都是不可逆的慢hash算法,慢hash算法可以避免暴力破解(典型的用時間換安全性),在檢索時我們既不需要解密也不需要模糊查找,直接使用密文完全匹配,但是手機號就不能這樣做,因為手機號我們要查看原信息,并且對手機號還需要支持模糊查找,因此我們今天就針對可逆加解密的數據支持模糊查詢來看看有哪些實現方式。

          在網上隨便搜索了一下,關于《加密后的模糊查詢》 的帖子很多,順便整理了一下實現的方法,不得不說很多都是不靠譜的做法,甚至有一些沙雕做法,接下來我們就對這些做法來講講實現思路和優劣性。

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

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

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

          我們就對這三種實現方法一一來講講實現思路和優劣性,首先我們先看沙雕做法。

          沙雕做法

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

          沙雕一

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

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

          條數

          Bytes

          MB

          100w

          2400萬

          22.89

          1000w

          2.4億

          228.89

          1億

          24億

          2288.89

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

          沙雕二

          我們再來看第二個做法,將密文數據映射一份明文映射表,然后模糊查詢映射表來關聯密文數據,what???!!!那我們為什么要對數據加密呢,直接不加密不是更好么!

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

          常規做法

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

          • 在數據庫實現加密算法函數,在模糊查詢的時候使用decode(key) like '%partial%
          • 對密文數據進行分詞組合,將分詞組合的結果集分別進行加密,然后存儲到擴展列,查詢時通過key like '%partial%'

          常規一

          在數據庫中實現與程序一致的加解密算法,修改模糊查詢條件,使用數據庫加解密函數先解密再模糊查找,這樣做的優點是實現成本低,開發使用成本低,只需要將以往的模糊查找稍微修改一下就可以實現,但是缺點也很明顯,這樣做無法利用數據庫的索引來優化查詢,甚至有一些數據庫可能無法保證與程序實現一致的加解密算法,但是對于常規的加解密算法都可以保證與應用程序一致。

          如果對查詢性能要求不是特別高、對數據安全性要求一般,可以使用常見的加解密算法比如說AESDES之類的也是一個不錯的選擇。

          如果公司有自己的算法實現,并且沒有提供多端的算法實現,要么找個算法好的人去研究吃透補全多端實現,要么放棄使用這個辦法。

          常規二

          對密文數據進行分詞組合,將分詞組合的結果集分別進行加密,然后存儲到擴展列,查詢時通過key like '%partial%',這是一個比較劃算的實現方法,我們先來分析一下它的實現思路。

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

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

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

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

          回到主題,這個方法雖然可以實現加密數據的模糊查詢,但是對模糊查詢的字符長度是有要求的,以我上面舉的例子模糊查詢字符原文長度必須大于等于4個英文/數字,或者2個漢字,再短的長度不建議支持,因為分詞組合會增多從而導致存儲的成本增加,反而安全性降低。

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

          • 淘寶密文字段檢索方案
          • 阿里巴巴文字段檢索方案
          • 拼多多密文字段檢索方案
          • 京東密文字段檢索方案

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

          這個方法優點就是實現起來不算復雜,使用起來也較為簡單,算是一個折中的做法,因為會有擴展字段存儲成本會有升高,但是可利用數據庫索引優化查詢速度,推薦使用這個方法。

          超神做法

          我們接下來看看優秀的做法,此類做法難度較高,都是從算法層面來考慮,有些甚至會設計一個新算法,雖然已有一些現成的算法參考,但是大多都是半成品無法拿來直接使用,所以還是要有人去深入研究和整合到自己的應用中去。

          • 從算法層面思考,甚至會設計一個新算法來支持模糊查找

          這個層面大多是專業算法工程師的研究領域,想要設計一個有序的、非不可逆的、密文長度不能增長過快的算法不是一件簡單的事情,大致的思路是這樣的,使用譯碼的方式進行加解密,保留密文和原文一樣的順序,從而支持密文模糊匹配,說的比較籠統因為我也不是這方面的專家沒有更深一步的研究過,所以我從網上找了一些資料可以參考一下。

          • 數據庫中字符數據的模糊匹配加密方法

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

          • 一種基于BloomFilter的改進型加密文本模糊搜索機制研究
          • 支持快速查詢的數據庫如何加密
          • 基于Lucene的云端搜索與密文基礎上的模糊查詢

          基于Lucene的思路就跟我們上面介紹的常規做法二類似,對字符進行等長度分詞,將分詞后的結果集加密后存儲,只不過存儲的db不一樣,一個是關系型數據庫,一個是es搜索引擎。

          • 云存儲中一種支持可驗證的模糊查詢加密方案

          總結

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

          總的來說從投入、產出比、及實現、使用成本來算的話常規做法二是非常推薦的。

          source: //ningyu1.github.io/20201230/encrypted-data-fuzzy-query.html

          為57個挑戰中,第56個題目,就是需要做一些模糊查詢,早上特意學習下了網上相關的知識,這里做一下記錄。

          1. 業界模糊查詢用什么工具?用什么工具可能更合適?

          https://juejin.cn/post/6917619459087663118

          上面這篇文章的搜索度還挺高的,簡單的來說,如果用關系型數據庫做搜索,一般要用 sql "select from * where '%*‘ like 的語句,這種語句最大的問題是限制很大.----如果MySQL模糊查詢將%寫在左側,這樣會導致索引失效.

          但很多場景,需要搜索字符串中間的某幾個,(比如電商搜索,只記得中間幾個字)。如果還采用傳統Mysql 這種搜索引擎,因為索引失效導致全表掃描,搜索效率大大降低了。

          比如下面的兩段代碼,第二段代碼會導致全表掃描。

          select * from emp where age > 15 and user_name like "張%" limit 100;
          select * from emp where age > 15 and user_name like "%朔%" limit 100;


          fulltext 索引也要89秒,業務是沒法接受的。這個時候用Elastic search 搜索的效率就好很多,同樣的場景,只需要400毫秒即可滿足。


          mysql 和 elastic search的使用場景對比

          結論是,查詢場景,且對延時要求高的,毫無疑問建議選擇elastic search.

          2.那么Elastic search 是個怎么樣的神奇盒子呢?可以參考這篇文章:

          https://juejin.cn/post/7011433590491725838

          Elasticsearch是一個基于Lucene的搜索服務器。它提供了一個分布式多用戶能力的全文搜索引擎,基于RESTful web接口。

          什么是lucene?

          Lucene是一個開放源代碼的全文檢索引擎工具包。其實就是一個(多個)jar包,我們可以將其引入到自己的java項目中來實現全文檢索,而ElasticSearch就是基于Lucene開發而來的搜索引擎。

          拿ES 和 mysql 做對比,es 里面的document 相當于mysql的table, 而document 相當于row, field 相當于column;

          而es 中間支持shard的概念,可以把一個表(index)拆到不同的分片(shard),不同分片放到不同的節點,并通過replicaset 來做冗余保護。




          3.關于python 如何使用 ES :

          參考這篇文章:

          https://elasticsearch-py.readthedocs.io/en/7.x/

          這里講了幾個概念,支持異步,支持復雜查詢,支持ssl 模式交互等。

          1. es 支持異步方式做交互,為了提高查詢效率。

          https://elasticsearch-py.readthedocs.io/en/7.x/async.html

          2.支持復雜查詢DSL ,需要調用單獨的接口:

          https://elasticsearch-dsl.readthedocs.io/en/latest/

          簡單接口模式如下圖:7.0 版本



          先寫這么多,改天正式測試下。

          、ES5中數組操作方法:filter() 過濾數組也是一個常用的操作,它用于遍歷Array把某些元素過濾掉,然后把剩余的元素組成一個新數組返回(不改變原數組)。

          例如:過濾奇數,保留偶數:

          var arr = [1, 2, 3, 4, 5, 6];
          var brr = arr.filter(function (value) {
              return value%2 == 0;  //遍歷數組,返回值為true保留并復制到新數組,false則過濾掉
          });
          console.log(brr);  //[2, 4, 6]

          二、ES6中 includes( ) 方法:用來判斷一個 數組/字符串 是否包含一個指定的值,如果是返回 true,不是返回false。

          var arr = [1, 2, 3];
          var str = 'abcd';
          console.log(arr.includes(2));//true
          console.log(arr.includes(4));//false
          console.log(str.includes('a'));//true
          console.log(str.includes('e'));//false

          簡單實現模糊查找:

          首先引入vue.js文件:

          <script src="js/vue.js" type="text/javascript" charset="utf-8"></script>

          html代碼:

          <div id="box">
              <input type="text" v-model="keyword"/>
              <ul>
                  <li v-for="value in fSearch">
                      <p>{{value}}</p>
                  </li>
              </ul>
          </div>

          js代碼:


          主站蜘蛛池模板: 人妻夜夜爽天天爽爽一区| 久久99精品免费一区二区| 亚洲欧美日韩一区二区三区在线 | 国产欧美一区二区精品仙草咪| 精品一区二区三区波多野结衣| 亚洲日本乱码一区二区在线二产线 | 中文人妻av高清一区二区| 搡老熟女老女人一区二区| 亚洲熟妇AV一区二区三区浪潮| 国产在线一区二区三区在线| 国产一区在线视频| 亚洲一区在线观看视频| 国产免费私拍一区二区三区| 日本精品高清一区二区| 亚洲AV无码一区二区三区性色 | 亚洲av一综合av一区| 亚洲a∨无码一区二区| 亚洲av高清在线观看一区二区| 国产福利精品一区二区| 精品国产一区二区三区AV| 97久久精品午夜一区二区| 亚洲第一区二区快射影院| 夜夜爽一区二区三区精品| 亚洲综合无码一区二区| 免费视频精品一区二区| 亚州日本乱码一区二区三区| 波多野结衣一区在线观看| 久久久精品人妻一区二区三区蜜桃| 在线观看一区二区精品视频| 国产午夜精品一区理论片飘花| 久久精品成人一区二区三区| 好看的电影网站亚洲一区| 日韩美女视频一区| 亚洲视频一区二区三区| 亚洲日韩精品一区二区三区无码| 精品国产日韩亚洲一区91| 极品人妻少妇一区二区三区| 久久久久国产一区二区三区| 成人久久精品一区二区三区| 91福利一区二区| 日韩亚洲一区二区三区|