文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  使用 MySQL Enterprise 資料遮罩和去識別化外掛程式

8.5.3.2 使用 MySQL Enterprise 資料遮罩和去識別化外掛程式

在使用 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() 會傳回隨機支付卡主要帳戶號碼。

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 |
+-----+-------------+