8.5.3.2 Использование плагина маскировки и обезличивания данных MySQL Enterprise
Перед использованием плагина маскировки и обезличивания данных MySQL Enterprise, установите его в соответствии с инструкциями, предоставленными в разделе 8.5.3.1 «Установка плагина маскировки и обезличивания данных MySQL Enterprise».
Для использования плагина маскировки и обезличивания данных MySQL Enterprise в приложениях вызывайте функции, соответствующие операциям, которые вы хотите выполнить. Для получения подробных описаний функций см. раздел 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.