8.5.3.2 Использование плагина маскирования и обезличивания данных MySQL Enterprise
Перед использованием плагина маскирования и обезличивания данных MySQL Enterprise, установите его в соответствии с инструкциями в разделе 8.5.3.1, «Установка плагина маскирования и обезличивания данных MySQL Enterprise».
Для использования плагина MySQL Enterprise Data Masking and De-Identification в приложениях вызывайте функции, соответствующие операциям, которые вы хотите выполнить. Для подробного описания функций см. раздел 8.5.3.4, «Описание функций плагина маскирования и обезличивания данных MySQL Enterprise». В этом разделе показано, как использовать функции для выполнения некоторых типовых задач. Сначала приводится обзор доступных функций, а затем приводятся примеры использования функций в реальных сценариях:
Маскирование данных для удаления идентифицирующих характеристик
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). Например, клиент может назвать своё имя Джоанна Бонд и сообщить последние четыре цифры номера SSN: 0007.
Предположим, что в таблице customer, содержащей записи клиентов, есть такие столбцы:
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 |
+-----+-------------+
© 2025 Oracle
Licensed under the GPLv2 License.