在使用 MySQL Enterprise Data Masking and De-Identification 之前,请根据第 6.5.2 节“安装或卸载 MySQL Enterprise Data Masking and De-Identification”中提供的说明进行安装。
要在应用程序中使用 MySQL Enterprise Data Masking 和 De-Identification,请调用适合您希望执行的操作的函数。有关详细的功能说明,请参阅 第 6.5.5 节,“MySQL 企业数据屏蔽和去识别功能说明”。本节演示如何使用这些功能执行一些具有代表性的任务。它首先概述了可用函数,然后是一些如何在现实世界中使用这些函数的示例:
屏蔽数据以去除识别特征
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() |
+---------------------------+
| ayxnq.xmkpvvy@example.com |
+---------------------------+
复制
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 Enterprise Data Masking and De-Identification 使字典可以用作随机值的来源。要使用字典,必须首先从文件中加载它并为其命名。每个加载的字典都成为字典注册表的一部分。然后可以从注册的字典中选择项目并用作随机值或替代其他值。
有效的字典文件具有以下特征:
- 文件内容为纯文本,每行一个术语。
- 空行被忽略。
- 该文件必须至少包含一个术语。
假设名为的文件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 |
+-----+-------------+
复制
现在,代表只看到必要的内容,并且保护了客户隐私。
为什么CONVERT()
函数用于参数 mask_ssn()
?因为 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 |
+-----+-------------+
复制