91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

數據庫加密字段進行模糊查詢怎么實現

發布時間:2022-09-05 11:30:22 來源:億速云 閱讀:351 作者:iii 欄目:開發技術

這篇“數據庫加密字段進行模糊查詢怎么實現”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“數據庫加密字段進行模糊查詢怎么實現”文章吧。

需求

對于一些敏感字段,比如手機號碼、身份證、地址、銀行卡號等,我們在存放進數據庫前,可能需要對其進行加密。

大部分情況下,我們只需要支持等值查詢。但是如果需要支持模糊查詢,那么整段內容整體加密就不具備這個能力。

下面是幾種解決辦法,場景是我們需要根據手機號碼的前綴進行匹配。

服務器端解密

因為服務器肯定是具備解密密文的能力的,因此最簡單的方式就是把整個表的密文字段數據拉下來,在服務器端進行解密,然后再在服務器端進行匹配。

findRecords(prefix)  {
    records = getAllRecords()
    finds = []
    for (record : records) {
        phone = decrypt(record.phone)
        if (phone.hasPrefix(prefix)) {
            finds.push(record)
        }
    }
    return finds
}

如果數據量很小,那么這種做法也許還能夠接受。但是只要數據量上去,那么效率就會很低,而且還需要通過網絡IO把整個表的數據傳輸到服務器端。

數據庫端解密

上面的做法需要把整個表的數據傳輸到服務器端,那么我們只需要能夠在數據庫進行匹配,就不需要傳輸整個表了。因此我們也可以在數據庫實現解密算法,在匹配的時候用解密算法解密密文,就能夠進行模糊匹配了。

findRecords(prefix) {
    return query("select * from table where decrypt(phone) like '?%'", prefix)
}

這個做法也是需要遍歷整個數據庫,因此只適合數據量比較小的情況下;而且需要把密鑰傳給數據庫,增加了密鑰泄露的風險。

字符串分片

上面的做法我們都沒有用到數據庫的索引能力,正常情況下,前綴匹配我們是可以使用到索引的,比如where phone like 'prefix%'。如果加密后的密文,也能夠走索引,那么我們就不需要遍歷整個數據表了。

比如我們可以根據4位作為一個檢索條件,將手機號碼拆分位多個分片:比如手機號012345678901,我們可以拆分并對分片進行加密:

分片密文
0123/egpaR5G9sMQUUWWz+3CLg
1234eHCMZqxNSLx/B37koArx/w
23459w1Pv8ik2H41s1KORLfPHA
3456vcFFFvi0mwAgIjdSQjcmSw
4567Tr/WaYfVySyMJhcZ78RFlA
56782wFeC6sgdXX7wmo0YcYY/Q
6789FfO9qD9XPx/lnJJuTfTfaA
7890Wufth7zOBLEy2LmepG5Taw
89011xR5MHRmlqOac5X6Cmn3kA

這些密文拼接起來的串為:

/egpaR5G9sMQUUWWz+3CLgeHCMZqxNSLx/B37koArx/w9w1Pv8ik2H41s1KORLfPHAvcFFFvi0mwAgIjdSQjcmSwTr/WaYfVySyMJhcZ78RFlA2wFeC6sgdXX7wmo0YcYY/QFfO9qD9XPx/lnJJuTfTfaAWufth7zOBLEy2LmepG5Taw1xR5MHRmlqOac5X6Cmn3kA

然后就可以支持前綴查詢了(最少4位),比如前綴01234,我們可以按照上面的分片方式先分片,再拼接為查詢串:

分片密文
0123/egpaR5G9sMQUUWWz+3CLg
1234eHCMZqxNSLx/B37koArx/w

查詢串:

/egpaR5G9sMQUUWWz+3CLgeHCMZqxNSLx/B37koArx/w

可以看到查詢串為上面的前綴,因此可以進行前綴查詢!

代價

這種方式也是會有一定的代價的:

密文長度較長

比如手機號碼是明文長度是11,但是按照4位分片的密文長度是198

分片長度不能太短

分片太短有安全問題,因此沒辦法支持過短的查詢。

主要是因為切片過短,會很容易被猜出來每一位對應的密文。比如0-9的密文切片長度1切分:

分片密文
0hHjJXA0e+haw/+WZ1mFITA
1y7qHn2nn3Ne/6wNRiwl/Lg
2h0dmfkO5SUolFFLp8J2Y5A
3ma/XrJjPv2MXSXE7Y4xs8w
4Q9V4PXXPjJgdR7UChUMY1g
5Wo57z24UXLoBdQ7QzxlOqA
6fC+zrF4ga5TCb5Zu36KVrQ
7z+XqHaWmlAsCnIP6NnD3lg
8olm8cPYmLHCeD1jegauiWw
9hJS77tLMd2Ol5SU4dIbbpw

只有10種分片類型,如果對應的是手機號碼字段,很容易根據統計每個數字的概率分布猜出每個數字對應的密文。

可能有多余結果

可能有兩個不同分片對應相同密文,這時候就需要在服務器再過濾一遍。

以上就是關于“數據庫加密字段進行模糊查詢怎么實現”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

中宁县| 滦平县| 杨浦区| 永清县| 石柱| 石嘴山市| 肇庆市| 辉县市| 阳信县| 中阳县| 兴文县| 甘南县| 焦作市| 绥江县| 冀州市| 秭归县| 修文县| 丰宁| 绥化市| 仁化县| 特克斯县| 长泰县| 景洪市| 昭苏县| 海安县| 顺昌县| 原阳县| 苏州市| 土默特右旗| 西乌| 古浪县| 松潘县| 苍溪县| 长垣县| 建平县| 宁晋县| 措勤县| 曲阜市| 神池县| 临桂县| 昌吉市|