大量資料遭洩露,蔚來被勒索225萬比特幣,系統資料安全要這樣解決!

語言: CN / TW / HK

背景

蔚來被勒索 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 -*