• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • MySQL企业数据屏蔽和取消标识

    注意

    MySQL Enterprise Data Masking and De-Identification是商业产品MySQL Enterprise Edition中包含的扩展。要了解有关商业产品的更多信息,请访问https://www.mysql.com/products/。

    从MySQL 8.0.13开始,MySQL Enterprise Edition提供了数据屏蔽和取消标识功能:

    • 转换现有数据以掩盖数据并删除识别特征,例如将信用卡号的所有数字(但最后四个数字改为'X'字符)更改。
    • 生成随机数据,例如电子邮件地址和支付卡号。

    应用程序使用这些功能的方式取决于数据的使用目的和访问者:

    • 使用敏感数据的应用程序可以通过执行数据屏蔽并允许将部分屏蔽的数据用于客户端标识来对其进行保护。示例:呼叫中心可能会要求客户提供其最后四个社会安全号码。
    • 需要正确格式化数据(但不一定是原始数据)的应用程序可以合成样本数据。示例:正在测试数据验证器但无法访问原始数据的应用程序开发人员可以合成具有相同格式的随机数据。

    范例1:

    医学研究机构可以保存包含个人数据和医学数据的患者数据。这可能包括遗传序列(长字符串),以JSON格式存储的测试结果以及其他数据类型。尽管数据可能主要由自动化分析软件使用,但仍然可以访问基因组数据或特定患者的测试结果。在这种情况下,应使用数据屏蔽来使此信息无法个人识别。

    范例2:

    信用卡处理公司使用敏感数据提供一组服务,例如:

    • 每秒处理大量金融交易。
    • 存储大量与交易相关的数据。
    • 通过对个人数据的严格要求来保护与交易有关的数据。
    • 使用可逆或部分屏蔽的数据处理客户对交易的投诉。

    典型的交易可能包括许多类型的敏感信息,包括:

    • 信用卡号。
    • 交易类型和金额。
    • 商家类型。
    • 交易密码(用于确认交易合法性)。
    • 配备GPS的终端的地理位置(用于欺诈检测)。

    然后,可以将这些类型的信息与客户个人数据一起加入银行或其他发卡金融机构中,例如:

    • 客户全名(个人或公司)。
    • 地址。
    • 出生日期。
    • 社会安全号码。
    • 电子邮件地址。
    • 电话号码。

    卡处理公司和金融机构中的各种员工角色都需要访问该数据。其中一些角色可能只需要访问被屏蔽的数据。其他角色可能需要视情况访问原始数据,该原始数据记录在审核日志中。

    屏蔽和取消标识是合规性的核心,因此MySQL企业数据屏蔽和取消标识可以帮助应用程序开发人员满足隐私要求:

    • PCI – DSS:支付卡数据。
    • HIPAA:健康数据的隐私权,《经济和临床健康的健康信息技术法案》(HITECH法案)。
    • 欧盟通用数据保护指令(GDPR):个人数据保护。
    • 数据保护法(英国):保护个人数据。
    • Sarbanes Oxley,GLBA,《 1998年美国爱国者法案》,《身份盗用和假设威慑法案》。
    • FERPA –学生资料,NASD,CA SB1386和AB 1950,州数据保护法,巴塞尔协议II。

    以下各节描述了MySQL企业数据屏蔽和取消标识的组件,讨论了如何安装和使用它,并提供了其组件的参考信息。

    MySQL企业数据屏蔽和取消标识组件

    MySQL Enterprise Data Masking and De-Identification基于实现以下组件的插件库:

    • 一个名为的服务器端插件data_masking
    • 一组用户定义函数(UDF)提供了SQL级API,用于执行屏蔽和取消标识操作。其中一些功能需要SUPER特权。

    安装或卸载MySQL Enterprise Data Masking和De-Identification

    本节介绍如何安装或卸载MySQL Enterprise Data Masking and De-Identification,这是作为包含插件和用户定义函数(UDF)的插件库文件实现的。有关安装或卸载插件和UDF的一般信息,请参见“MySQL服务器插件”和“安装和卸载用户定义的功能”。

    要由服务器使用,插件库文件必须位于MySQL插件目录(由plugin_dir系统变量命名的目录)中。如有必要,通过设置plugin_dir服务器启动时的值来配置插件目录位置。

    插件库文件的基本名称为data_masking。每个平台的文件名后缀都不同(例如,.so对于Unix和类似Unix的系统,.dll对于Windows)。

    要安装MySQL Enterprise Data Masking and De-Identification插件和UDF,请使用INSTALL PLUGIN nd CREATE FUNCTION语句(.so根据需要调整平台的后缀):

    INSTALL PLUGIN data_masking SONAME 'data_masking.so';
    CREATE FUNCTION gen_blacklist RETURNS STRING
    SONAME 'data_masking.so';
    CREATE FUNCTION gen_dictionary RETURNS STRING
    SONAME 'data_masking.so';
    CREATE FUNCTION gen_dictionary_drop RETURNS STRING
    SONAME 'data_masking.so';
    CREATE FUNCTION gen_dictionary_load RETURNS STRING
    SONAME 'data_masking.so';
    CREATE FUNCTION gen_range RETURNS INTEGER
    SONAME 'data_masking.so';
    CREATE FUNCTION gen_rnd_email RETURNS STRING
    SONAME 'data_masking.so';
    CREATE FUNCTION gen_rnd_pan RETURNS STRING
    SONAME 'data_masking.so';
    CREATE FUNCTION gen_rnd_ssn RETURNS STRING
    SONAME 'data_masking.so';
    CREATE FUNCTION gen_rnd_us_phone RETURNS STRING
    SONAME 'data_masking.so';
    CREATE FUNCTION mask_inner RETURNS STRING
    SONAME 'data_masking.so';
    CREATE FUNCTION mask_outer RETURNS STRING
    SONAME 'data_masking.so';
    CREATE FUNCTION mask_pan RETURNS STRING
    SONAME 'data_masking.so';
    CREATE FUNCTION mask_pan_relaxed RETURNS STRING
    SONAME 'data_masking.so';
    CREATE FUNCTION mask_ssn RETURNS STRING
    SONAME 'data_masking.so';
    

    如果插件和UDF在主复制服务器上使用,请在所有从属服务器上也安装它们,以避免复制问题。

    如前所述安装后,插件和UDF将保持安装状态,直到被卸载。要删除它们,请使用UNINSTALL PLUGIN nd DROP FUNCTION语句:

    UNINSTALL PLUGIN data_masking;
    DROP FUNCTION gen_blacklist;
    DROP FUNCTION gen_dictionary;
    DROP FUNCTION gen_dictionary_drop;
    DROP FUNCTION gen_dictionary_load;
    DROP FUNCTION gen_range;
    DROP FUNCTION gen_rnd_email;
    DROP FUNCTION gen_rnd_pan;
    DROP FUNCTION gen_rnd_ssn;
    DROP FUNCTION gen_rnd_us_phone;
    DROP FUNCTION mask_inner;
    DROP FUNCTION mask_outer;
    DROP FUNCTION mask_pan;
    DROP FUNCTION mask_pan_relaxed;
    DROP FUNCTION mask_ssn;
    

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

    在使用MySQL企业数据屏蔽和取消标识之前,请根据“安装或卸载MySQL企业数据屏蔽和取消标识”中的说明进行安装。

    要在应用程序中使用MySQL企业数据屏蔽和取消标识,请调用适合您要执行的操作的功能。有关功能的详细说明,请参见“ 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_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                                             |
    +---------------------------------------------------	+
    
    使用屏蔽数据进行客户识别

    在客户服务呼叫中心,一种常用的身份验证技术是要求客户提供其最后四个社会安全号码(SSN)数字。例如,客户可能说她的名字叫乔安娜·邦德,而她的最后四个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列具有多字节字符集,传递给UDF时,它看起来也可能超过11个字节,并且会发生错误。将值转换为二进制字符串可确保UDF看到长度为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  |
    +-----	+-------------	+
    

    MySQL企业数据屏蔽和取消标识用户定义函数参考

    MySQL Enterprise Data Masking and De-Identification插件库包含几个用户定义的函数(UDF),可以将其分为以下几类:

    • 数据屏蔽功能
    • 随机数据生成功能
    • 基于随机数据字典的函数

    从MySQL 8.0.19开始,这些UDF支持latin1字符串参数和返回值的单字节字符集。在MySQL 8.0.19之前,UDF将字符串参数视为二进制字符串(这意味着它们不区分大小写),而字符串返回值是二进制字符串。您可以看到返回值字符集的差异,如下所示:

    MySQL 8.0.19及更高版本:

    mysql> SELECT CHARSET(gen_rnd_email());
    +--------------------------	+
    | CHARSET(gen_rnd_email())  |
    +--------------------------	+
    | latin1                    |
    +--------------------------	+
    

    在MySQL 8.0.19之前:

    mysql> SELECT CHARSET(gen_rnd_email());
    +--------------------------	+
    | CHARSET(gen_rnd_email())  |
    +--------------------------	+
    | binary                    |
    +--------------------------	+
    

    对于任何版本,如果字符串返回值应使用不同的字符集,请对其进行转换。以下示例显示如何将的结果转换gen_rnd_email()utf8mb4字符集:

    SET @email = CONVERT(gen_rnd_email() USING utf8mb4);
    

    可能还需要转换字符串参数,如使用屏蔽数据进行客户标识中所示。

    数据屏蔽功能

    本节中的每个函数都对其字符串参数执行屏蔽操作,并返回屏蔽的结果。

    • mask_inner(str,margin1,margin2[,mask_char])

      遮盖字符串的内部,使两端不受影响,并返回结果。可以指定一个可选的屏蔽字符。

      参数:

      • str:要屏蔽的字符串。
      • margin1:一个非负整数,它指定字符串左端要保持未屏蔽状态的字符数。如果值为0,则没有左端字符保持未屏蔽状态。
      • margin2:一个非负整数,它指定字符串右端要保持未屏蔽状态的字符数。如果值为0,则没有右端字符保持未屏蔽状态。
      • mask_char:(可选)用于掩蔽的单个字符。默认值为'X'if mask_char,未给出。

        屏蔽字符必须是单字节字符。尝试使用多字节字符会产生错误。

      返回值:

      被屏蔽的字符串,或者NULL任何一个空白为负。

      如果边距值的总和大于参数长度,则不会发生掩码,并且参数将保持不变。

      例:

      mysql> SELECT mask_inner('abcdef', 1, 2), mask_inner('abcdef',0, 5);
      +----------------------------	+---------------------------	+
      | mask_inner('abcdef', 1, 2)  | mask_inner('abcdef',0, 5)  |
      +----------------------------	+---------------------------	+
      | aXXXef                      | Xbcdef                     |
      +----------------------------	+---------------------------	+
      mysql> SELECT mask_inner('abcdef', 1, 2, '*'), mask_inner('abcdef',0, 5, '#');
      +---------------------------------	+--------------------------------	+
      | mask_inner('abcdef', 1, 2, '*')  | mask_inner('abcdef',0, 5, '#')  |
      +---------------------------------	+--------------------------------	+
      | a***ef                           | #bcdef                          |
      +---------------------------------	+--------------------------------	+
      
    • mask_outer(str,margin1,margin2[,mask_char])

      遮罩字符串的左端和右端,不遮罩内部,并返回结果。可以指定一个可选的屏蔽字符。

      参数:

      • str:要屏蔽的字符串。
      • margin1:一个非负整数,指定要屏蔽的字符串左端的字符数。如果值为0,则不会屏蔽左端字符。
      • margin2:一个非负整数,它指定要屏蔽的字符串右端的字符数。如果值为0,则不会屏蔽任何右端字符。
      • mask_char:(可选)用于掩蔽的单个字符。默认值为'X'if mask_char,未给出。

        屏蔽字符必须是单字节字符。尝试使用多字节字符会产生错误。

      返回值:

      被屏蔽的字符串,或者NULL任何一个空白为负。

      如果边距值的总和大于参数长度,则将屏蔽整个参数。

      例:

      mysql> SELECT mask_outer('abcdef', 1, 2), mask_outer('abcdef',0, 5);
      +----------------------------	+---------------------------	+
      | mask_outer('abcdef', 1, 2)  | mask_outer('abcdef',0, 5)  |
      +----------------------------	+---------------------------	+
      | XbcdXX                      | aXXXXX                     |
      +----------------------------	+---------------------------	+
      mysql> SELECT mask_outer('abcdef', 1, 2, '*'), mask_outer('abcdef',0, 5, '#');
      +---------------------------------	+--------------------------------	+
      | mask_outer('abcdef', 1, 2, '*')  | mask_outer('abcdef',0, 5, '#')  |
      +---------------------------------	+--------------------------------	+
      | *bcd**                           | a#####                          |
      +---------------------------------	+--------------------------------	+
      
    • mask_pan(str)

      屏蔽支付卡的主帐号并返回该号码,除最后四位数字外的所有数字均用'X'字符替换。

      参数:

      • str:要屏蔽的字符串。该字符串必须是主帐号的合适长度,但未经其他检查。

      返回值:

      掩码的付款号码为字符串。如果参数比要求的短,则返回原样。

      例:

      mysql> SELECT mask_pan(gen_rnd_pan());
      +-------------------------	+
      | mask_pan(gen_rnd_pan())  |
      +-------------------------	+
      | XXXXXXXXXXXX9102         |
      +-------------------------	+
      mysql> SELECT mask_pan(gen_rnd_pan(19));
      +---------------------------	+
      | mask_pan(gen_rnd_pan(19))  |
      +---------------------------	+
      | XXXXXXXXXXXXXXX8268        |
      +---------------------------	+
      mysql> SELECT mask_pan('a*Z');
      +-----------------	+
      | mask_pan('a*Z')  |
      +-----------------	+
      | a*Z              |
      +-----------------	+
      
    • mask_pan_relaxed(str)

      屏蔽支付卡的主帐号并返回该号码,除了前六位和后四位以外的所有数字都用'X'字符替换。前六位数字表示支付卡发行者。

      参数:

      • str:要屏蔽的字符串。该字符串必须是主帐号的合适长度,但未经其他检查。

      返回值:

      掩码的付款号码为字符串。如果参数比要求的短,则返回原样。

      例:

      mysql> SELECT mask_pan_relaxed(gen_rnd_pan());
      +---------------------------------	+
      | mask_pan_relaxed(gen_rnd_pan())  |
      +---------------------------------	+
      | 551279XXXXXX3108                 |
      +---------------------------------	+
      mysql> SELECT mask_pan_relaxed(gen_rnd_pan(19));
      +-----------------------------------	+
      | mask_pan_relaxed(gen_rnd_pan(19))  |
      +-----------------------------------	+
      | 462634XXXXXXXXX6739                |
      +-----------------------------------	+
      mysql> SELECT mask_pan_relaxed('a*Z');
      +-------------------------	+
      | mask_pan_relaxed('a*Z')  |
      +-------------------------	+
      | a*Z                      |
      +-------------------------	+
      
    • mask_ssn(str)

      掩盖美国社会保险号,并返回该数字,除最后四位外的所有数字都用'X'字符替换。

      参数:

      • str:要屏蔽的字符串。该字符串必须为11个字符长,但未经其他检查。

      返回值:

      带掩码的社会安全号码为字符串,或者NULL自变量长度不正确。

      例:

      mysql> SELECT mask_ssn('909-63-6922'), mask_ssn('abcdefghijk');
      +-------------------------	+-------------------------	+
      | mask_ssn('909 -63 -6922')  | mask_ssn('abcdefghijk')  |
      +-------------------------	+-------------------------	+
      | XXX -XX -6922              | XXX -XX -hijk              |
      +-------------------------	+-------------------------	+
      mysql> SELECT mask_ssn('909');
      +-----------------	+
      | mask_ssn('909')  |
      +-----------------	+
      | NULL             |
      +-----------------	+
      
    随机数据生成功能

    本节中的函数为不同类型的数据生成随机值。在可能的情况下,生成的值具有保留用于演示或测试值的特性,以避免将其误认为合法数据。例如,gen_rnd_us_phone()返回使用555区号的美国电话号码,该电话区号在实际使用中未分配给电话号码。各个功能的描述描述了该原理的任何例外。

    • gen_range(lower,upper)

      生成从指定范围内选择的随机数。

      参数:

      • lower:一个整数,指定范围的下边界。
      • upper:一个整数,指定范围的上限,且不得小于下限。

      返回值:

      从在范围内的随机整数lowerupper,包容,或者NULL如果该upper参数小于lower

      例:

      mysql> SELECT gen_range(100, 200), gen_range(-1000, -800);
      +---------------------	+------------------------	+
      | gen_range(100, 200)  | gen_range( -1000,  -800)  |
      +---------------------	+------------------------	+
      | 177  |                    -917  |
      +---------------------	+------------------------	+
      mysql> SELECT gen_range(1, 0);
      +-----------------	+
      | gen_range(1, 0)  |
      +-----------------	+
      | NULL  |
      +-----------------	+
      
    • gen_rnd_email()

      example.com域中生成一个随机电子邮件地址。

      参数:

      没有。

      返回值:

      随机电子邮件地址作为字符串。

      例:

      mysql> SELECT gen_rnd_email();
      +---------------------------	+
      | gen_rnd_email()            |
      +---------------------------	+
      | ijocv.mwvhhuf@example.com  |
      +---------------------------	+
      
    • gen_rnd_pan([size])

      生成一个随机的支付卡主帐号。该数字通过了Luhn校验(一种针对校验位执行校验和验证的算法)。

      警告

      从中返回的值gen_rnd_pan()应仅用于测试目的,而不适合发布。无法保证没有将给定的返回值分配给合法的付款帐户。如果有必要发布gen_rnd_pan()结果,请考虑使用mask_pan()或将其掩盖mask_pan_relaxed()

      参数:

      • size:(可选)一个整数,指定结果的大小。如果size未提供,则默认值为16 。如果给出,则size必须是12到19之间的整数。

      返回值:

      字符串形式的随机付款号码,或者给出NULLsize超出允许范围的参数。

      例:

      mysql> SELECT mask_pan(gen_rnd_pan());
      +-------------------------	+
      | mask_pan(gen_rnd_pan())  |
      +-------------------------	+
      | XXXXXXXXXXXX5805         |
      +-------------------------	+
      mysql> SELECT mask_pan(gen_rnd_pan(19));
      +---------------------------	+
      | mask_pan(gen_rnd_pan(19))  |
      +---------------------------	+
      | XXXXXXXXXXXXXXX5067        |
      +---------------------------	+
      mysql> SELECT mask_pan_relaxed(gen_rnd_pan());
      +---------------------------------	+
      | mask_pan_relaxed(gen_rnd_pan())  |
      +---------------------------------	+
      | 398403XXXXXX9547                 |
      +---------------------------------	+
      mysql> SELECT mask_pan_relaxed(gen_rnd_pan(19));
      +-----------------------------------	+
      | mask_pan_relaxed(gen_rnd_pan(19))  |
      +-----------------------------------	+
      | 578416XXXXXXXXX6509                |
      +-----------------------------------	+
      mysql> SELECT gen_rnd_pan(11), gen_rnd_pan(20);
      +-----------------	+-----------------	+
      | gen_rnd_pan(11)  | gen_rnd_pan(20)  |
      +-----------------	+-----------------	+
      | NULL             | NULL             |
      +-----------------	+-----------------	+
      
    • gen_rnd_ssn()

      生成格式随机的美国社会安全号码。该部分大于900且部分小于70,这是不用于合法的社会保险号码特征。AAA-BB-CCCCAAABB

      参数:

      没有。

      返回值:

      随机的社会安全号码,为字符串。

      例:

      mysql> SELECT gen_rnd_ssn();
      +---------------	+
      | gen_rnd_ssn()  |
      +---------------	+
      | 951 -26 -0058    |
      +---------------	+
      
    • gen_rnd_us_phone()

      生成格式随机的美国电话号码。555区号不用于合法电话号码。1-555-AAA-BBBB

      参数:

      没有。

      返回值:

      一个随机的美国电话号码作为字符串。

      例:

      mysql> SELECT gen_rnd_us_phone();
      +--------------------	+
      | gen_rnd_us_phone()  |
      +--------------------	+
      | 1 -555 -682 -5423      |
      +--------------------	+
      
    基于随机数据字典的函数

    本节中的功能操作术语词典,并根据它们执行生成和掩盖操作。其中一些功能需要SUPER特权。

    加载字典后,它将成为字典注册表的一部分,并被分配一个名称,以供其他字典功能使用。从每行包含一个术语的纯文本文件加载字典。空行将被忽略。为了有效,词典文件必须至少包含一个非空行。

    • gen_blacklist(str,dictionary_name,replacement_dictionary_name)

      用第二个词典中的术语替换一个词典中存在的术语,并返回替换术语。这通过替换掩盖了原始术语。

      参数:

      • str:一个字符串,指示要替换的术语。
      • dictionary_name:一个字符串,用于命名包含要替换术语的字典。
      • replacement_dictionary_name:一个字符串,它命名从中选择替换词的字典。

      返回值:

      从中随机选择的字符串来replacement_dictionary_name替代str,或者str如果它没有出现在中dictionary_name,或者NULL任一词典名称都不在词典注册表中。

      如果要替换的术语出现在两个字典中,则返回值可能是相同的术语。

      例:

      mysql> SELECT gen_blacklist('Berlin', 'DE_Cities', 'US_Cities');
      +---------------------------------------------------	+
      | gen_blacklist('Berlin', 'DE_Cities', 'US_Cities')  |
      +---------------------------------------------------	+
      | Phoenix                                            |
      +---------------------------------------------------	+
      
    • gen_dictionary(dictionary_name)

      从字典中返回一个随机术语。

      参数:

      • dictionary_name:一个字符串,用于命名从中选择术语的字典。

      返回值:

      字典中作为字符串的随机术语,或者NULL字典名称不在字典注册表中。

      例:

      mysql> SELECT gen_dictionary('mydict');
      +--------------------------	+
      | gen_dictionary('mydict')  |
      +--------------------------	+
      | My term                   |
      +--------------------------	+
      mysql> SELECT gen_dictionary('no-such-dict');
      +--------------------------------	+
      | gen_dictionary('no -such -dict')  |
      +--------------------------------	+
      | NULL                            |
      +--------------------------------	+
      
    • gen_dictionary_drop(dictionary_name)

      从字典注册表中删除字典。

      此功能需要SUPER特权。

      参数:

      • dictionary_name:一个字符串,用于命名要从字典注册表中删除的字典。

      返回值:

      指示放置操作是否成功的字符串。Dictionary removed表示成功。Dictionary removal error表示失败。

      例:

      mysql> SELECT gen_dictionary_drop('mydict');
      +-------------------------------	+
      | gen_dictionary_drop('mydict')  |
      +-------------------------------	+
      | Dictionary removed             |
      +-------------------------------	+
      mysql> SELECT gen_dictionary_drop('no-such-dict');
      +-------------------------------------	+
      | gen_dictionary_drop('no -such -dict')  |
      +-------------------------------------	+
      | Dictionary removal error             |
      +-------------------------------------	+
      
    • gen_dictionary_load(dictionary_path,dictionary_name)

      将文件加载到词典注册表中,并为词典分配一个名称,以与需要词典名称参数的其他函数一起使用。

      此功能需要SUPER特权。

      重要

      字典不是持久性的。必须在每次服务器启动时加载应用程序使用的任何词典。

      一旦加载到注册表中,即使基础词典文件发生了更改,也将按原样使用词典。要重新加载字典,请先将其放下gen_dictionary_drop(),然后再用加载gen_dictionary_load()

      参数:

      • dictionary_path:一个字符串,指定字典文件的路径名。
      • dictionary_name:提供字典名称的字符串。

      返回值:

      指示加载操作是否成功的字符串。Dictionary load success表示成功。Dictionary load error表示失败。字典加载失败的发生可能有多种原因,其中包括:

      • 具有给定名称的字典已经加载。
      • 找不到字典文件。
      • 词典文件不包含任何术语。
      • secure_file_priv系统变量设置和字典文件不位于由变量命名的目录。

      例:

      mysql> SELECT gen_dictionary_load('/usr/local/mysql/mysql-files/mydict','mydict');
      +---------------------------------------------------------------------	+
      | gen_dictionary_load('/usr/local/mysql/mysql -files/mydict','mydict')  |
      +---------------------------------------------------------------------	+
      | Dictionary load success                                              |
      +---------------------------------------------------------------------	+
      mysql> SELECT gen_dictionary_load('/dev/null','null');
      +-----------------------------------------	+
      | gen_dictionary_load('/dev/null','null')  |
      +-----------------------------------------	+
      | Dictionary load error                    |
      +-----------------------------------------	+