在使用 MySQL Enterprise 資料遮罩和去識別化之前,請依照章節 8.5.2.1,「MySQL Enterprise 資料遮罩和去識別化元件安裝」中的說明進行安裝。
若要在應用程式中使用 MySQL Enterprise 資料遮罩和去識別化,請叫用適用於您想要執行之作業的函數。如需詳細的函數說明,請參閱章節 8.5.2.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 | +--------------------------------------+ mysql> SELECT mask_inner("かすみがうら市", 3, 1); +----------------------------------+ | mask_inner("かすみがうら市", 3, 1) | +----------------------------------+ | かすみXXX市 | +----------------------------------+ mysql> SELECT mask_inner("かすみがうら市", 1, 3); +----------------------------------+ | mask_inner("かすみがうら市", 1, 3) | +----------------------------------+ | かXXXうら市 | +----------------------------------+
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_inner("かすみがうら市", 2, 2, "#");
+---------------------------------------+
| mask_inner("かすみがうら市", 2, 2, "#") |
+---------------------------------------+
| かす###ら市 |
+---------------------------------------+
特殊用途遮罩元件函數
其他遮罩函數預期一個表示特定類型值的字串引數,並遮罩該值以移除識別特性。
此處的範例使用隨機值產生函式來提供函式引數,這些函式會傳回適當的值類型。如需產生函式的詳細資訊,請參閱使用特定特性產生隨機資料。
支付卡主要帳號遮罩。遮罩函式提供主要帳號的嚴格和寬鬆遮罩。
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_iban()
會遮罩除了號碼前兩個字母 (表示國家/地區) 之外的所有內容
mysql> SELECT mask_iban(gen_rnd_iban());
+---------------------------+
| mask_iban(gen_rnd_iban()) |
+---------------------------+
| ZZ** **** **** **** |
+---------------------------+
通用唯一識別碼遮罩。mask_uuid()
會遮罩所有有意義的字元
mysql> SELECT mask_uuid(gen_rnd_uuid());
+--------------------------------------+
| mask_uuid(gen_rnd_uuid()) |
+--------------------------------------+
| ********-****-****-****-************ |
+--------------------------------------+
美國社會安全號碼遮罩。mask_ssn()
會遮罩除了號碼最後四位數之外的所有內容
mysql> SELECT mask_ssn(gen_rnd_ssn());
+-------------------------+
| mask_ssn(gen_rnd_ssn()) |
+-------------------------+
| ***-**-1723 |
+-------------------------+
加拿大社會保險號碼遮罩。mask_canada_sin()
會遮罩號碼的有意義位數
mysql> SELECT mask_canada_sin(gen_rnd_canada_sin());
+---------------------------------------+
| mask_canada_sin(gen_rnd_canada_sin()) |
+---------------------------------------+
| XXX-XXX-XXX |
+---------------------------------------+
英國國家保險號碼遮罩。mask_uk_nin()
會遮罩除了號碼前兩位數之外的所有內容
mysql> SELECT mask_uk_nin(gen_rnd_uk_nin());
+-------------------------------+
| mask_uk_nin(gen_rnd_uk_nin()) |
+-------------------------------+
| ZH******* |
+-------------------------------+
數個元件函式會產生隨機值。這些值可用於測試、模擬等。
gen_range()
會傳回從指定範圍選取的隨機整數
mysql> SELECT gen_range(1, 10);
+------------------+
| gen_range(1, 10) |
+------------------+
| 6 |
+------------------+
gen_rnd_canada_sin()
會傳回從未使用於合法號碼的範圍中選取的隨機號碼
mysql> SELECT gen_rnd_canada_sin();
+----------------------+
| gen_rnd_canada_sin() |
+----------------------+
(不顯示 gen_rnd_canada_sin()
函式結果,因為其傳回值僅應用於測試目的,不應用於發佈。無法保證該號碼未指派給合法的加拿大社會保險號碼。)
gen_rnd_email()
會傳回隨機電子郵件地址,其中包含指定網域中名稱和姓氏部分所指定的位數,以下範例為 mynet.com
mysql> SELECT gen_rnd_email(6, 8, 'mynet.com');
+------------------------------+
| gen_rnd_email(6, 8, 'mynet') |
+------------------------------+
| ayxnqu.xmkpvvyr@mynet.com |
+------------------------------+
gen_rnd_iban()
會傳回從未使用於合法號碼的範圍中選取的號碼
mysql> SELECT gen_rnd_iban('XO', 24);
+-------------------------------+
| gen_rnd_iban('XO', 24) |
+-------------------------------+
| XO25 SL7A PGQR B9NN 6IVB RFE8 |
+-------------------------------+
gen_rnd_pan()
會傳回隨機支付卡主要帳號
mysql> SELECT gen_rnd_pan();
(不顯示 gen_rnd_pan()
函式結果,因為其傳回值僅應用於測試目的,不應用於發佈。無法保證該號碼未指派給合法的支付帳戶。)
gen_rnd_ssn()
會傳回隨機的美國社會安全號碼,其第一和第二部分均從未使用於合法號碼的範圍中選取
mysql> SELECT gen_rnd_ssn();
+---------------+
| gen_rnd_ssn() |
+---------------+
| 912-45-1615 |
+---------------+
gen_rnd_uk_nin()
會傳回從未使用於合法號碼的範圍中選取的號碼
mysql> SELECT gen_rnd_uk_nin();
+------------------+
| gen_rnd_uk_nin() |
+------------------+
(不顯示 gen_rnd_uk_nin()
函式結果,因為其傳回值僅應用於測試目的,不應用於發佈。無法保證該號碼未指派給合法的國家保險號碼。)
gen_rnd_us_phone()
會傳回在 555 區碼中未使用於合法號碼的隨機美國電話號碼
mysql> SELECT gen_rnd_us_phone();
+--------------------+
| gen_rnd_us_phone() |
+--------------------+
| 1-555-747-5627 |
+--------------------+
gen_rnd_uuid()
會傳回從未使用於合法識別碼的範圍中選取的號碼
mysql> SELECT gen_rnd_uuid();
+--------------------------------------+
| gen_rnd_uuid() |
+--------------------------------------+
| 68946384-6880-3150-6889-928076732539 |
+--------------------------------------+
MySQL Enterprise Data Masking and De-Identification 允許將字典用作稱為詞彙的隨機值來源。若要使用字典,必須先將其新增至 masking_dictionaries
系統資料表並指定名稱。字典會從資料表中讀取,並在元件初始化期間 (在伺服器啟動時) 載入至快取。然後可以從字典新增、移除及選取詞彙,並將其用作隨機值或取代其他值。
請一律使用字典管理函式來編輯字典,而不要直接修改資料表。如果您手動操作資料表,字典快取會與資料表不一致。
有效的 masking_dictionaries
資料表具有這些特性
管理員在
mysql
結構描述中建立masking_dictionaries
系統資料表,如下所示CREATE TABLE IF NOT EXISTS masking_dictionaries( Dictionary VARCHAR(256) NOT NULL, Term VARCHAR(256) NOT NULL, UNIQUE INDEX dictionary_term_idx (Dictionary, Term), INDEX dictionary_idx (Dictionary) ) ENGINE = InnoDB DEFAULT CHARSET=utf8mb4;
需要 MASKING_DICTIONARY_ADMIN 權限才能新增及移除詞彙,或移除整個字典。
資料表可能包含多個字典及其詞彙。
任何使用者帳戶都可以檢視字典。給予足夠的查詢,即可擷取字典中的所有詞彙。避免將敏感資料新增至字典資料表。
假設名為 DE_cities
的字典包含德國的這些城市名稱
Berlin
Munich
Bremen
使用 masking_dictionary_term_add()
來指派字典名稱和一個詞彙
mysql> SELECT masking_dictionary_term_add('DE_Cities', 'Berlin');
+----------------------------------------------------+
| masking_dictionary_term_add('DE_Cities', 'Berlin') |
+----------------------------------------------------+
| 1 |
+----------------------------------------------------+
mysql> SELECT masking_dictionary_term_add('DE_Cities', 'Munich');
+----------------------------------------------------+
| masking_dictionary_term_add('DE_Cities', 'Munich') |
+----------------------------------------------------+
| 1 |
+----------------------------------------------------+
mysql> SELECT masking_dictionary_term_add('DE_Cities', 'Bremen');
+----------------------------------------------------+
| masking_dictionary_term_add('DE_Cities', 'Bremen') |
+----------------------------------------------------+
| 1 |
+----------------------------------------------------+
另假設名為 US_Cities
的字典包含美國的這些城市名稱
Houston
Phoenix
Detroit
mysql> SELECT masking_dictionary_term_add('US_Cities', 'Houston');
+-----------------------------------------------------+
| masking_dictionary_term_add('US_Cities', 'Houston') |
+-----------------------------------------------------+
| 1 |
+-----------------------------------------------------+
mysql> SELECT masking_dictionary_term_add('US_Cities', 'Phoenix');
+-----------------------------------------------------+
| masking_dictionary_term_add('US_Cities', 'Phoenix') |
+-----------------------------------------------------+
| 1 |
+-----------------------------------------------------+
mysql> SELECT masking_dictionary_term_add('US_Cities', 'Detroit');
+-----------------------------------------------------+
| masking_dictionary_term_add('US_Cities', 'Detroit') |
+-----------------------------------------------------+
| 1 |
+-----------------------------------------------------+
若要從字典選取隨機詞彙,請使用 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 | ***-**-0007 |
+-----+-------------+
現在,代表只會看到必要的內容,並保護客戶隱私。
為什麼將 CONVERT()
函式用於 mask_ssn()
的引數?因為 mask_ssn()
需要長度為 11 的引數。因此,即使將 ssn
定義為 VARCHAR(11)
,如果 ssn
欄具有多位元組字元集,則在傳遞至可載入函式時,它可能會顯示為長度超過 11 個位元組,並傳回 NULL
,同時記錄錯誤。將值轉換為二進位字串可確保函式看到長度為 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 | ***-**-0007 |
+-----+-------------+