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 removedtable 示成功。 Dictionary removal errortable 示失败。

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 successtable 示成功。 Dictionary load errortable 示失败。字典加载失败的发生可能有多种原因,其中包括:

  • 具有给定名称的字典已经加载。

    • 找不到字典文件。

    • 词典文件不包含任何术语。

    • 设置了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                   |
+-----------------------------------------+