MySql加密存储的数据,如何模糊搜索?
背景
蔚來(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)題。
- 上一篇: linux 信号(signal)介绍
- 下一篇: 移动魔百盒UNT413A卡刷固件