日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

MySql加密存储的数据,如何模糊搜索?

發(fā)布時(shí)間:2023/12/29 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySql加密存储的数据,如何模糊搜索? 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

背景

蔚來(lái)被勒索 225 萬(wàn)美元,大量數(shù)據(jù)遭泄露!

根據(jù)網(wǎng)絡(luò)上流傳的截圖顯示,黑客似乎掌握著蔚來(lái)內(nèi)部員工數(shù)據(jù) 22800 條、車主用戶身份證數(shù)據(jù) 399000 條、用戶地址數(shù)據(jù) 6500000 條、注冊(cè)用戶數(shù)據(jù) 4850000 條、企業(yè)及企業(yè)代表聯(lián)系人數(shù)據(jù) 10000 條、訂單數(shù)據(jù) 490000 條、退單數(shù)據(jù) 90000 條,出售的金額以 0.1-0.25 比特幣不等。

蔚來(lái)公司和蔚來(lái)創(chuàng)始人李斌也都出來(lái)道歉,并承諾對(duì)因本次事件給用戶造成的損失承擔(dān)責(zé)任。

數(shù)據(jù)安全

現(xiàn)在企業(yè)都已經(jīng)數(shù)字化辦公了,在提升效率的同時(shí),數(shù)據(jù)安全也是重中之重,很多公司為了追求效率,卻忽略安全這方面的工作。從上面的報(bào)告看,蔚來(lái)這次泄露的數(shù)據(jù)包含:用戶身份證、地址,這些數(shù)據(jù)保密級(jí)別都是最高的,在數(shù)據(jù)庫(kù)存儲(chǔ)也應(yīng)該要加密存儲(chǔ)。

而加密存儲(chǔ)就涉及以下幾個(gè)問(wèn)題:

1、加密存儲(chǔ)的方式;

2、加密存儲(chǔ)后,數(shù)據(jù)如何展示;

3、加密存儲(chǔ)如何模糊搜索。

今天就給大家分享下,MySql數(shù)據(jù)加密的解決方案、以及如何解決以上的問(wèn)題。

Mysql加密方案

Mysql本身自帶的加密方法,分為2種:

1、不可逆加密算法:

PASSWORD,ENCRYPT,MD5,SHA。

2、可逆的加密算法:

AES_ENCRYPT、AES_DECRYPT 和 ENCODE、DECODE。

以上兩組分別為可逆的加解密函數(shù),都是返回一個(gè)二進(jìn)制字符串,要以BLOB類型存儲(chǔ)。不過(guò)ENCODE與DECODE,在MySql 5.7后已經(jīng)取消,并且安全性比較低,建議不要采用。

在項(xiàng)目開(kāi)發(fā)中,比如密碼等少量的數(shù)據(jù),不涉及顯示和搜索的業(yè)務(wù)需求,可以采用不可逆加密,但大部分?jǐn)?shù)據(jù),我們還是需要采用可逆的加密方式。

Mysql 加密存儲(chǔ)

下面我們以AES_ENCRYPT、AES_DECRYPT 為例子,來(lái)介紹下如何解決,數(shù)據(jù)加密存儲(chǔ)與查詢。

1、創(chuàng)建表

首先先創(chuàng)建一張表,只有一個(gè)字段data,用來(lái)存儲(chǔ)解密后的數(shù)據(jù),sql語(yǔ)句如下:

CREATE TABLE `tab_aes` (`data` VARCHAR(250) NULL DEFAULT NULL COLLATE 'utf8_general_ci')COMMENT='數(shù)據(jù)加密存儲(chǔ)表'COLLATE='utf8_general_ci'ENGINE=InnoDB;

2、插入數(shù)據(jù)

通過(guò)Sql語(yǔ)句插入加密的數(shù)據(jù),1ql語(yǔ)句如下:

INSERT INTO tab_aes VALUES( TO_BASE64( AES_ENCRYPT('要加密的內(nèi)容','秘鑰') ) );

TO_BASE64函數(shù)把加密的二進(jìn)制轉(zhuǎn)換為Base64,方便我們查看。

插入的結(jié)果如下:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-8cydETQM-1671712236301)(https://mmbiz.qpic.cn/sz_mmbiz_png/tJJDa2wmJiapJMlo01Tr0vjlrj8G49MZHrtkCQ0YJNicvPBPZqQqU6whxA1r1UWjZoeXVZ2I9knWNvXeyHxJSVdQ/640?wx_fmt=png)]

3、查詢返回解密數(shù)據(jù)

SELECT CAST( AES_DECRYPT( FROM_BASE64(tab_aes.data), '秘鑰') AS CHAR CHARACTER SET utf8 ) FROM tab_aes

解密后,要用CAST把字符串編碼轉(zhuǎn)為UTF8,否則返回是亂碼。

模糊搜索

數(shù)據(jù)加密存儲(chǔ)與解密數(shù)據(jù),這些都沒(méi)有太大問(wèn)題,加密存儲(chǔ)產(chǎn)生最大的問(wèn)題,就是模糊搜索,關(guān)于模糊搜索有以下方案:

1、數(shù)據(jù)預(yù)加載至內(nèi)存數(shù)據(jù)庫(kù)

此方案是程序啟動(dòng)的時(shí)候,預(yù)先把數(shù)據(jù)庫(kù)的數(shù)據(jù)解密,并加載至內(nèi)存中,比如采用MongoDB,此方案存在的優(yōu)缺點(diǎn)如下:

優(yōu)點(diǎn):

數(shù)據(jù)安全,查詢性能速度快

缺點(diǎn):

服務(wù)器占用內(nèi)存大;

數(shù)據(jù)表無(wú)法關(guān)聯(lián)查詢;

內(nèi)存數(shù)據(jù)與數(shù)據(jù)庫(kù)要實(shí)時(shí)保存一致,需要額外工作量。

2、程序?qū)崟r(shí)加載數(shù)據(jù),并解密處理

此方案是,用戶觸發(fā)請(qǐng)求的時(shí)候,程序?qū)崟r(shí)加載并解密,保存至內(nèi)存,雖然此方案解決了與數(shù)據(jù)庫(kù)同步的問(wèn)題,但也存在其他問(wèn)題,此方案優(yōu)缺點(diǎn)如下:

優(yōu)點(diǎn):

數(shù)據(jù)安全,查詢性能速度快、數(shù)據(jù)處理靈活。

缺點(diǎn):

服務(wù)器內(nèi)存不可控,瞬間內(nèi)存容易飆升,可能導(dǎo)致服務(wù)器不穩(wěn)定;

數(shù)據(jù)表無(wú)法關(guān)聯(lián)查詢。

3、在Sql語(yǔ)句處理模糊搜索

如果數(shù)據(jù)量比較少,以上兩種方案可能不會(huì)產(chǎn)生太大的影響,但對(duì)于大多數(shù)項(xiàng)目以上兩種方案還是不靠譜的。

在Sql語(yǔ)句處理模糊搜索,也有以下幾種方案:

3.1、實(shí)時(shí)解密搜索

直接在數(shù)據(jù)庫(kù)端,把加密的數(shù)據(jù)解密。

SELECT CAST( AES_DECRYPT( FROM_BASE64(tab_aes.data), '秘鑰') AS CHAR CHARACTER SET UTF8 ) FROM tab_aes WHERE CAST( AES_DECRYPT( FROM_BASE64(tab_aes.data), '秘鑰') AS CHAR CHARACTER SET UTF8 ) LIKE '要加密%'

優(yōu)點(diǎn)

搜索靈活

缺點(diǎn):

無(wú)法利用索引,搜索性能慢;

數(shù)據(jù)需要先解密,導(dǎo)致性能慢。

3.2、字段冗余存儲(chǔ)

我們都知道MySql模糊搜索,只有當(dāng)匹配開(kāi)頭、或者匹配結(jié)尾的時(shí)候,索引才會(huì)生效。所以我們可以擴(kuò)展一個(gè)字段,用來(lái)存儲(chǔ)開(kāi)頭和結(jié)尾加密后的數(shù)據(jù)。

創(chuàng)建表sql語(yǔ)句如下,新增一個(gè)字段data_ext,并建立索引:

CREATE TABLE `tab_aes` ( `data` VARCHAR(250) NULL DEFAULT NULL COLLATE 'utf8_general_ci', `data_ext` VARCHAR(250) NULL DEFAULT NULL COLLATE 'utf8_general_ci', INDEX `data_ext` (`data_ext`) USING BTREE ) COMMENT='數(shù)據(jù)加密存儲(chǔ)表' COLLATE='utf8_general_ci' ENGINE=InnoDB ;

比如,要加密的內(nèi)容為:123456789,字段data_ext取字段data,開(kāi)頭和結(jié)尾3個(gè)字符存儲(chǔ),儲(chǔ)存格式為:AES(123) , AES(789),插入數(shù)據(jù)的sql語(yǔ)句如下:

INSERT INTO tab_aes VALUES( TO_BASE64( AES_ENCRYPT('要加密的內(nèi)容','秘鑰')), CONCAT(TO_BASE64( AES_ENCRYPT('要加密','秘鑰')), ',', TO_BASE64( AES_ENCRYPT('內(nèi)容','秘鑰'))) );

存儲(chǔ)結(jié)果如下:

相應(yīng)的模糊搜索sql語(yǔ)句如下:

SELECT CAST( AES_DECRYPT( FROM_BASE64(tab_aes.data), '秘鑰') AS CHAR CHARACTER SET UTF8 ) FROM tab_aesWHEREtab_aes.data_ext LIKE CONCAT(TO_BASE64(AES_ENCRYPT(('要加密'),'秘鑰')),'%')AND tab_aes.data_ext LIKE CONCAT('%',TO_BASE64(AES_ENCRYPT(('內(nèi)容'),'秘鑰')))AND tab_aes.data_ext LIKE CONCAT(TO_BASE64(AES_ENCRYPT(('要加密'),'秘鑰')),'%', TO_BASE64(AES_ENCRYPT('內(nèi)容','秘鑰')));

通過(guò)Explain分析結(jié)果,該查詢sql語(yǔ)句索引是生效的。

此方案優(yōu)點(diǎn):

搜索性能高;

支持表關(guān)聯(lián)搜索。

此方案也有以下缺點(diǎn):

1、匹配字符數(shù)是固定,如果業(yè)務(wù)有變,需要重新更新數(shù)據(jù)庫(kù);

2、數(shù)據(jù)存儲(chǔ)需要額外工作量;

3、冗余數(shù)據(jù),需要額外的存儲(chǔ)空間。

寫(xiě)在最后

任何一種方案都有其優(yōu)點(diǎn),也有它的局限性,但有一點(diǎn)的是,數(shù)據(jù)安全是最重要的,任何企業(yè)切不可只為了業(yè)務(wù)發(fā)展,而忽略安全的重要性。

好了,今天就分享到這邊了,如果對(duì)您有幫助,歡迎點(diǎn)贊分享,謝謝!

- End -

推薦閱讀

用C#自己動(dòng)手寫(xiě)個(gè)操作系統(tǒng),爽!

盤(pán)點(diǎn)5個(gè)C#實(shí)用的Word、PPT、Excel、Mail第三方庫(kù)

一個(gè)C#開(kāi)發(fā)的Windows遠(yuǎn)程桌面工具

盤(pán)點(diǎn)10個(gè)Web開(kāi)發(fā)人員必備的最佳開(kāi)發(fā)工具推薦

盤(pán)點(diǎn)10個(gè).Net比較流行的開(kāi)源的ORM框架

總結(jié)

以上是生活随笔為你收集整理的MySql加密存储的数据,如何模糊搜索?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。