大量資料遭洩露,蔚來被勒索225萬比特幣,系統資料安全要這樣解決!
背景
蔚來被勒索 225 萬美元,大量資料遭洩露!
根據網路上流傳的截圖顯示,黑客似乎掌握著蔚來內部員工資料 22800 條、車主使用者身份證資料 399000 條、使用者地址資料 6500000 條、註冊使用者資料 4850000 條、企業及企業代表聯絡人資料 10000 條、訂單資料 490000 條、退單資料 90000 條,出售的金額以 0.1-0.25 比特幣不等。
蔚來公司和蔚來創始人李斌也都出來道歉,並承諾對因本次事件給使用者造成的損失承擔責任。
資料安全
現在企業都已經數字化辦公了,在提升效率的同時,資料安全也是重中之重,很多公司為了追求效率,卻忽略安全這方面的工作。從上面的報告看,蔚來這次洩露的資料包含:使用者身份證、地址,這些資料保密級別都是最高的,在資料庫儲存也應該要加密儲存。
而加密儲存就涉及以下幾個問題:
1、加密儲存的方式;
2、加密儲存後,資料如何展示;
3、加密儲存如何模糊搜尋。
今天就給大家分享下,MySql資料加密的解決方案、以及如何解決以上的問題。
Mysql加密方案
Mysql本身自帶的加密方法,分為2種:
1、不可逆加密演算法:
PASSWORD,ENCRYPT,MD5,SHA。
2、可逆的加密演算法:
AES_ENCRYPT、AES_DECRYPT 和 ENCODE、DECODE。
以上兩組分別為可逆的加解密函式,都是返回一個二進位制字串,要以BLOB型別儲存。不過ENCODE與DECODE,在MySql 5.7後已經取消,並且安全性比較低,建議不要採用。
在專案開發中,比如密碼等少量的資料,不涉及顯示和搜尋的業務需求,可以採用不可逆加密,但大部分資料,我們還是需要採用可逆的加密方式。
Mysql 加密儲存
下面我們以AES_ENCRYPT、AES_DECRYPT 為例子,來介紹下如何解決,資料加密儲存與查詢。
1、建立表
首先先建立一張表,只有一個欄位data,用來儲存解密後的資料,sql語句如下:
CREATE TABLE `tab_aes` (`data` VARCHAR(250) NULL DEFAULT NULL COLLATE 'utf8_general_ci')COMMENT='資料加密儲存表'COLLATE='utf8_general_ci'ENGINE=InnoDB;
2、插入資料
通過Sql語句插入加密的資料,1ql語句如下:
INSERT INTO tab_aes
VALUES( TO_BASE64( AES_ENCRYPT('要加密的內容','祕鑰') ) );
TO_BASE64函式把加密的二進位制轉換為Base64,方便我們檢視。
插入的結果如下:
3、查詢返回解密資料
SELECT CAST( AES_DECRYPT( FROM_BASE64(tab_aes.data), '祕鑰') AS CHAR CHARACTER SET utf8 )
FROM tab_aes
解密後,要用CAST把字串編碼轉為UTF8,否則返回是亂碼。
模糊搜尋
資料加密儲存與解密資料,這些都沒有太大問題,加密儲存產生最大的問題,就是模糊搜尋,關於模糊搜尋有以下方案:
1、資料預載入至記憶體資料庫
此方案是程式啟動的時候,預先把資料庫的資料解密,並載入至記憶體中,比如採用MongoDB,此方案存在的優缺點如下:
優點:
資料安全,查詢效能速度快
缺點:
伺服器佔用記憶體大;
資料表無法關聯查詢;
記憶體資料與資料庫要實時儲存一致,需要額外工作量。
2、程式實時載入資料,並解密處理
此方案是,使用者觸發請求的時候,程式實時載入並解密,儲存至記憶體,雖然此方案解決了與資料庫同步的問題,但也存在其他問題,此方案優缺點如下:
優點:
資料安全,查詢效能速度快、資料處理靈活。
缺點:
伺服器記憶體不可控,瞬間記憶體容易飆升,可能導致伺服器不穩定;
資料表無法關聯查詢。
3、在Sql語句處理模糊搜尋
如果資料量比較少,以上兩種方案可能不會產生太大的影響,但對於大多數專案以上兩種方案還是不靠譜的。
在Sql語句處理模糊搜尋,也有以下幾種方案:
3.1、實時解密搜尋
直接在資料庫端,把加密的資料解密。
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 '要加密%'
優點
搜尋靈活
缺點:
無法利用索引,搜尋效能慢;
資料需要先解密,導致效能慢。
3.2、欄位冗餘儲存
我們都知道MySql模糊搜尋,只有當匹配開頭、或者匹配結尾的時候,索引才會生效。所以我們可以擴充套件一個欄位,用來儲存開頭和結尾加密後的資料。
建立表sql語句如下,新增一個欄位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='資料加密儲存表'
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;
比如,要加密的內容為:123456789,欄位data_ext取欄位data,開頭和結尾3個字元儲存,儲存格式為:AES(123) , AES(789),插入資料的sql語句如下:
INSERT INTO tab_aes VALUES( TO_BASE64( AES_ENCRYPT('要加密的內容','祕鑰')),
CONCAT(TO_BASE64( AES_ENCRYPT('要加密','祕鑰')), ',', TO_BASE64( AES_ENCRYPT('內容','祕鑰')))
);
儲存結果如下:
相應的模糊搜尋sql語句如下:
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(('內容'),'祕鑰')))AND tab_aes.data_ext LIKE CONCAT(TO_BASE64(AES_ENCRYPT(('要加密'),'祕鑰')),'%', TO_BASE64(AES_ENCRYPT('內容','祕鑰')));
通過Explain分析結果,該查詢sql語句索引是生效的。
此方案優點:
搜尋效能高;
支援表關聯搜尋。
此方案也有以下缺點:
1、匹配字元數是固定,如果業務有變,需要重新更新資料庫;
2、資料儲存需要額外工作量;
3、冗餘資料,需要額外的儲存空間。
寫在最後
任何一種方案都有其優點,也有它的侷限性,但有一點的是,資料安全是最重要的,任何企業切不可只為了業務發展,而忽略安全的重要性。
好了,今天就分享到這邊了,如果對您有幫助,歡迎點贊分享,謝謝!
*- End -*