6.4.7.4 MySQL Enterprise Data Masking 和 De-Identification 用户定义函数参考
MySQL Enterprise Data Masking and De-Identification 插件库包含几个用户定义的函数(UDF),可以将其分为以下几类:
这些 UDF 将字符串参数视为二进制字符串(这意味着它们不区分字母大小写),并且字符串返回值是二进制字符串。如果字符串返回值应使用其他字符集,请对其进行转换。下面的示例演示如何将gen_rnd_email()的结果转换为utf8mb4
字符集:
SET @email = CONVERT(gen_rnd_email() USING utf8mb4);
如使用屏蔽数据进行 Client 识别所示,可能还需要转换字符串参数。
数据屏蔽功能
本节中的每个函数都对其字符串参数执行屏蔽操作,并返回屏蔽的结果。
遮盖字符串的内部,使两端不受影响,并返回结果。可以指定一个可选的屏蔽字符。
Arguments:
-
str
*:要屏蔽的字符串。
-
margin1
*:一个非负整数,它指定字符串左端要保持不屏蔽的字符数。如果值为 0,则没有左端字符保持未屏蔽状态。
-
margin2
*:一个非负整数,它指定字符串右端要保持不屏蔽的字符数。如果值为 0,则不保留任何右端字符。
-
mask_char
:(可选)用于掩蔽的单个字符。如果未提供mask_char
*,则默认值为'X'
。
屏蔽字符必须是单字节字符。尝试使用多字节字符会产生错误。
Return value:
被屏蔽的字符串,如果任一边距为负,则为NULL
。
如果边距值的总和大于参数长度,则不会发生屏蔽,并且参数将保持不变。
Example:
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 |
+---------------------------------+--------------------------------+
对字符串的左端和右端进行遮罩,不遮盖内部,然后返回结果。可以指定一个可选的屏蔽字符。
Arguments:
-
str
*:要屏蔽的字符串。
-
margin1
*:一个非负整数,用于指定要屏蔽的字符串左端的字符数。如果值为 0,则不会屏蔽左端字符。
-
margin2
*:一个非负整数,用于指定要屏蔽的字符串右端的字符数。如果值为 0,则不会屏蔽任何右端字符。
-
mask_char
:(可选)用于掩蔽的单个字符。如果未提供mask_char
*,则默认值为'X'
。
屏蔽字符必须是单字节字符。尝试使用多字节字符会产生错误。
Return value:
被屏蔽的字符串,如果任一边距为负,则为NULL
。
如果边距值的总和大于参数长度,则将屏蔽整个参数。
Example:
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##### |
+---------------------------------+--------------------------------+
屏蔽支付卡的主帐号并返回该 Numbers,除最后四位数字外的所有数字均用'X'
字符替换。
Arguments:
-
str
*:要屏蔽的字符串。该字符串必须是主帐号的合适长度,但未经其他检查。
Return value:
掩码的付款 Numbers 为字符串。如果参数比要求的短,则返回原样。
Example:
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 |
+-----------------+
屏蔽支付卡的主帐号并返回该 Numbers,除了前六位和后四位以外的所有数字都用'X'
字符替换。前六位数字 table 示支付卡发行者。
Arguments:
-
str
*:要屏蔽的字符串。该字符串必须是主帐号的合适长度,但未经其他检查。
Return value:
掩码的付款 Numbers 为字符串。如果参数比要求的短,则返回原样。
Example:
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'
字符替换。
Arguments:
-
str
*:要屏蔽的字符串。该字符串必须为 11 个字符长,但未经其他检查。
Return value:
带掩码的社会安全 Numbers 为字符串,如果参数长度不正确,则为NULL
。
Example:
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');
+-----------------+
| mask_ssn('909') |
+-----------------+
| NULL |
+-----------------+
随机数据生成功能
本节中的函数为不同类型的数据生成随机值。在可能的情况下,生成的值具有为演示或测试值保留的特性,以避免将其误认为合法数据。例如,gen_rnd_us_phone()返回使用 555 区号的美国电话 Numbers,该电话区号在实际使用中未分配给电话 Numbers。各个功能的描述描述了该原理的任何 exceptions。
生成从指定范围内选择的随机数。
Arguments:
-
lower
*:一个整数,指定范围的下边界。
-
upper
*:一个整数,指定范围的上限,且不得小于下限。
Return value:
从* lower
到 upper
(含)或NULL
的随机整数,如果 upper
参数小于 lower
*。
Example:
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
域中生成一个随机电子邮件地址。
Arguments:
None.
Return value:
随机电子邮件地址作为字符串。
Example:
mysql> SELECT gen_rnd_email();
+---------------------------+
| gen_rnd_email() |
+---------------------------+
| [email protected] |
+---------------------------+
生成一个随机的支付卡主帐号。该数字通过了 Luhn 校验(一种针对校验位执行校验和验证的算法)。
Warning
从gen_rnd_pan()返回的值应仅用于测试目的,不适合发布。无法保证给定的返回值未分配给合法的付款帐户。如果有必要发布gen_rnd_pan()结果,请考虑使用mask_pan()或mask_pan_relaxed()对其进行屏蔽。
Arguments:
-
size
:(可选)一个整数,指定结果的大小。如果未指定size
,则默认值为 16.如果提供,size
*必须是 12 到 19 之间的整数。
Return value:
随机付款 Numbers 作为字符串,如果给出的* size
*参数超出允许范围,则返回NULL
。
Example:
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
格式的随机美国社会安全 Numbers。 * AAA
部分大于 900, BB
*部分小于 70,这是合法的社会保险号未使用的 Feature。
Arguments:
None.
Return value:
随机的社会安全 Numbers,为字符串。
Example:
mysql> SELECT gen_rnd_ssn();
+---------------+
| gen_rnd_ssn() |
+---------------+
| 951-26-0058 |
+---------------+
生成1-555-AAA-BBBB
格式的随机美国电话 Numbers。 555 区号不用于合法电话 Numbers。
Arguments:
None.
Return value:
一个随机的美国电话 Numbers 作为字符串。
Example:
mysql> SELECT gen_rnd_us_phone();
+--------------------+
| gen_rnd_us_phone() |
+--------------------+
| 1-555-682-5423 |
+--------------------+
基于随机数据字典的函数
本节中的功能操作术语词典,并根据它们执行生成和掩盖操作。其中一些功能需要SUPER特权。
加载字典后,它将成为字典注册 table 的一部分,并被分配一个名称,以供其他字典功能使用。从每行包含一个术语的纯文本文件加载字典。空行将被忽略。为了有效,字典文件必须至少包含一个非空行。
用第二个词典中的术语替换一个词典中存在的术语,并返回替换术语。这通过替换掩盖了原始术语。
Arguments:
-
str
*:一个字符串,指示要替换的术语。
-
dictionary_name
*:一个字符串,用于命名包含要替换术语的字典。
-
replacement_dictionary_name
*:一个字符串,用于命名从中选择替换词的词典。
Return value:
从* replacement_dictionary_name
中随机选择的字符串来替换 str
,或 str
(如果它没有出现在 dictionary_name
*中),或NULL
(如果其中一个词典名称不在词典注册 table 中)。
如果要替换的术语出现在两个词典中,则返回值可能是相同的术语。
Example:
mysql> SELECT gen_blacklist('Berlin', 'DE_Cities', 'US_Cities');
+---------------------------------------------------+
| gen_blacklist('Berlin', 'DE_Cities', 'US_Cities') |
+---------------------------------------------------+
| Phoenix |
+---------------------------------------------------+
从字典中返回一个随机术语。
Arguments:
-
dictionary_name
*:一个字符串,用于命名从中选择术语的词典。
Return value:
字典中作为字符串的随机术语,如果字典名称不在字典注册 table 中,则为NULL
。
Example:
mysql> SELECT gen_dictionary('mydict');
+--------------------------+
| gen_dictionary('mydict') |
+--------------------------+
| My term |
+--------------------------+
mysql> SELECT gen_dictionary('no-such-dict');
+--------------------------------+
| gen_dictionary('no-such-dict') |
+--------------------------------+
| NULL |
+--------------------------------+
从字典注册 table 中删除字典。
此功能需要SUPER特权。
Arguments:
-
dictionary_name
*:一个字符串,用于命名要从字典注册 table 中删除的字典。
Return value:
指示放置操作是否成功的字符串。 Dictionary removed
table 示成功。 Dictionary removal error
table 示失败。
Example:
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 |
+-------------------------------------+
将文件加载到字典注册 table 中,并为字典分配一个名称,以与需要字典名称参数的其他功能一起使用。
此功能需要SUPER特权。
Important
字典不是持久性的。必须在每次服务器启动时加载应用程序使用的任何词典。
一旦加载到注册 table 中,即使基础词典文件发生更改,也将按原样使用词典。要重新加载字典,请先将其与gen_dictionary_drop()放在一起,然后再由gen_dictionary_load()对其进行加载。
Arguments:
-
dictionary_path
*:一个字符串,指定字典文件的路径名。
-
dictionary_name
*:为字典提供名称的字符串。
Return value:
指示加载操作是否成功的字符串。 Dictionary load success
table 示成功。 Dictionary load error
table 示失败。字典加载失败的发生可能有多种原因,其中包括:
-
具有给定名称的字典已经加载。
-
找不到字典文件。
-
词典文件不包含任何术语。
-
设置了secure_file_priv系统变量,并且字典文件不在该变量命名的目录中。
-
Example:
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 |
+-----------------------------------------+