在使用 MySQL Enterprise 数据脱敏和去识别之前,请按照 第 8.5.3.1 节,“MySQL Enterprise 数据脱敏和去识别插件安装” 中的说明进行安装。
要在应用程序中使用 MySQL Enterprise 数据脱敏和去识别,请调用适合您要执行的操作的函数。有关详细的函数描述,请参阅 第 8.5.3.4 节,“MySQL Enterprise 数据脱敏和去识别插件函数描述”。本节演示了如何使用这些函数来执行一些代表性的任务。它首先概述了可用的函数,然后提供了一些在现实世界中如何使用这些函数的示例。
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'
作为脱敏字符,但允许使用可选的脱敏字符参数
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# |
+-------------------------------------------+
专用脱敏函数
其他脱敏函数期望一个字符串参数,该参数表示特定类型的值,并对其进行脱敏以删除识别特征。
这里的示例使用返回适当类型值的随机值生成函数来提供函数参数。有关生成函数的更多信息,请参阅 生成具有特定特征的随机数据。
支付卡主账户号码脱敏。 脱敏函数提供对主账户号码的严格和宽松脱敏。
mask_pan()
对除了最后四位数字以外的所有数字进行脱敏mysql> SELECT mask_pan(gen_rnd_pan()); +-------------------------+ | mask_pan(gen_rnd_pan()) | +-------------------------+ | XXXXXXXXXXXX2461 | +-------------------------+
mask_pan_relaxed()
类似,但不脱敏指示支付卡发行机构的未脱敏的前六位数字mysql> SELECT mask_pan_relaxed(gen_rnd_pan()); +---------------------------------+ | mask_pan_relaxed(gen_rnd_pan()) | +---------------------------------+ | 770630XXXXXX0807 | +---------------------------------+
美国社会安全号码脱敏。 mask_ssn()
对除了最后四位数字以外的所有数字进行脱敏
mysql> SELECT mask_ssn(gen_rnd_ssn());
+-------------------------+
| mask_ssn(gen_rnd_ssn()) |
+-------------------------+
| XXX-XX-1723 |
+-------------------------+
几个函数生成随机值。这些值可用于测试,模拟等。
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()
返回一个随机的美国社会安全号码,其第一部分和第二部分分别从一个范围内随机选择,该范围不适用于合法的号码。
mysql> SELECT gen_rnd_ssn();
+---------------+
| gen_rnd_ssn() |
+---------------+
| 912-45-1615 |
+---------------+
gen_rnd_us_phone()
返回一个随机的美国电话号码,其区号为 555,不适用于合法的号码。
mysql> SELECT gen_rnd_us_phone();
+--------------------+
| gen_rnd_us_phone() |
+--------------------+
| 1-555-747-5627 |
+--------------------+
MySQL 企业版数据掩码和去标识允许将字典用作随机值的来源。要使用字典,必须先从文件加载字典并为其命名。每个加载的字典都成为字典注册表的一部分。然后,可以从注册的字典中选择项目,并将其用作随机值或用作其他值的替换项。
有效的字典文件具有以下特点:
文件内容为纯文本,每行一个术语。
空行将被忽略。
该文件必须包含至少一个术语。
假设一个名为 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()
将字典加载到字典注册表并为它们分配名称:
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_blocklist()
函数允许将一个字典中的术语替换为另一个字典中的术语,这会通过替换来影响掩码。其参数是要替换的术语、出现该术语的字典以及要从中选择替换项的字典。例如,要将美国城市替换为德国城市,反之亦然,请使用以下 gen_blocklist()
:
mysql> SELECT gen_blocklist('Munich', 'DE_Cities', 'US_Cities');
+---------------------------------------------------+
| gen_blocklist('Munich', 'DE_Cities', 'US_Cities') |
+---------------------------------------------------+
| Houston |
+---------------------------------------------------+
mysql> SELECT gen_blocklist('El Paso', 'US_Cities', 'DE_Cities');
+----------------------------------------------------+
| gen_blocklist('El Paso', 'US_Cities', 'DE_Cities') |
+----------------------------------------------------+
| Bremen |
+----------------------------------------------------+
如果要替换的术语不在第一个字典中,gen_blocklist()
将返回未修改的术语。
mysql> SELECT gen_blocklist('Moscow', 'DE_Cities', 'US_Cities');
+---------------------------------------------------+
| gen_blocklist('Moscow', 'DE_Cities', 'US_Cities') |
+---------------------------------------------------+
| Moscow |
+---------------------------------------------------+
在客户服务呼叫中心,一种常见的身份验证技术是要求客户提供其社会安全号码 (SSN) 的最后四位数字。例如,客户可能会说她的名字是 Joanna Bond,她的最后四位 SSN 数字是 0007
。
假设一个包含客户记录的 customer
表具有以下列:
id
:客户 ID 号码。first_name
:客户名。last_name
:客户姓氏。ssn
:客户社会安全号码。
例如,该表可以定义如下:
CREATE TABLE customer
(
id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
first_name VARCHAR(40),
last_name VARCHAR(40),
ssn VARCHAR(11)
);
客户服务代表用来检查客户 SSN 的应用程序可能会执行类似以下的查询:
mysql> SELECT id, ssn
mysql> FROM customer
mysql> WHERE first_name = 'Joanna' AND last_name = 'Bond';
+-----+-------------+
| id | ssn |
+-----+-------------+
| 786 | 906-39-0007 |
+-----+-------------+
但是,这会将 SSN 公开给客户服务代表,而客户服务代表只需要查看最后四位数字。相反,应用程序可以使用以下查询仅显示掩码后的 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 |
+-----+-------------+
现在,代表只能看到必要的信息,客户的隐私得以保护。
为什么对 mask_ssn()
的参数使用 CONVERT()
函数?因为 mask_ssn()
需要长度为 11 的参数。因此,即使 ssn
被定义为 VARCHAR(11)
,如果 ssn
列具有多字节字符集,那么在传递给可加载函数时,它可能看起来比 11 字节长,并会导致错误。将值转换为二进制字符串可确保函数看到长度为 11 的参数。
当字符串参数没有单字节字符集时,其他数据掩码函数可能也需要类似的技术。
如果表的掩码数据用于多个查询,那么定义一个生成掩码数据的视图可能很方便。这样,应用程序就可以从视图中选择,而无需在各个查询中执行掩码。
例如,可以对上一节中的 customer
表定义一个掩码视图,如下所示:
CREATE VIEW masked_customer AS
SELECT id, first_name, last_name,
mask_ssn(CONVERT(ssn USING binary)) AS masked_ssn
FROM customer;
然后,查找客户的查询变得更简单,但仍然返回掩码数据:
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 |
+-----+-------------+