我們知道加密后的數(shù)據(jù)對模糊查詢不是很友好,本篇就針對加密數(shù)據(jù)模糊查詢這個(gè)問題來展開講一講實(shí)現(xiàn)的思路,希望對大家有所啟發(fā)。
為了數(shù)據(jù)安全我們在開發(fā)過程中經(jīng)常會對重要的數(shù)據(jù)進(jìn)行加密存儲,常見的有:密碼、手機(jī)號、電話號碼、詳細(xì)地址、銀行卡號、信用卡驗(yàn)證碼等信息,這些信息對加解密的要求也不一樣,比如說密碼我們需要加密存儲,一般使用的都是不可逆的慢hash算法,慢hash算法可以避免暴力破解(典型的用時(shí)間換安全性)。
在檢索時(shí)我們既不需要解密也不需要模糊查找,直接使用密文完全匹配,但是手機(jī)號就不能這樣做,因?yàn)槭謾C(jī)號我們要查看原信息,并且對手機(jī)號還需要支持模糊查找,因此我們今天就針對可逆加解密的數(shù)據(jù)支持模糊查詢來看看有哪些實(shí)現(xiàn)方式。
在網(wǎng)上隨便搜索了一下,關(guān)于《加密后的模糊查詢》 的帖子很多,順便整理了一下實(shí)現(xiàn)的方法,不得不說很多都是不靠譜的做法,甚至有一些沙雕做法,接下來我們就對這些做法來講講實(shí)現(xiàn)思路和優(yōu)劣性。
如何對加密后的數(shù)據(jù)進(jìn)行模糊查詢
我整理了一下對加密的數(shù)據(jù)模糊查詢大致分為三類做法,如下所示:
- 沙雕做法(不動腦思考直男的思路,只管實(shí)現(xiàn)功能從不深入思考問題)
- 常規(guī)做法(思考了查詢性能問題,也會使用一些存儲空間換性能等做法)
- 超神做法(比較高端的做法從算法層面上思考)
我們就對這三種實(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)烈不建議了。
沙雕二
我們再來看第二個(gè)做法,將密文數(shù)據(jù)映射一份明文映射表,然后模糊查詢映射表來關(guān)聯(lián)密文數(shù)據(jù),what????。?!那我們?yōu)槭裁匆獙?shù)據(jù)加密呢,直接不加密不是更好么!
我們既然對數(shù)據(jù)加密肯定是有安全訴求才會這樣做,增加一個(gè)明文的映射表就違背了安全訴求,這樣做既不安全也不方便完全是脫褲子放x,多此一舉,強(qiáng)且不推薦。
常規(guī)做法
我們接下來看看常規(guī)的做法,也是最廣泛使用的方法,此類方法及滿足的數(shù)據(jù)安全性,又對查詢友好。
-
在數(shù)據(jù)庫實(shí)現(xiàn)加密算法函數(shù),在模糊查詢的時(shí)候使用
decode(key) like '%partial%
-
對密文數(shù)據(jù)進(jìn)行分詞組合,將分詞組合的結(jié)果集分別進(jìn)行加密,然后存儲到擴(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)一致的加解密算法,但是對于常規(guī)的加解密算法都可以保證與應(yīng)用程序一致。
如果對查詢性能要求不是特別高、對數(shù)據(jù)安全性要求一般,可以使用常見的加解密算法比如說AES、DES之類的也是一個(gè)不錯的選擇。
如果公司有自己的算法實(shí)現(xiàn),并且沒有提供多端的算法實(shí)現(xiàn),要么找個(gè)算法好的人去研究吃透補(bǔ)全多端實(shí)現(xiàn),要么放棄使用這個(gè)辦法。
常規(guī)二
對密文數(shù)據(jù)進(jìn)行分詞組合,將分詞組合的結(jié)果集分別進(jìn)行加密,然后存儲到擴(kuò)展列,查詢時(shí)通過key like '%partial%',這是一個(gè)比較劃算的實(shí)現(xiàn)方法,我們先來分析一下它的實(shí)現(xiàn)思路。
先對字符進(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%”
查庫。
我們都知道加密后長度會增長,增長的這部分長度存儲就是我們要花費(fèi)的額外成本,典型的使用成本來換取速度,密文增長的幅度隨著算法不同而不同以DES舉例,13800138000
加密前占11個(gè)字節(jié),加密后的串HE9T75xNx6c5yLmS5l4r6Q==
占24個(gè)字節(jié),增長是2.18倍,所以一個(gè)優(yōu)秀的算法是多么的重要,能為公司節(jié)省不少成本,但是話又說回來算法工程師的工資也不低,所以我也不知道是節(jié)省成本還是增加成本,哈哈哈…你們自己算吧。
回到主題,這個(gè)方法雖然可以實(shí)現(xiàn)加密數(shù)據(jù)的模糊查詢,但是對模糊查詢的字符長度是有要求的,以我上面舉的例子模糊查詢字符原文長度必須大于等于4個(gè)英文/數(shù)字,或者2個(gè)漢字,再短的長度不建議支持,因?yàn)榉衷~組合會增多從而導(dǎo)致存儲的成本增加,反而安全性降低。
大家是否都對接過 淘寶、拼多多、JD他們的api,他們對平臺訂單數(shù)據(jù)中的用戶敏感數(shù)據(jù)就是加密的同時(shí)支持模糊查詢,使用就是這個(gè)方法,下面我整理了幾家電商平臺的密文字段檢索方案的說明,感興趣的可以查看下面鏈接。
-
淘寶密文字段檢索方案: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)闀袛U(kuò)展字段存儲成本會有升高,但是可利用數(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ī)做法二類似,對字符進(jìn)行等長度分詞,將分詞后的結(jié)果集加密后存儲,只不過存儲的db不一樣,一個(gè)是關(guān)系型數(shù)據(jù)庫,一個(gè)是es搜索引擎。
- 云存儲中一種支持可驗(yàn)證的模糊查詢加密方案:http://jeit.ie.ac.cn/fileDZYXXXB/journal/article/dzyxxxb/2017/7/PDF/160971.pdf
總結(jié)
我們到這里對加密數(shù)據(jù)的檢索方案全部介紹完了,我們首先提到的是網(wǎng)上搜索隨處可見的沙雕做法,在這里也講了不推薦使用這些沙雕做法,盡量使用常規(guī)做法,如果公司有專業(yè)算法方向人才的話不妨可以考慮基于算法層面的超神做法。
總的來說從投入、產(chǎn)出比、及實(shí)現(xiàn)、使用成本來算的話常規(guī)做法二是非常推薦的。
審核編輯 :李倩
-
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
7239瀏覽量
90976 -
算法
+關(guān)注
關(guān)注
23文章
4697瀏覽量
94703 -
加密
+關(guān)注
關(guān)注
0文章
317瀏覽量
24295
原文標(biāo)題:被問懵了,加密后的數(shù)據(jù)如何進(jìn)行模糊查詢?
文章出處:【微信號:AndroidPush,微信公眾號:Android編程精選】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
如何在MBDT中使用S32k344進(jìn)行加密?
在STM32微控制器中實(shí)現(xiàn)數(shù)據(jù)加密的方法
EMMC數(shù)據(jù)加密技術(shù)與應(yīng)用
數(shù)據(jù)庫加密辦法
淺談加密芯片的一種破解方法和對應(yīng)加密方案改進(jìn)設(shè)計(jì)
加密算法在云計(jì)算中如何應(yīng)用?
恒訊科技分析:云服務(wù)器數(shù)據(jù)加密具體是如何操作的?
aes加密的常見錯誤及解決方案
socket 加密通信的實(shí)現(xiàn)方式
云存儲服務(wù)中的數(shù)據(jù)加密技術(shù)
云安全服務(wù)加密存儲代碼怎么查
ClickHouse內(nèi)幕(3)基于索引的查詢優(yōu)化

評論