在使用 MySQL Enterprise 資料遮罩與去識別之前,請依照第 8.5.3.1 節「MySQL Enterprise 資料遮罩與去識別外掛程式安裝」中提供的指示進行安裝。
若要在應用程式中使用 MySQL Enterprise 資料遮罩與去識別,請叫用適合您要執行作業的函式。如需詳細的函式說明,請參閱第 8.5.3.4 節「MySQL Enterprise 資料遮罩與去識別外掛程式函式說明」。本節示範如何使用這些函式來執行一些具代表性的工作。它首先概述可用的函式,接著提供一些在實際情況下如何使用這些函式的範例。
MySQL 提供遮罩任意字串的通用遮罩函式,以及遮罩特定類型值的特殊用途遮罩函式。
通用遮罩函式
mask_inner()
和 mask_outer()
是通用函式,可根據字串中的位置來遮罩任意字串的部分
mask_inner()
會遮罩其字串引數的內部,並保留未遮罩的尾端。其他引數會指定未遮罩尾端的大小。mysql> SELECT mask_inner('This is a string', 5, 1); +--------------------------------------+ | mask_inner('This is a string', 5, 1) | +--------------------------------------+ | This XXXXXXXXXXg | +--------------------------------------+ mysql> SELECT mask_inner('This is a string', 1, 5); +--------------------------------------+ | mask_inner('This is a string', 1, 5) | +--------------------------------------+ | TXXXXXXXXXXtring | +--------------------------------------+
mask_outer()
則相反,遮罩其字串引數的尾端,並保留未遮罩的內部。其他引數會指定遮罩尾端的大小。mysql> SELECT mask_outer('This is a string', 5, 1); +--------------------------------------+ | mask_outer('This is a string', 5, 1) | +--------------------------------------+ | XXXXXis a strinX | +--------------------------------------+ mysql> SELECT mask_outer('This is a string', 1, 5); +--------------------------------------+ | mask_outer('This is a string', 1, 5) | +--------------------------------------+ | Xhis is a sXXXXX | +--------------------------------------+
依預設,mask_inner()
和 mask_outer()
會使用 'X'
作為遮罩字元,但也允許使用選用的遮罩字元引數
mysql> SELECT mask_inner('This is a string', 5, 1, '*');
+-------------------------------------------+
| mask_inner('This is a string', 5, 1, '*') |
+-------------------------------------------+
| This **********g |
+-------------------------------------------+
mysql> SELECT mask_outer('This is a string', 5, 1, '#');
+-------------------------------------------+
| mask_outer('This is a string', 5, 1, '#') |
+-------------------------------------------+
| #####is a strin# |
+-------------------------------------------+
特殊用途遮罩函式
其他遮罩函式則預期使用代表特定類型值的字串引數,並將其遮罩以移除識別特性。
此處的範例使用傳回適當類型值的隨機值產生函式來提供函式引數。如需有關產生函式的詳細資訊,請參閱產生具有特定特性的隨機資料。
付款卡主要帳戶號碼遮罩。 遮罩函式提供嚴格和寬鬆的主要帳戶號碼遮罩。
mask_pan()
會遮蔽號碼,只保留最後四位數字。mysql> SELECT mask_pan(gen_rnd_pan()); +-------------------------+ | mask_pan(gen_rnd_pan()) | +-------------------------+ | XXXXXXXXXXXX2461 | +-------------------------+
mask_pan_relaxed()
的功能類似,但不遮蔽表示支付卡發卡機構的前六位數字。mysql> SELECT mask_pan_relaxed(gen_rnd_pan()); +---------------------------------+ | mask_pan_relaxed(gen_rnd_pan()) | +---------------------------------+ | 770630XXXXXX0807 | +---------------------------------+
美國社會安全號碼遮蔽。mask_ssn()
會遮蔽號碼,只保留最後四位數字。
mysql> SELECT mask_ssn(gen_rnd_ssn());
+-------------------------+
| mask_ssn(gen_rnd_ssn()) |
+-------------------------+
| XXX-XX-1723 |
+-------------------------+
有數個函式會產生隨機值。這些值可用於測試、模擬等等。
gen_range()
會傳回從指定範圍中選取的隨機整數。
mysql> SELECT gen_range(1, 10);
+------------------+
| gen_range(1, 10) |
+------------------+
| 6 |
+------------------+
gen_rnd_email()
會傳回 example.com
網域中的隨機電子郵件地址。
mysql> SELECT gen_rnd_email();
+---------------------------+
| gen_rnd_email() |
+---------------------------+
| ayxnq.xmkpvvy@example.com |
+---------------------------+
gen_rnd_pan()
會傳回隨機支付卡主帳號 (Primary Account Number)。
mysql> SELECT gen_rnd_pan();
(gen_rnd_pan()
函式的結果不會顯示,因為其傳回值僅應用於測試目的,而不應公開發佈。無法保證該號碼未分配給合法的支付帳戶。)
gen_rnd_ssn()
會傳回隨機美國社會安全號碼,其第一部分和第二部分各自從未用於合法號碼的範圍中選取。
mysql> SELECT gen_rnd_ssn();
+---------------+
| gen_rnd_ssn() |
+---------------+
| 912-45-1615 |
+---------------+
gen_rnd_us_phone()
會傳回不使用於合法號碼的 555 區碼中的隨機美國電話號碼。
mysql> SELECT gen_rnd_us_phone();
+--------------------+
| gen_rnd_us_phone() |
+--------------------+
| 1-555-747-5627 |
+--------------------+
MySQL Enterprise Data Masking and De-Identification 允許將字典用作隨機值的來源。若要使用字典,必須先從檔案載入字典,並指定名稱。每個載入的字典都會成為字典註冊表的一部分。然後可以從註冊的字典中選取項目,並將其用作隨機值或替換其他值。
有效的字典檔案具有以下特性:
檔案內容為純文字,每行一個詞彙。
空白行會被忽略。
檔案必須至少包含一個詞彙。
假設一個名為 de_cities.txt
的檔案包含這些德國城市名稱:
Berlin
Munich
Bremen
也假設一個名為 us_cities.txt
的檔案包含這些美國城市名稱:
Chicago
Houston
Phoenix
El Paso
Detroit
假設 secure_file_priv
系統變數設定為 /usr/local/mysql/mysql-files
。在這種情況下,將字典檔案複製到該目錄,以便 MySQL 伺服器可以存取它們。然後使用 gen_dictionary_load()
將字典載入字典註冊表並為其指定名稱。
mysql> SELECT gen_dictionary_load('/usr/local/mysql/mysql-files/de_cities.txt', 'DE_Cities');
+--------------------------------------------------------------------------------+
| gen_dictionary_load('/usr/local/mysql/mysql-files/de_cities.txt', 'DE_Cities') |
+--------------------------------------------------------------------------------+
| Dictionary load success |
+--------------------------------------------------------------------------------+
mysql> SELECT gen_dictionary_load('/usr/local/mysql/mysql-files/us_cities.txt', 'US_Cities');
+--------------------------------------------------------------------------------+
| gen_dictionary_load('/usr/local/mysql/mysql-files/us_cities.txt', 'US_Cities') |
+--------------------------------------------------------------------------------+
| Dictionary load success |
+--------------------------------------------------------------------------------+
若要從字典中選取隨機詞彙,請使用 gen_dictionary()
。
mysql> SELECT gen_dictionary('DE_Cities');
+-----------------------------+
| gen_dictionary('DE_Cities') |
+-----------------------------+
| Berlin |
+-----------------------------+
mysql> SELECT gen_dictionary('US_Cities');
+-----------------------------+
| gen_dictionary('US_Cities') |
+-----------------------------+
| Phoenix |
+-----------------------------+
若要從多個字典中選取隨機詞彙,請隨機選取其中一個字典,然後從中選取一個詞彙。
mysql> SELECT gen_dictionary(ELT(gen_range(1,2), 'DE_Cities', 'US_Cities'));
+---------------------------------------------------------------+
| gen_dictionary(ELT(gen_range(1,2), 'DE_Cities', 'US_Cities')) |
+---------------------------------------------------------------+
| Detroit |
+---------------------------------------------------------------+
mysql> SELECT gen_dictionary(ELT(gen_range(1,2), 'DE_Cities', 'US_Cities'));
+---------------------------------------------------------------+
| gen_dictionary(ELT(gen_range(1,2), 'DE_Cities', 'US_Cities')) |
+---------------------------------------------------------------+
| Bremen |
+---------------------------------------------------------------+
gen_blocklist()
函式允許將一個字典中的詞彙替換為另一個字典中的詞彙,從而透過替換進行遮蔽。它的引數是要替換的詞彙、該詞彙所在的字典,以及要從中選擇替換詞彙的字典。例如,若要將美國城市替換為德國城市,反之亦然,請像這樣使用 gen_blocklist()
:
mysql> SELECT gen_blocklist('Munich', 'DE_Cities', 'US_Cities');
+---------------------------------------------------+
| gen_blocklist('Munich', 'DE_Cities', 'US_Cities') |
+---------------------------------------------------+
| Houston |
+---------------------------------------------------+
mysql> SELECT gen_blocklist('El Paso', 'US_Cities', 'DE_Cities');
+----------------------------------------------------+
| gen_blocklist('El Paso', 'US_Cities', 'DE_Cities') |
+----------------------------------------------------+
| Bremen |
+----------------------------------------------------+
如果第一個字典中沒有要替換的詞彙,gen_blocklist()
會傳回不變的詞彙。
mysql> SELECT gen_blocklist('Moscow', 'DE_Cities', 'US_Cities');
+---------------------------------------------------+
| gen_blocklist('Moscow', 'DE_Cities', 'US_Cities') |
+---------------------------------------------------+
| Moscow |
+---------------------------------------------------+
在客戶服務呼叫中心,一種常見的身分驗證技術是要求客戶提供其社會安全號碼 (SSN) 的最後四位數字。例如,客戶可能會說她的名字是 Joanna Bond,並且她的最後四位 SSN 數字是 0007
。
假設包含客戶記錄的 customer
表格具有以下欄:
id
:客戶 ID 號碼。first_name
:客戶名字。last_name
:客戶姓氏。ssn
:客戶社會安全號碼。
例如,表格可以定義如下:
CREATE TABLE customer
(
id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
first_name VARCHAR(40),
last_name VARCHAR(40),
ssn VARCHAR(11)
);
客戶服務代表用來檢查客戶 SSN 的應用程式可能會執行如下查詢:
mysql> SELECT id, ssn
mysql> FROM customer
mysql> WHERE first_name = 'Joanna' AND last_name = 'Bond';
+-----+-------------+
| id | ssn |
+-----+-------------+
| 786 | 906-39-0007 |
+-----+-------------+
但是,這會將 SSN 暴露給客戶服務代表,他們只需要看到最後四位數字。相反地,應用程式可以使用以下查詢來僅顯示遮蔽的 SSN:
mysql> SELECT id, mask_ssn(CONVERT(ssn USING binary)) AS masked_ssn
mysql> FROM customer
mysql> WHERE first_name = 'Joanna' AND last_name = 'Bond';
+-----+-------------+
| id | masked_ssn |
+-----+-------------+
| 786 | XXX-XX-0007 |
+-----+-------------+
現在,代表只會看到必要的內容,並且保護了客戶隱私。
為什麼 CONVERT()
函式用於 mask_ssn()
的引數?因為 mask_ssn()
需要長度為 11 的引數。因此,即使 ssn
定義為 VARCHAR(11)
,如果 ssn
欄位具有多位元組字元集,當傳遞給可載入的函式時,它可能會看起來長度超過 11 個位元組,並且會發生錯誤。將值轉換為二進位字串可確保函式看到長度為 11 的引數。
當字串引數沒有單位元組字元集時,其他資料遮蔽函式可能需要類似的技術。
如果來自表格的遮蔽資料用於多個查詢,則定義一個產生遮蔽資料的檢視可能會很方便。這樣一來,應用程式就可以從檢視中選取資料,而無需在個別查詢中執行遮蔽。
例如,可以像這樣定義先前章節中 customer
表格上的遮蔽檢視:
CREATE VIEW masked_customer AS
SELECT id, first_name, last_name,
mask_ssn(CONVERT(ssn USING binary)) AS masked_ssn
FROM customer;
然後,查詢以查找客戶會變得更簡單,但仍然會傳回遮蔽的資料:
mysql> SELECT id, masked_ssn
mysql> FROM masked_customer
mysql> WHERE first_name = 'Joanna' AND last_name = 'Bond';
+-----+-------------+
| id | masked_ssn |
+-----+-------------+
| 786 | XXX-XX-0007 |
+-----+-------------+