6.4.7.3 使用 MySQL 企业数据屏蔽和取消标识

在使用 MySQL 企业数据屏蔽和取消标识之前,请按照第 6.4.7.2 节“安装或卸载 MySQL 企业数据屏蔽和取消标识”提供的说明进行安装。

要在应用程序中使用 MySQL Enterprise Data Masking 和 De-Identification,请调用适合您要执行的操作的功能。有关详细的功能说明,请参见第 6.4.7.4 节“ MySQL 企业数据屏蔽和取消标识用户定义函数参考”。本节演示如何使用功能执行一些代 table 性的任务。首先,它概述了可用的功能,然后给出了在现实环境中如何使用这些功能的一些示例:

屏蔽数据以删除标识 Feature

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'作为掩码字符,但允许使用可选的 masking-character 参数:

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#                          |
+-------------------------------------------+
特殊用途的遮罩功能

其他屏蔽函数希望使用字符串参数来 table 示特定类型的值,并对其进行屏蔽以删除识别 Feature。

Note

此处的示例使用返回适当类型值的随机值生成函数提供函数参数。有关生成函数的更多信息,请参见生成具有特定 Feature 的随机数据

支付卡主帐号屏蔽. 屏蔽功能提供对主帐号的严格且宽松的屏蔽。

  • mask_pan()除数字的最后四位数外,将全部屏蔽:
mysql> SELECT mask_pan(gen_rnd_pan());
+-------------------------+
| mask_pan(gen_rnd_pan()) |
+-------------------------+
| XXXXXXXXXXXX2461        |
+-------------------------+
  • mask_pan_relaxed()类似,但不会屏蔽 table 示支付卡发行者未屏蔽的前六位数字:
mysql> SELECT mask_pan_relaxed(gen_rnd_pan());
+---------------------------------+
| mask_pan_relaxed(gen_rnd_pan()) |
+---------------------------------+
| 770630XXXXXX0807                |
+---------------------------------+

美国社会安全 Numbers 屏蔽. mask_ssn()屏蔽数字的所有字符,但最后四位除外:

mysql> SELECT mask_ssn(gen_rnd_ssn());
+-------------------------+
| mask_ssn(gen_rnd_ssn()) |
+-------------------------+
| XXX-XX-1723             |
+-------------------------+
生成具有特定 Feature 的随机数据

几个函数生成随机值。这些值可用于测试,仿真等。

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()           |
+---------------------------+
| [email protected] |
+---------------------------+

gen_rnd_pan()返回随机的支付卡主帐号:

mysql> SELECT gen_rnd_pan();

(未显示gen_rnd_pan()函数结果,因为其返回值应仅用于测试目的,而不能用于发布。不能保证该数字未分配给合法的付款帐户。)

gen_rnd_ssn()返回一个随机的美国社会安全 Numbers,其第一部分和第二部分分别从不用于合法数字的范围中选择:

mysql> SELECT gen_rnd_ssn();
+---------------+
| gen_rnd_ssn() |
+---------------+
| 912-45-1615   |
+---------------+

gen_rnd_us_phone()返回 555 区号中不用于合法 Numbers 的随机美国电话 Numbers:

mysql> SELECT gen_rnd_us_phone();
+--------------------+
| gen_rnd_us_phone() |
+--------------------+
| 1-555-747-5627     |
+--------------------+
使用字典生成随机数据

MySQL Enterprise Data Masking and De-Identification 使字典可以用作随机值的来源。要使用字典,必须首先从文件中加载字典并指定名称。每个加载的词典都将成为词典注册 table 的一部分。然后可以从注册词典中选择项目,并用作随机值或替代其他值。

有效的字典文件具有以下 Feature:

  • 文件内容为纯文本,每行一词。

  • 空行将被忽略。

  • 该文件必须至少包含一个术语。

假设名为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()将字典加载到字典注册 table 中并为其分配名称:

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_blacklist()函数使一个词典中的术语可以被另一词典中的术语替换,从而通过替换进行掩蔽。它的自变量是要替换的术语,出现该术语的字典以及从中选择替换的字典。例如,要将美国城市替换为德国城市,反之亦然,请使用gen_blacklist(),如下所示:

mysql> SELECT gen_blacklist('Munich', 'DE_Cities', 'US_Cities');
+---------------------------------------------------+
| gen_blacklist('Munich', 'DE_Cities', 'US_Cities') |
+---------------------------------------------------+
| Houston                                           |
+---------------------------------------------------+
mysql> SELECT gen_blacklist('El Paso', 'US_Cities', 'DE_Cities');
+----------------------------------------------------+
| gen_blacklist('El Paso', 'US_Cities', 'DE_Cities') |
+----------------------------------------------------+
| Bremen                                             |
+----------------------------------------------------+

如果替换项不在第一个字典中,则gen_blacklist()不变。

mysql> SELECT gen_blacklist('Moscow', 'DE_Cities', 'US_Cities');
+---------------------------------------------------+
| gen_blacklist('Moscow', 'DE_Cities', 'US_Cities') |
+---------------------------------------------------+
| Moscow                                            |
+---------------------------------------------------+
使用屏蔽数据识别 Client

在 Client 服务呼叫中心,一种常见的身份验证技术是要求 Client 提供其最后四个社会安全 Numbers(SSN)数字。例如,Client 可能说她的名字叫乔安娜·邦德,而她的最后四个 SSN 数字是0007

假设包含 Client 记录的customertable 具有以下列:

  • id:ClientID 号。

  • first_name:Client 的名字。

  • last_name:Client 的姓氏。

  • ssn:Client 社会安全 Numbers。

例如,该 table 可能定义如下:

CREATE TABLE customer
(
  id         BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  first_name VARCHAR(40),
  last_name  VARCHAR(40),
  ssn        VARCHAR(11)
);

Client 服务代 table 用来检查 ClientSSN 的应用程序可能会执行以下查询:

mysql> SELECT id, ssn
mysql> FROM customer
mysql> WHERE first_name = 'Joanna' AND last_name = 'Bond';
+-----+-------------+
| id  | ssn         |
+-----+-------------+
| 786 | 906-39-0007 |
+-----+-------------+

但是,这会将 SSN 暴露给 Client 服务代 table,该 Client 服务代 table 除了最后四位数字外无需查看其他任何内容。而是,应用程序可以使用此查询仅显示被屏蔽的 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 |
+-----+-------------+

现在,代 table 仅看到必要的内容,并且保留了 Client 隐私。

为什么将CONVERT()函数用作mask_ssn()的参数?因为mask_ssn()要求参数的长度为 11.因此,即使ssn定义为VARCHAR(11),但如果ssn列具有多字节字符集,则在传递给 UDF 时它看起来可能会超过 11 个字节,并且会发生错误。将值转换为二进制字符串可确保 UDF 看到长度为 11 的参数。

当字符串参数没有单字节字符集时,其他数据屏蔽功能可能需要类似的技术。

创建显示屏蔽数据的视图

如果将来自 table 的屏蔽数据用于多个查询,则定义生成屏蔽数据的视图可能会很方便。这样,应用程序可以从视图中进行选择,而无需在单个查询中执行屏蔽操作。

例如,上一节中的customertable 上的遮罩视图可以这样定义:

CREATE VIEW masked_customer AS
SELECT id, first_name, last_name,
mask_ssn(CONVERT(ssn USING binary)) AS masked_ssn
FROM customer;

然后,查询 Client 的查询变得更简单,但仍返回被屏蔽的数据:

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