6.5.3 Использование MySQL Enterprise Data Masking и деидентификации
Перед использованием MySQL Enterprise Data Masking и деидентификации, установите его в соответствии с инструкциями, приведенными в разделе 6.5.2 «Установка или удаление MySQL Enterprise Data Masking и деидентификации».
Для использования MySQL Enterprise Data Masking и деидентификации в приложениях вызывайте функции, соответствующие операциям, которые вы хотите выполнить. Подробное описание функций см. в разделе 6.5.5 «Описание функций MySQL Enterprise Data Masking и деидентификации». В этом разделе показано, как использовать функции для выполнения некоторых типовых задач. Сначала представлен обзор доступных функций, а затем приведены примеры использования функций в реальных условиях:
Маскирование данных для удаления идентификационных характеристик
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 и деидентификация позволяют использовать словари в качестве источников случайных значений. Для использования словаря его необходимо сначала загрузить из файла и присвоить ему имя. Каждый загруженный словарь становится частью реестра словарей. Затем элементы можно выбирать из зарегистрированных словарей и использовать в качестве случайных значений или в качестве замены других значений.
Действительный файл словаря имеет следующие характеристики:
Содержимое файла — обычный текст, по одному термину в строке.
Пустые строки игнорируются.
Файл должен содержать по крайней мере один термин.
Предположим, что файл с именем 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: Номер идентификации клиента.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.