MySQL 企业版数据屏蔽和脱敏插件库包含多个函数,可将其分为以下几类
这些函数支持单字节 latin1
字符集用于字符串参数和返回值。如果字符串返回值应为不同的字符集,请将其进行转换。以下示例显示了如何将 gen_rnd_email()
的结果转换为 utf8mb4
字符集
SET @email = CONVERT(gen_rnd_email() USING utf8mb4);
可能还需要转换字符串参数,如 使用屏蔽数据进行客户识别 中所述。
如果从 mysql 客户端内调用 MySQL 企业版数据屏蔽和脱敏函数,则二进制字符串结果将以十六进制表示形式显示,具体取决于 --binary-as-hex
的值。有关该选项的更多信息,请参见 第 6.5.1 节“mysql — MySQL 命令行客户端”。
本节中的每个插件函数都对其实字符串参数执行屏蔽操作,并返回屏蔽后的结果。
mask_inner(
str
,margin1
,margin2
[,mask_char
])屏蔽字符串的内部部分,保留两端,并返回结果。可以指定可选的屏蔽字符。
参数
str
: 要屏蔽的字符串。margin1
: 一个非负整数,指定要保持未屏蔽的字符串左端字符数。如果值为 0,则没有左端字符保持未屏蔽。margin2
: 一个非负整数,指定要保持未屏蔽的字符串右端字符数。如果值为 0,则没有右端字符保持未屏蔽。mask_char
: (可选) 用于屏蔽的单个字符。如果未提供mask_char
,则默认值为'X'
。屏蔽字符必须是单字节字符。尝试使用多字节字符会导致错误。
返回值
屏蔽后的字符串,或如果任一边距为负,则为
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
: (可选) 用于屏蔽的单个字符。如果未提供mask_char
,则默认值为'X'
。屏蔽字符必须是单字节字符。尝试使用多字节字符会导致错误。
返回值
屏蔽后的字符串,或如果任一边距为负,则为
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##### | +---------------------------------+--------------------------------+
屏蔽支付卡主账号号码,并返回除最后四位以外的所有数字都被
'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 | +-----------------+
屏蔽支付卡主账号号码,并返回除前六位和最后四位以外的所有数字都被
'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 | +-------------------------+
屏蔽美国社会安全号码,并返回除最后四位以外的所有数字都被
'X'
字符替换的号码。参数
str
: 要屏蔽的字符串。字符串必须是 11 个字符长。
返回值
被屏蔽的社会安全号码作为字符串,或者如果参数长度不正确,则返回错误。
示例
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'); ERROR 1123 (HY000): Can't initialize function 'mask_ssn'; MASK_SSN: Error: String argument width too small mysql> SELECT mask_ssn('123456789123456789'); ERROR 1123 (HY000): Can't initialize function 'mask_ssn'; MASK_SSN: Error: String argument width too large
本节中的插件函数为不同类型的数据生成随机值。在可能的情况下,生成的数值具有为演示或测试数值保留的特征,以避免将其误认为合法数据。例如,gen_rnd_us_phone()
返回一个使用 555 区号的美国电话号码,该区号未分配给实际使用的电话号码。各个函数描述说明了此原则的任何例外情况。
生成从指定范围内选择的随机数。
参数
lower
: 指定范围下界的整数。upper
: 指定范围上界的整数,该整数不能小于下界。
返回值
从
lower
到upper
(包括)范围内的一个随机整数,或者如果upper
参数小于lower
,则为NULL
。示例
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 | +-----------------+
在
example.com
域中生成随机电子邮件地址。参数
无。
返回值
随机电子邮件地址作为字符串。
示例
mysql> SELECT gen_rnd_email(); +---------------------------+ | gen_rnd_email() | +---------------------------+ | [email protected] | +---------------------------+
生成随机支付卡主账号号码。该号码通过了 Luhn 校验(一种对校验位进行校验和验证的算法)。
警告从
gen_rnd_pan()
返回的值应仅用于测试目的,不适合发布。无法保证给定的返回值未分配给合法的支付帐户。如果需要发布gen_rnd_pan()
结果,请考虑使用mask_pan()
或mask_pan_relaxed()
对其进行屏蔽。参数
size
: (可选)指定结果大小的整数。如果未给出size
,则默认为 16。如果给出,则size
必须是 12 到 19 范围内的整数。
返回值
随机支付卡号码作为字符串,或者如果给出超出允许范围的
size
参数,则为NULL
。示例
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 | +-----------------+-----------------+
以
格式生成随机美国社会安全号码。AAA
-BB
-CCCC
AAA
部分大于 900,BB
部分小于 70,这些特征不用于合法的社会安全号码。参数
无。
返回值
随机社会安全号码作为字符串。
示例
mysql> SELECT gen_rnd_ssn(); +---------------+ | gen_rnd_ssn() | +---------------+ | 951-26-0058 | +---------------+
以
1-555-
格式生成随机美国电话号码。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
)将一个字典中存在的术语替换为第二个字典中的术语,并返回替换后的术语。这通过替换来屏蔽原始术语。该函数已弃用;请改用
gen_blocklist()
。gen_blocklist(
str
,dictionary_name
,replacement_dictionary_name
)将一个字典中存在的术语替换为第二个字典中的术语,并返回替换后的术语。这通过替换来屏蔽原始术语。该函数作为已弃用的
gen_blacklist()
函数的替代品。参数
str
: 表示要替换的术语的字符串。dictionary_name
: 包含要替换的术语的字典的名称。replacement_dictionary_name
: 用于选择替换术语的字典的名称。
返回值
从
replacement_dictionary_name
中随机选择的字符串,用作str
的替换,或者如果str
不出现在dictionary_name
中,则为str
,或者如果任一字典名称不在字典注册表中,则为NULL
。如果要替换的术语同时出现在两个字典中,则返回值可能是相同的术语。
示例
mysql> SELECT gen_blocklist('Berlin', 'DE_Cities', 'US_Cities'); +---------------------------------------------------+ | gen_blocklist('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 | +-----------------------------------------+