MySQL Enterprise 資料遮罩與去識別化外掛程式函式庫包含數個函式,可以歸類為以下類別
這些函式支援單一位元組 latin1
字元集,用於字串引數與傳回值。如果字串傳回值應採用不同的字元集,請轉換它。以下範例示範如何將 gen_rnd_email()
的結果轉換為 utf8mb4
字元集
SET @email = CONVERT(gen_rnd_email() USING utf8mb4);
也可能需要轉換字串引數,如使用遮罩資料進行客戶識別中所述。
如果在 mysql 用戶端內呼叫 MySQL Enterprise Data Masking and De-Identification 函式,二進位字串結果會使用十六進位表示法顯示,具體取決於 --binary-as-hex
的值。有關該選項的更多資訊,請參閱第 6.5.1 節,「mysql — MySQL 命令列用戶端」。
本節中的每個外掛程式函式都會對其字串引數執行遮罩作業,並傳回遮罩後的結果。
mask_inner(
str
,margin1
,margin2
[,mask_char
])遮罩字串的內部部分,保持兩端不變,並傳回結果。可以指定可選的遮罩字元。
引數
str
:要遮罩的字串。margin1
:一個非負整數,指定字串左端保持不遮罩的字元數。如果值為 0,則左端不會有字元保持不遮罩。margin2
:一個非負整數,指定字串右端保持不遮罩的字元數。如果值為 0,則右端不會有字元保持不遮罩。mask_char
:(可選)用於遮罩的單個字元。如果未給定mask_char
,則預設值為'X'
。遮罩字元必須是單一位元組字元。嘗試使用多位元組字元會產生錯誤。
傳回值
遮罩後的字串,如果任何邊距為負,則傳回
NULL
。如果邊距值之和大於引數字串長度,則不會進行遮罩,並將引數原樣傳回。
範例
mysql> SELECT mask_inner('abcdef', 1, 2), mask_inner('abcdef',0, 5); +----------------------------+---------------------------+ | mask_inner('abcdef', 1, 2) | mask_inner('abcdef',0, 5) | +----------------------------+---------------------------+ | aXXXef | Xbcdef | +----------------------------+---------------------------+ mysql> SELECT mask_inner('abcdef', 1, 2, '*'), mask_inner('abcdef',0, 5, '#'); +---------------------------------+--------------------------------+ | mask_inner('abcdef', 1, 2, '*') | mask_inner('abcdef',0, 5, '#') | +---------------------------------+--------------------------------+ | a***ef | #bcdef | +---------------------------------+--------------------------------+
mask_outer(
str
,margin1
,margin2
[,mask_char
])遮罩字串的左右兩端,保持內部不遮罩,並傳回結果。可以指定可選的遮罩字元。
引數
str
:要遮罩的字串。margin1
:一個非負整數,指定字串左端要遮罩的字元數。如果值為 0,則左端不會有字元被遮罩。margin2
:一個非負整數,指定字串右端要遮罩的字元數。如果值為 0,則右端不會有字元被遮罩。mask_char
:(可選)用於遮罩的單個字元。如果未給定mask_char
,則預設值為'X'
。遮罩字元必須是單一位元組字元。嘗試使用多位元組字元會產生錯誤。
傳回值
遮罩後的字串,如果任何邊距為負,則傳回
NULL
。如果邊距值之和大於引數字串長度,則會遮罩整個引數。
範例
mysql> SELECT mask_outer('abcdef', 1, 2), mask_outer('abcdef',0, 5); +----------------------------+---------------------------+ | mask_outer('abcdef', 1, 2) | mask_outer('abcdef',0, 5) | +----------------------------+---------------------------+ | XbcdXX | aXXXXX | +----------------------------+---------------------------+ mysql> SELECT mask_outer('abcdef', 1, 2, '*'), mask_outer('abcdef',0, 5, '#'); +---------------------------------+--------------------------------+ | mask_outer('abcdef', 1, 2, '*') | mask_outer('abcdef',0, 5, '#') | +---------------------------------+--------------------------------+ | *bcd** | a##### | +---------------------------------+--------------------------------+
遮罩付款卡主帳號,並傳回除了最後四位數之外的所有數字都由
'X'
字元取代的號碼。引數
str
:要遮罩的字串。該字串的長度必須適合付款卡主帳號,但不會進行其他檢查。
傳回值
遮罩後的付款號碼(以字串形式)。如果引數短於要求長度,則會原樣傳回。
範例
mysql> SELECT mask_pan(gen_rnd_pan()); +-------------------------+ | mask_pan(gen_rnd_pan()) | +-------------------------+ | XXXXXXXXXXXX9102 | +-------------------------+ mysql> SELECT mask_pan(gen_rnd_pan(19)); +---------------------------+ | mask_pan(gen_rnd_pan(19)) | +---------------------------+ | XXXXXXXXXXXXXXX8268 | +---------------------------+ mysql> SELECT mask_pan('a*Z'); +-----------------+ | mask_pan('a*Z') | +-----------------+ | a*Z | +-----------------+
遮罩付款卡主帳號,並傳回除了前六位數和最後四位數之外的所有數字都由
'X'
字元取代的號碼。前六位數表示付款卡發卡行。引數
str
:要遮罩的字串。該字串的長度必須適合付款卡主帳號,但不會進行其他檢查。
傳回值
遮罩後的付款號碼(以字串形式)。如果引數短於要求長度,則會原樣傳回。
範例
mysql> SELECT mask_pan_relaxed(gen_rnd_pan()); +---------------------------------+ | mask_pan_relaxed(gen_rnd_pan()) | +---------------------------------+ | 551279XXXXXX3108 | +---------------------------------+ mysql> SELECT mask_pan_relaxed(gen_rnd_pan(19)); +-----------------------------------+ | mask_pan_relaxed(gen_rnd_pan(19)) | +-----------------------------------+ | 462634XXXXXXXXX6739 | +-----------------------------------+ mysql> SELECT mask_pan_relaxed('a*Z'); +-------------------------+ | mask_pan_relaxed('a*Z') | +-------------------------+ | a*Z | +-------------------------+
遮罩美國社會安全號碼,並傳回除了最後四位數之外的所有數字都由
'X'
字元取代的號碼。引數
str
:要遮罩的字串。該字串長度必須為 11 個字元。
傳回值
遮罩後的社會安全號碼(以字串形式),如果引數長度不正確,則傳回錯誤。
範例
mysql> SELECT mask_ssn('909-63-6922'), mask_ssn('abcdefghijk'); +-------------------------+-------------------------+ | mask_ssn('909-63-6922') | mask_ssn('abcdefghijk') | +-------------------------+-------------------------+ | XXX-XX-6922 | XXX-XX-hijk | +-------------------------+-------------------------+ mysql> SELECT mask_ssn('909'); ERROR 1123 (HY000): Can't initialize function 'mask_ssn'; MASK_SSN: Error: String argument width too small mysql> SELECT mask_ssn('123456789123456789'); ERROR 1123 (HY000): Can't initialize function 'mask_ssn'; MASK_SSN: Error: String argument width too large
本節中的外掛程式函式會為不同類型的資料產生隨機值。在可能的情況下,產生的值具有保留給示範或測試值的特徵,以避免將其誤認為合法資料。例如,gen_rnd_us_phone()
會傳回使用 555 區碼的美國電話號碼,該區碼未分配給實際使用的電話號碼。個別函式說明會描述此原則的任何例外情況。
產生從指定範圍中選取的隨機數字。
引數
lower
:一個整數,指定範圍的下限。upper
:一個整數,指定範圍的上限,其值不得小於下限。
傳回值
範圍從
lower
到upper
(含)的隨機整數,如果upper
引數小於lower
,則傳回NULL
。範例
mysql> SELECT gen_range(100, 200), gen_range(-1000, -800); +---------------------+------------------------+ | gen_range(100, 200) | gen_range(-1000, -800) | +---------------------+------------------------+ | 177 | -917 | +---------------------+------------------------+ mysql> SELECT gen_range(1, 0); +-----------------+ | gen_range(1, 0) | +-----------------+ | NULL | +-----------------+
在
example.com
網域中產生隨機電子郵件地址。引數
無。
傳回值
隨機電子郵件地址(以字串形式)。
範例
mysql> SELECT gen_rnd_email(); +---------------------------+ | gen_rnd_email() | +---------------------------+ | ijocv.mwvhhuf@example.com | +---------------------------+
產生隨機付款卡主帳號。該號碼會通過 Luhn 檢查(一種針對檢查位數執行總和檢查碼驗證的演算法)。
警告從
gen_rnd_pan()
傳回的值僅應用於測試目的,不適用於發佈。沒有任何方法可以保證給定的傳回值未分配給合法的付款帳戶。如果必須發佈gen_rnd_pan()
結果,請考慮使用mask_pan()
或mask_pan_relaxed()
對其進行遮罩。引數
size
:(可選)一個整數,指定結果的大小。如果未給定size
,則預設值為 16。如果給定size
,則size
必須是介於 12 到 19 之間的整數。
傳回值
隨機付款號碼(以字串形式),如果給定超出允許範圍的
size
引數,則傳回NULL
。範例
mysql> SELECT mask_pan(gen_rnd_pan()); +-------------------------+ | mask_pan(gen_rnd_pan()) | +-------------------------+ | XXXXXXXXXXXX5805 | +-------------------------+ mysql> SELECT mask_pan(gen_rnd_pan(19)); +---------------------------+ | mask_pan(gen_rnd_pan(19)) | +---------------------------+ | XXXXXXXXXXXXXXX5067 | +---------------------------+ mysql> SELECT mask_pan_relaxed(gen_rnd_pan()); +---------------------------------+ | mask_pan_relaxed(gen_rnd_pan()) | +---------------------------------+ | 398403XXXXXX9547 | +---------------------------------+ mysql> SELECT mask_pan_relaxed(gen_rnd_pan(19)); +-----------------------------------+ | mask_pan_relaxed(gen_rnd_pan(19)) | +-----------------------------------+ | 578416XXXXXXXXX6509 | +-----------------------------------+ mysql> SELECT gen_rnd_pan(11), gen_rnd_pan(20); +-----------------+-----------------+ | gen_rnd_pan(11) | gen_rnd_pan(20) | +-----------------+-----------------+ | NULL | NULL | +-----------------+-----------------+
以
格式產生隨機美國社會安全號碼。AAA
-BB
-CCCC
AAA
部分大於 900,而BB
部分小於 70,這些特徵不適用於合法的社會安全號碼。引數
無。
傳回值
隨機社會安全號碼(以字串形式)。
範例
mysql> SELECT gen_rnd_ssn(); +---------------+ | gen_rnd_ssn() | +---------------+ | 951-26-0058 | +---------------+
以
1-555-
格式產生隨機美國電話號碼。555 區碼不適用於合法的電話號碼。AAA
-BBBB
引數
無。
傳回值
隨機美國電話號碼(以字串形式)。
範例
mysql> SELECT gen_rnd_us_phone(); +--------------------+ | gen_rnd_us_phone() | +--------------------+ | 1-555-682-5423 | +--------------------+
本節中的外掛程式函式會操作術語字典,並根據它們執行產生和遮罩作業。其中一些函式需要 SUPER
權限。
載入字典後,它會成為字典登錄的一部分,並獲分配一個名稱,供其他字典函式使用。字典是從純文字檔案載入的,每個檔案每行包含一個術語。會忽略空行。若要有效,字典檔案必須至少包含一個非空行。
gen_blacklist(
str
,dictionary_name
,replacement_dictionary_name
)將一個字典中存在的術語替換為第二個字典中的術語,並傳回替換術語。這會通過替換來遮罩原始術語。此函式已過時;請改用
gen_blocklist()
。gen_blocklist(
str
,dictionary_name
,replacement_dictionary_name
)將一個字典中存在的術語替換為第二個字典中的術語,並傳回替換術語。這會通過替換來遮罩原始術語。此函式可替代已過時的
gen_blacklist()
函式。引數
str
:一個字串,指示要替換的術語。dictionary_name
:一個字串,命名包含要替換的術語的字典。replacement_dictionary_name
:一個字串,命名要從中選擇替換術語的字典。
傳回值
從
replacement_dictionary_name
中隨機選取的一個字串,作為str
的替換項,如果str
未出現在dictionary_name
中,則傳回str
,如果任何一個字典名稱不在字典登錄中,則傳回NULL
。如果要替換的術語同時出現在兩個字典中,則傳回值可能為相同的術語。
範例
mysql> SELECT gen_blocklist('Berlin', 'DE_Cities', 'US_Cities'); +---------------------------------------------------+ | gen_blocklist('Berlin', 'DE_Cities', 'US_Cities') | +---------------------------------------------------+ | Phoenix | +---------------------------------------------------+
gen_dictionary(
dictionary_name
)從字典中返回一個隨機詞彙。
引數
dictionary_name
:一個字串,指定要從中選擇詞彙的字典名稱。
傳回值
從字典中隨機返回一個詞彙字串,如果字典名稱不在字典註冊表中,則返回
NULL
。範例
mysql> SELECT gen_dictionary('mydict'); +--------------------------+ | gen_dictionary('mydict') | +--------------------------+ | My term | +--------------------------+ mysql> SELECT gen_dictionary('no-such-dict'); +--------------------------------+ | gen_dictionary('no-such-dict') | +--------------------------------+ | NULL | +--------------------------------+
gen_dictionary_drop(
dictionary_name
)從字典註冊表中移除一個字典。
此函數需要
SUPER
權限。引數
dictionary_name
:一個字串,指定要從字典註冊表中移除的字典名稱。
傳回值
一個字串,指示刪除操作是否成功。
Dictionary removed
表示成功。Dictionary removal error
表示失敗。範例
mysql> SELECT gen_dictionary_drop('mydict'); +-------------------------------+ | gen_dictionary_drop('mydict') | +-------------------------------+ | Dictionary removed | +-------------------------------+ mysql> SELECT gen_dictionary_drop('no-such-dict'); +-------------------------------------+ | gen_dictionary_drop('no-such-dict') | +-------------------------------------+ | Dictionary removal error | +-------------------------------------+
gen_dictionary_load(
dictionary_path
,dictionary_name
)將檔案載入到字典註冊表,並為字典指定一個名稱,以便與其他需要字典名稱引數的函數一起使用。
此函數需要
SUPER
權限。重要字典不是持久性的。應用程式使用的任何字典都必須在每次伺服器啟動時載入。
一旦載入到註冊表,字典就會按原樣使用,即使底層字典檔案發生變更也是如此。若要重新載入字典,請先使用
gen_dictionary_drop()
移除它,然後再使用gen_dictionary_load()
重新載入它。引數
dictionary_path
:一個字串,指定字典檔案的路徑名稱。dictionary_name
:一個字串,提供字典的名稱。
傳回值
一個字串,指示載入操作是否成功。
Dictionary load success
表示成功。Dictionary load error
表示失敗。字典載入失敗可能由於多種原因,包括:已載入具有給定名稱的字典。
找不到字典檔案。
字典檔案不包含任何詞彙。
已設定
secure_file_priv
系統變數,且字典檔案未位於該變數命名的目錄中。
範例
mysql> SELECT gen_dictionary_load('/usr/local/mysql/mysql-files/mydict','mydict'); +---------------------------------------------------------------------+ | gen_dictionary_load('/usr/local/mysql/mysql-files/mydict','mydict') | +---------------------------------------------------------------------+ | Dictionary load success | +---------------------------------------------------------------------+ mysql> SELECT gen_dictionary_load('/dev/null','null'); +-----------------------------------------+ | gen_dictionary_load('/dev/null','null') | +-----------------------------------------+ | Dictionary load error | +-----------------------------------------+