暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

6.5.5 MySQL Enterprise 数据屏蔽和去标识化功能说明

原创 由迪 2021-09-22
524

MySQL Enterprise Data Masking and De-Identification 插件库包括多个功能,可分为以下几类:

从 MySQL 8.0.19 开始,这些函数支持latin1字符串参数和返回值的单字节 字符集。在 MySQL 8.0.19 之前,函数将字符串参数视为二进制字符串(这意味着它们不区分字母大小写),并且字符串返回值是二进制字符串。您可以看到返回值字符集的差异如下:

MySQL 8.0.19 及更高版本:

mysql> SELECT CHARSET(gen_rnd_email()); +--------------------------+ | CHARSET(gen_rnd_email()) | +--------------------------+ | latin1 | +--------------------------+

在 MySQL 8.0.19 之前:

mysql> SELECT CHARSET(gen_rnd_email()); +--------------------------+ | CHARSET(gen_rnd_email()) | +--------------------------+ | binary | +--------------------------+

对于任何版本,如果字符串返回值应该在不同的字符集中,则对其进行转换。以下示例显示了如何将 的结果转换 gen_rnd_email()utf8mb4字符集:

SET @email = CONVERT(gen_rnd_email() USING utf8mb4);

要显式生成二进制字符串(例如,生成类似于 8.0.19 之前的 MySQL 版本的结果),请执行以下操作:

SET @email = CONVERT(gen_rnd_email() USING binary);

可能还需要转换字符串参数,如 使用屏蔽数据进行客户识别中所示

如果从mysql客户端中调用 MySQL Enterprise Data Masking and De-Identification 函数 ,则二进制字符串结果使用十六进制表示法显示,具体取决于 --binary-as-hex. 有关该选项的更多信息,请参阅第 4.5.1 节,“mysql — MySQL 命令行客户端”

数据屏蔽功能

本节中的每个函数对其字符串参数执行屏蔽操作并返回屏蔽结果。

  • mask_inner(*str*, *margin1*, *margin2* [, *mask_char*\])

    屏蔽字符串的内部部分,保持两端不变,并返回结果。可以指定可选的掩码字符。

    参数:

    • str: 要屏蔽的字符串。

    • margin1: 一个非负整数,指定字符串左端要保持未屏蔽的字符数。如果值为 0,则没有左结束字符保持未屏蔽。

    • margin2: 一个非负整数,指定字符串右端要保持未屏蔽的字符数。如果值为 0,则没有右端字符保持未屏蔽。

    • mask_char:(可选)用于屏蔽的单个字符。默认为 'X'if *mask_char*未给出。

      掩码字符必须是单字节字符。尝试使用多字节字符会产生错误。

    返回值:

    掩码字符串,或者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:(可选)用于屏蔽的单个字符。默认为 'X'if *mask_char*未给出。

      掩码字符必须是单字节字符。尝试使用多字节字符会产生错误。

    返回值:

    掩码字符串,或者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##### | +---------------------------------+--------------------------------+
  • mask_pan(*str*)

    屏蔽支付卡主帐号并返回除最后四位数字以外的所有数字都由'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 | +-----------------+
  • mask_pan_relaxed(*str*)

    屏蔽支付卡主帐号,并返回除前六位和后四位以外的所有数字都被'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 | +-------------------------+
  • mask_ssn(*str*)

    屏蔽美国社会安全号码并返回该号码,除最后四位数字外的所有数字均由'X'字符替换 。

    参数:

    • str: 要屏蔽的字符串。该字符串的长度必须为 11 个字符,但不会以其他方式进行检查。

    返回值:

    作为字符串的掩码社会安全号码,或者 NULL如果参数长度不正确。

    例子:

    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区号的美国电话号码,实际使用的电话号码没有分配该区号。个别功能描述描述了此原则的任何例外情况。

  • gen_range(*lower*, *upper*)

    生成从指定范围中选择的随机数。

    参数:

    • lower:指定范围下边界的整数。
    • upper: 一个整数,指定范围的上边界,不得小于下边界。

    返回值:

    范围从*lower*到 的 随机整数 upper,包括 ,或者 NULL如果 *upper*参数小于 lower

    例子:

    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 | +-----------------+
  • gen_rnd_email()

    example.com域中生成随机电子邮件地址 。

    参数:

    没有任何。

    返回值:

    作为字符串的随机电子邮件地址。

    例子:

    mysql> SELECT gen_rnd_email(); +---------------------------+ | gen_rnd_email() | +---------------------------+ | ijocv.mwvhhuf@example.com | +---------------------------+
  • gen_rnd_pan([*size*\])

    生成随机支付卡主帐号。该数字通过 Luhn 校验(一种对校验位执行校验和验证的算法)。

    警告

    返回的值 gen_rnd_pan()应仅用于测试目的,不适合发布。无法保证给定的返回值不会分配给合法的支付帐户。如果有必要发布 gen_rnd_pan()结果,请考虑使用mask_pan()或 屏蔽它 mask_pan_relaxed()

    参数:

    • size:(可选)指定结果大小的整数。如果*size未给出,则默认值为 16 。如果给定,则size*必须是 12 到 19 范围内的整数。

    返回值:

    作为字符串的随机付款编号,或者 NULL如果*size* 给出了允许范围之外的参数。

    例子:

    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 | +-----------------+-----------------+
  • gen_rnd_ssn()

    以 格式生成随机的美国社会安全号码 。该部分大于900且部分小于70,这是不用于合法的社会保险号码特征。 *AAA*-*BB*-*CCCC*AAA**BB

    参数:

    没有任何。

    返回值:

    作为字符串的随机社会安全号码。

    例子:

    mysql> SELECT gen_rnd_ssn(); +---------------+ | gen_rnd_ssn() | +---------------+ | 951-26-0058 | +---------------+
  • gen_rnd_us_phone()

    以 格式生成随机美国电话号码 。555 区号不用于合法电话号码。 1-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*)

    用另一本词典中的词替换一本词典中的词,并返回替换词。这通过替换掩盖了原始术语。该函数在 MySQL 8.0.23 中已弃用;使用 gen_blocklist()来代替。

  • gen_blocklist(*str*, *dictionary_name*, *replacement_dictionary_name*)

    用另一本词典中的词替换一本词典中的词,并返回替换词。这通过替换掩盖了原始术语。该功能是在 MySQL 8.0.23 中添加的;用它代替 gen_blacklist().

    参数:

    • str: 指示要替换的术语的字符串。
    • dictionary_name: 命名包含要替换的术语的字典的字符串。
    • replacement_dictionary_name: 一个字符串,用于命名要从中选择替换词的字典。

    返回值:

    随机选择的字符串 replacement_dictionary_name作为 的替换str,或者 *str*如果它没有出现在 中 dictionary_name,或者 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 | +-----------------------------------------+
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论