大廠面試經驗:如何對加密后的數據進行模糊查詢操作

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

為了數據安全我們在開發過程中經常會對重要的數據進行加密存儲,常見的有:密碼、手機號、電話號碼、詳細地址、銀行卡號、信用卡驗證碼等信息,這些信息對加解密的要求也不一樣,比如說密碼我們需要加密存儲,一般使用的都是不可逆的慢hash算法,慢hash算法可以避免暴力破解(典型的用時間換安全性)

在檢索時我們既不需要解密也不需要模糊查找,直接使用密文完全匹配,但是手機號就不能這樣做,因為手機號我們要查看原信息,并且對手機號還需要支持模糊查找,因此我們今天就針對可逆加解密的數據支持模糊查詢來看看有哪些實現方式。

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

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

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

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

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

沙雕做法

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

沙雕一

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

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

圖片

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

沙雕二

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

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

常規做法

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

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

常規一

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

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

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

常規二

對密文數據進行分詞組合,將分詞組合的結果集分別進行加密,然后存儲到擴展列,查詢時通過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,他們對平臺訂單數據中的用戶敏感數據就是加密的同時支持模糊查詢,使用就是這個方法,下面我整理了幾家電商平臺的密文字段檢索方案的說明,感興趣的可以查看下面鏈接

淘寶密文字段檢索方案: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. 基本上都是一樣的,果然都是互相抄襲,連加密后的數據格式都一致。

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

超神做法

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

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

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

數據庫中字符數據的模糊匹配加密方法:https://www.jiamisoft.com/blog/6542-zifushujumohupipeijiamifangfa.html
這里提到的Hill密碼處理和模糊匹配加密方法FMES可以重點看看.

一種基于BloomFilter的改進型加密文本模糊搜索機制研究:http://kzyjc.cnjournals.com/html/2019/1/20190112.htm
支持快速查詢的數據庫如何加密:https://www.jiamisoft.com/blog/5961-kuaisuchaxunshujukujiami.html
基于Lucene的云端搜索與密文基礎上的模糊查詢:https://www.cnblogs.com/arthurqin/p/6307153.html

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

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

總結

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

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/717283.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/717283.shtml
英文地址,請注明出處:http://en.pswp.cn/news/717283.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

YoloV5改進策略:主干網絡改進|MogaNet——高效的多階門控聚合網絡

文章目錄 摘要論文:《MogaNet——高效的多階門控聚合網絡》1、簡介2、相關工作2.1、視覺Transformers2.2、ViT時代的卷積網絡3、從多階博弈論交互的角度看表示瓶頸4、方法論4.1、MogaNet概述4.2、多階門控聚合4.3、通過通道聚合進行多階特征重新分配4.4、實現細節5、實驗5.1、…

Vue 3 中的 setup 函數是如何工作的?

Vue 3 中的 setup 函數是一個新的組件選項,用于使用組合式 API 定義組件的邏輯。這個函數的引入是為了解決 Vue 2 中隨著組件復雜度的增長,選項式的 API 可能導致代碼難以維護和理解的問題。通過 setup 函數,開發者可以更加靈活地組織和共享代…

Python光速入門 - Flask輕量級框架

FlASK是一個輕量級的WSGI Web應用程序框架,Flask的核心包括Werkzeug工具箱和Jinja2模板引擎,它沒有默認使用的數據庫或窗體驗證工具,這意味著用戶可以根據自己的需求選擇不同的數據庫和驗證工具。Flask的設計理念是保持核心簡單&#xff0c…

布隆過濾器實戰

一、背景 本篇文章以解決實際需求的問題的角度進行切入,探討了如果使用布隆過濾器快速丟棄無效請求,降低了系統的負載以及不必要的流量。 我們都知道布隆過濾器是以占用內存小,同時也能夠實現快速的過濾從而滿足我們的需求,本篇…

Matlab偏微分方程擬合 | 源碼分享 | 視頻教程

專欄導讀 作者簡介:工學博士,高級工程師,專注于工業軟件算法研究本文已收錄于專欄:《復雜函數擬合案例分享》本專欄旨在提供 1.以案例的形式講解各類復雜函數擬合的程序實現方法,并提供所有案例完整源碼;2.…

反編譯代碼格式處理

反編譯代碼格式處理 背景解決方案程序跑之后idea格式化 總結 背景 想看看公司里一個工具的代碼實現,手里只有一個jar包,只能通過jd-gui反編譯代碼。但是呢,源碼是有了,但是看的很難受。 解決方案 /*** 替換 {code searchDir}中…

LeetCode 100231.超過閾值的最少操作數 I

給你一個下標從 0 開始的整數數組 nums 和一個整數 k 。 一次操作中,你可以刪除 nums 中的最小元素。 你需要使數組中的所有元素都大于或等于 k ,請你返回需要的 最少 操作次數。 示例 1: 輸入:nums [2,11,10,1,3], k 10 輸…

Linux課程四課---Linux開發環境的使用(自動化構建工具-make/Makefile的相關)

作者前言 🎂 ??????🍧🍧🍧🍧🍧🍧🍧🎂 ?🎂 作者介紹: 🎂🎂 🎂 🎉🎉&#x1f389…

用Java語言創建的Spring Boot項目中,如何傳遞數組呢??

問題: 用Java語言創建的Spring Boot項目中,如何傳遞數組呢?? 在這個思路中,其實,Java作為一個后端開發的語言,沒必要著重于如何傳入,我們主要做的便是對傳入的數組數據進行處理即可…

解決虛擬機啟動報錯:“End kernel panic - not syncing: attempted to kill the idle task”

原本能正常運行的虛擬機,很長一段時間沒用后,今天再次啟動,然后就出現下面的問題: 然后走了一些彎路,比如說刪除該虛擬機然后新建一個虛擬機(問題未解決)、直接刪除VitualBox重新安裝&#xff0…

感染了后綴為.faust勒索病毒如何應對?數據能夠恢復嗎?

導言: 在網絡安全領域,.faust勒索病毒是近期備受關注的一種惡意軟件。這種病毒采用高度復雜的加密算法,將受感染計算機上的文件全部加密,并要求受害者支付贖金以獲取解密密鑰。.faust勒索病毒的攻擊方式通常是通過電子郵件附件、…

快遞平臺獨立版小程序源碼|帶cps推廣營銷流量主+前端

源碼介紹: 快遞代發快遞代寄寄件小程序可以對接易達云洋一級總代 快遞小程序,接入云洋/易達物流接口,支持選擇快遞公司,三通一達,極兔,德邦等,功能成熟 如何收益: 1.對接第三方平臺成本大約4元…

Python基本數據類型介紹

Python 解釋 Python是一種高級編程語言,以其簡潔、易讀和易用而聞名。它是一種通用的、解釋型的編程語言,適用于廣泛的應用領域,包括軟件開發、數據分析、人工智能等。python是一種解釋型,面向對象、動態數據類型的高級程序設計…

00X集——vba獲取CAD圖中圖元類名objectname

在CAD中,通過快捷鍵PL(即POLYLINE命令)繪制的線屬于AcDbPolyline。AcDbPolyline也被稱為LWPOLYLINE,即簡單Polyline,它所包含的對象在本身內部。 此外,CAD中還有另一種二維多段線對象,稱為AcDb2…

ViewModel 原理

在現代Android應用開發中,ViewModel是架構組件庫的一個關鍵部分,它在提高應用的穩定性和性能方面發揮著重要作用。在這篇文章中,我們將深入探討ViewModel的工作原理和最佳實踐。 ViewModel簡介 ViewModel是Android Jetpack架構組件的一部分…

ubuntu安裝Avahi發現服務工具

一、簡介 解決設置固定ip后無法連接外網的問題,目前采用動態獲取ip,可以不用設置設備的固定IP,直接可以通過域名來訪問設備,類似樹莓派的連接調試 二、安裝 本文使用的是ubuntu23.10.1上安裝 1.安裝工具 sudo apt install av…

2.模擬問題——4.日期問題

日期問題難度并不大,但是代碼量非常大,需要較高的熟練度,因此需要著重練習,主要涉及數組和循環兩個方面的知識點,需要熟練的測試代碼。 兩個經典題型 閏年 閏年滿足以下兩個條件的任意一個 能夠被400整除不能夠被1…

MyBatis攔截器實現打印完整SQL語句

我們在執行語句的時候會使用Mybatis自帶的日志打印工具,但是打印的時候參數會用?代替,顯得看起來不是那么直觀,所以通過實現了InnerInterceptor接口,并重寫了beforeQuery和beforeUpdate方法。在這兩個方法中,它會獲取…

【Acwing】差分矩陣

圖1&#xff1a;a和b數組映射表 由于a是b的前綴和數組&#xff0c;因此改變b[ x1][ y1]之后&#xff0c;受到影響的a中元素如右半圖所示 圖2&#xff1a;求b數組的前綴和 #include<bits/stdc.h> using namespace std;int n,m,q; int a[1010][1010]; int b[1010][1010]…

work 3/1

1>機械臂 #include <head.h> #define SER_POTR 8899 #define SER_IP "192.168.125.223" int main(int argc, const char *argv[]) {//創建套接字int cfdsocket(AF_INET,SOCK_STREAM,0);if(cfd-1){perror("");return -1;}//鏈接struct sockaddr_i…