10bet网址
MySQL 8.0参考手册
相关的文档10bet官方网站 下载本手册 本手册节选

MySQL 8.0参考手册/.../ 使用MySQL企业数据屏蔽和去识别

6.5.3使用MySQL企业数据屏蔽和去识别

在使用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  | +-----+-------------+