在使用MySQL企业数据屏蔽和去识别之前,请根据章节6.5.2“安装或卸载MySQL企业数据屏蔽和去识别”.
要在应用程序中使用MySQL企业数据屏蔽和去识别,请调用适合于您希望执行的操作的函数。详细功能描述请参见章节6.5.5,“MySQL企业数据屏蔽和去识别功能描述”.本节演示如何使用这些函数来执行一些有代表性的任务。它首先概述了可用的函数,然后是一些函数如何在实际环境中使用的示例:
MySQL提供了屏蔽任意字符串的通用屏蔽函数,以及屏蔽特定类型值的专用屏蔽函数。
通用屏蔽功能
mask_inner ()
而且mask_outer ()
是通用函数,根据字符串中的位置来屏蔽任意字符串的部分:
mask_inner ()
隐藏其字符串参数的内部,不隐藏结尾。其他参数指定未掩码端点的大小。mysql> SELECT mask_inner('This is a string', 5,1);+--------------------------------------+ | mask_inner(“这是一个字符串”5 1 ) | +--------------------------------------+ | 这XXXXXXXXXXg | +--------------------------------------+ mysql >选择mask_inner(“这是一个字符串”,1 5);+--------------------------------------+ | mask_inner(“这是一个字符串”,1、5 ) | +--------------------------------------+ | TXXXXXXXXXXtring | +--------------------------------------+
mask_outer ()
做相反的操作,屏蔽其字符串参数的端点,保留内部未屏蔽。其他参数指定掩码端点的大小。mysql> SELECT mask_outer('This is a string', 5,1);+--------------------------------------+ | mask_outer(“这是一个字符串”5 1 ) | +--------------------------------------+ | XXXXXis一strinX | +--------------------------------------+ mysql >选择mask_outer(“这是一个字符串”,1 5);+--------------------------------------+ | mask_outer(“这是一个字符串”,1、5 ) | +--------------------------------------+ | Xhis是sXXXXX | +--------------------------------------+
默认情况下,mask_inner ()
而且mask_outer ()
使用“X”
作为掩码字符,但允许一个可选的掩码字符参数:
mysql> SELECT mask_inner('This is a string', 5,1, '*');+-------------------------------------------+ | mask_inner(“这是一个字符串”5 1 , '*') | +-------------------------------------------+ | 这 ********** g | +-------------------------------------------+ mysql >选择mask_outer(这是一个字符串,5,1,' # ');+-------------------------------------------+ | mask_outer(“这是一个字符串”5 1 , '#') | +-------------------------------------------+ | ##### 是一个撑 # | +-------------------------------------------+
专用屏蔽功能
其他屏蔽函数需要表示特定类型值的字符串参数,并对其进行屏蔽以删除标识特征。
这里的示例使用返回适当类型值的随机值生成函数提供函数参数。有关生成函数的更多信息,请参见生成具有特定特征的随机数据.
支付卡主账号掩码。屏蔽功能提供严格和宽松的屏蔽主账号。
mask_pan ()
除数字的最后四位数外,其他所有数字都被屏蔽:mysql> SELECT mask_pan(gen_rnd_pan());+-------------------------+ | mask_pan (gen_rnd_pan ()) | +-------------------------+ | XXXXXXXXXXXX2461 | +-------------------------+
mask_pan_relaxed ()
类似,但不会屏蔽表示已解密的支付卡发行机构的前六位数字:mysql> SELECT mask_pan_relax (gen_rnd_pan())+---------------------------------+ | mask_pan_relaxed (gen_rnd_pan ()) | +---------------------------------+ | 770630 xxxxxx0807 | +---------------------------------+
美国社会安全号码屏蔽。mask_ssn ()
除数字的最后四位数外,其他所有数字都被屏蔽:
SELECT mask_ssn(gen_rnd_ssn());+-------------------------+ | mask_ssn (gen_rnd_ssn ()) | +-------------------------+ | xxx - xx - 1723 | +-------------------------+
有几个函数生成随机值。这些值可以用于测试、模拟等等。
gen_range ()
返回从给定范围中选择的随机整数:
mysql> SELECT gen_range(1,10);+------------------+ | gen_range (10 ) | +------------------+ | 6 | +------------------+
gen_rnd_email ()
中的随机电子邮件地址example.com
域:
SELECT gen_rnd_email();+---------------------------+ | gen_rnd_email () | +---------------------------+ | ayxnq.xmkpvvy@example.com | +---------------------------+
gen_rnd_pan ()
返回一个随机的支付卡
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区号中的随机美国电话号码,不用于合法号码:
SELECT gen_rnd_us_phone();+--------------------+ | gen_rnd_us_phone () | +--------------------+ | 1-555-747-5627 | +--------------------+
MySQL企业数据屏蔽和去识别允许字典用作随机值的来源。要使用字典,首先必须从文件中加载它,并给它一个名称。每个加载的字典都成为字典注册表的一部分。然后可以从注册字典中选择项,并将其用作随机值或替换其他值。
一个有效的字典文件具有以下特征:
文件内容是纯文本,每行一个术语。
空行将被忽略。
该文件必须至少包含一个术语。
假设一个名为de_cities.txt
包含这些德国城市的名字:
柏林,慕尼黑,不莱梅
还假设一个名为us_cities.txt
包含这些美国城市的名字:
芝加哥休斯顿菲尼克斯埃尔帕索底特律
假设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 /地方/ mysql / mysql-files / de_cities.txt’,‘DE_Cities ') | +--------------------------------------------------------------------------------+ | 字典加载成功 | +--------------------------------------------------------------------------------+ mysql >选择gen_dictionary_load(“/ usr /地方/ mysql / mysql-files / us_cities.txt ', ' US_Cities ');+--------------------------------------------------------------------------------+ | gen_dictionary_load(“/ usr /地方/ mysql / mysql-files / us_cities.txt’,‘US_Cities ') | +--------------------------------------------------------------------------------+ | 字典加载成功 | +--------------------------------------------------------------------------------+
若要从字典中随机选择一个术语,请使用gen_dictionary ()
:
SELECT gen_dictionary('DE_Cities');+-----------------------------+ | gen_dictionary(“DE_Cities ') | +-----------------------------+ | 柏林 | +-----------------------------+ mysql >选择gen_dictionary(“US_Cities”);+-----------------------------+ | gen_dictionary(“US_Cities ') | +-----------------------------+ | 凤凰城 | +-----------------------------+
要从多个字典中随机选择一个词,请随机选择其中一个字典,然后从中选择一个词:
mysql> SELECT gen_dictionary(ELT(gen_range(1,2), 'DE_Cities', 'US_Cities'));+---------------------------------------------------------------+ | gen_dictionary(英语教学(gen_range(1、2),‘DE_Cities’,‘US_Cities ')) | +---------------------------------------------------------------+ | 底特律 | +---------------------------------------------------------------+ mysql >选择gen_dictionary(英语教学(gen_range(1、2),' DE_Cities ', ' US_Cities '));+---------------------------------------------------------------+ | gen_dictionary(英语教学(gen_range(1、2),‘DE_Cities’,‘US_Cities ')) | +---------------------------------------------------------------+ | 不莱梅 | +---------------------------------------------------------------+
的gen_blocklist ()
函数允许将一个字典中的术语替换为另一个字典中的术语,这将通过替换来影响屏蔽。它的参数是要替换的词、出现该词的字典,以及选择替换词的字典。例如,要将一个美国城市替换为一个德国城市,反之亦然,使用gen_blocklist ()
是这样的:
mysql> SELECT gen_blocklist('慕尼黑','DE_Cities', 'US_Cities');+---------------------------------------------------+ | gen_blocklist(“慕尼黑”,“DE_Cities”、“US_Cities ') | +---------------------------------------------------+ | 休斯顿 | +---------------------------------------------------+ mysql >选择gen_blocklist(埃尔帕索,“US_Cities”,“DE_Cities”);+----------------------------------------------------+ | gen_blocklist(埃尔帕索,US_Cities, DE_Cities ') | +----------------------------------------------------+ | 不莱梅 | +----------------------------------------------------+
如果要替换的词不在第一本词典中,gen_blocklist ()
原封不动地返回:
mysql> SELECT gen_blocklist(“莫斯科”,“DE_Cities”,“US_Cities”);+---------------------------------------------------+ | gen_blocklist(“莫斯科”,“DE_Cities”、“US_Cities ') | +---------------------------------------------------+ | 莫斯科 | +---------------------------------------------------+
在客户服务呼叫中心,一种常见的身份验证技术是要求客户提供他们的社会安全号码(SSN)的最后四个数字。例如,一位客户可能会说她的名字是Joanna Bond,她的SSN最后四个数字是0007
.
假设a客户
包含客户记录的表有这些列:
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的应用程序可能执行这样的查询:
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 FROM customer mysql> WHERE first_name = 'Joanna' AND last_name = 'Bond';+-----+-------------+ | id | masked_ssn | +-----+-------------+ | 786 | xxx - xx - 0007 | +-----+-------------+
现在,销售代表只看到必要的东西,客户的隐私得到了保护。
为什么将()
参数to使用的函数mask_ssn ()
?因为mask_ssn ()
需要一个长度为11的参数。因此,即使ssn
定义为VARCHAR (11)
,如果ssn
列具有多字节字符集,在传递给可加载函数时,它可能看起来比11字节长,并发生错误。将值转换为二进制字符串可确保函数看到一个长度为11的参数。
当字符串参数没有单字节字符集时,其他数据屏蔽函数可能需要类似的技术。
如果一个表中的屏蔽数据用于多个查询,那么定义一个产生屏蔽数据的视图可能会很方便。这样,应用程序就可以从视图中进行选择,而不必在各个查询中执行屏蔽。
控件上的屏蔽视图客户
前一节中的表可以这样定义:
CREATE VIEW masked_customer AS SELECT id, first_name, last_name, mask_ssn(转换(ssn使用二进制))AS masked_ssn FROM customer;
然后查找客户的查询变得更简单,但仍然返回屏蔽数据:
mysql> SELECT id, FROM masked_customer mysql> WHERE first_name = 'Joanna' AND last_name = 'Bond';+-----+-------------+ | id | masked_ssn | +-----+-------------+ | 786 | xxx - xx - 0007 | +-----+-------------+