8.5.2.2 Использование компонентов MySQL Enterprise Data Masking и деидентификации
Перед использованием компонентов MySQL Enterprise Data Masking и деидентификации установите их в соответствии с инструкциями, приведенными в разделе 8.5.2.1 «Установка компонентов MySQL Enterprise Data Masking и деидентификации».
Чтобы использовать MySQL Enterprise Data Masking и деидентификацию в приложениях, вызывайте функции, соответствующие операциям, которые вы хотите выполнить. Подробные описания функций см. в разделе 8.5.2.4 «Описание функций компонентов 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 | +--------------------------------------+ mysql> SELECT mask_inner("かすみがうら市", 3, 1); +----------------------------------+ | mask_inner("かすみがうら市", 3, 1) | +----------------------------------+ | かすみXXX市 | +----------------------------------+ mysql> SELECT mask_inner("かすみがうら市", 1, 3); +----------------------------------+ | mask_inner("かすみがうら市", 1, 3) | +----------------------------------+ | かXXXうら市 | +----------------------------------+ -
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_inner("かすみがうら市", 2, 2, "#");
+---------------------------------------+
| mask_inner("かすみがうら市", 2, 2, "#") |
+---------------------------------------+
| かす###ら市 |
+---------------------------------------+
Специализированные функции компонентов маскирования
Другие функции маскирования ожидают строковый аргумент, представляющий определенный тип значения, и маскируют его, чтобы удалить идентифицирующие характеристики.
В приведенных здесь примерах аргументы функций используют функции генерации случайных значений, возвращающие соответствующий тип значения. Дополнительную информацию о функциях генерации см. в разделе «Генерация случайных данных со специфическими характеристиками».
Маскирование номера первичного счета платежной карты. Функции маскирования обеспечивают строгое и гибкое маскирование номеров первичных счетов.
-
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_iban() маскирует все, кроме первых двух букв (обозначающих страну) номера:
mysql> SELECT mask_iban(gen_rnd_iban());
+---------------------------+
| mask_iban(gen_rnd_iban()) |
+---------------------------+
| ZZ** **** **** **** |
+---------------------------+
Маскирование универсального идентификатора. mask_uuid() маскирует все значимые символы:
mysql> SELECT mask_uuid(gen_rnd_uuid());
+--------------------------------------+
| mask_uuid(gen_rnd_uuid()) |
+--------------------------------------+
| ********-****-****-****-************ |
+--------------------------------------+
Маскирование номера социального страхования США. mask_ssn() маскирует все, кроме последних четырех цифр числа:
mysql> SELECT mask_ssn(gen_rnd_ssn());
+-------------------------+
| mask_ssn(gen_rnd_ssn()) |
+-------------------------+
| ***-**-1723 |
+-------------------------+
Маскирование номера социального страхования Канады. mask_canada_sin() маскирует значимые цифры числа:
mysql> SELECT mask_canada_sin(gen_rnd_canada_sin());
+---------------------------------------+
| mask_canada_sin(gen_rnd_canada_sin()) |
+---------------------------------------+
| XXX-XXX-XXX |
+---------------------------------------+
Маскирование номера национального страхования Соединенного Королевства. mask_uk_nin() маскирует все, кроме первых двух цифр числа:
mysql> SELECT mask_uk_nin(gen_rnd_uk_nin());
+-------------------------------+
| mask_uk_nin(gen_rnd_uk_nin()) |
+-------------------------------+
| ZH******* |
+-------------------------------+
Генерация случайных данных со специфическими характеристиками
Несколько функций компонентов генерируют случайные значения. Эти значения могут использоваться для тестирования, моделирования и так далее.
gen_range() возвращает случайное целое число, выбранное из заданного диапазона:
mysql> SELECT gen_range(1, 10);
+------------------+
| gen_range(1, 10) |
+------------------+
| 6 |
+------------------+
gen_rnd_canada_sin() возвращает случайное число, выбранное из диапазона, не используемого для легитимных чисел:
mysql> SELECT gen_rnd_canada_sin();
+----------------------+
| gen_rnd_canada_sin() |
+----------------------+
(Результат функции gen_rnd_canada_sin() не показан, потому что его значения возврата следует использовать только для тестирования, а не для публикации. Нет гарантии, что число не будет присвоено легитимному канадскому номеру социального страхования.)
gen_rnd_email() возвращает случайный адрес электронной почты со заданным числом цифр для именных и фамильных частей в указанном домене, mynet.com в приведенном ниже примере:
mysql> SELECT gen_rnd_email(6, 8, 'mynet.com');
+------------------------------+
| gen_rnd_email(6, 8, 'mynet') |
+------------------------------+
| ayxnqu.xmkpvvyr@mynet.com |
+------------------------------+
gen_rnd_iban() возвращает число, выбранное из диапазона, не используемого для легитимных чисел:
mysql> SELECT gen_rnd_iban('XO', 24);
+-------------------------------+
| gen_rnd_iban('XO', 24) |
+-------------------------------+
| XO25 SL7A PGQR B9NN 6IVB RFE8 |
+-------------------------------+
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_uk_nin() возвращает число, выбранное из диапазона, не используемого для легитимных чисел:
mysql> SELECT gen_rnd_uk_nin();
+------------------+
| gen_rnd_uk_nin() |
+------------------+
(Результат функции gen_rnd_uk_nin() не показан, потому что его значения возврата следует использовать только для тестирования, а не для публикации. Нет гарантии, что число не будет присвоено легитимному номеру NIN.)
gen_rnd_us_phone() возвращает случайный номер телефона США в коде города 555, не используемом для легитимных номеров:
mysql> SELECT gen_rnd_us_phone();
+--------------------+
| gen_rnd_us_phone() |
+--------------------+
| 1-555-747-5627 |
+--------------------+
gen_rnd_uuid() возвращает число, выбранное из диапазона, не используемого для легитимных идентификаторов:
mysql> SELECT gen_rnd_uuid();
+--------------------------------------+
| gen_rnd_uuid() |
+--------------------------------------+
| 68946384-6880-3150-6889-928076732539 |
+--------------------------------------+
Генерация случайных данных с помощью словарей
MySQL Enterprise Data Masking and De-Identification позволяет использовать словари в качестве источников случайных значений, называемых терминами. Для использования словаря его необходимо сначала добавить в системную таблицу masking_dictionaries и присвоить ему имя. Словари считываются из таблицы и загружаются в кэш во время инициализации компонентов (при запуске сервера). Затем термины можно добавлять, удалять и выбирать из словарей и использовать их в качестве случайных значений или в качестве замены других значений.
Всегда редактируйте словари, используя функции администрирования словарей, а не изменяя таблицу напрямую. Если вы изменяете таблицу вручную, кэш словаря перестанет соответствовать таблице.
Таблица masking_dictionaries должна иметь следующие характеристики:
-
Администратор создал системную таблицу
masking_dictionariesв схемеmysqlследующим образом:CREATE TABLE IF NOT EXISTS masking_dictionaries( Dictionary VARCHAR(256) NOT NULL, Term VARCHAR(256) NOT NULL, UNIQUE INDEX dictionary_term_idx (Dictionary, Term), INDEX dictionary_idx (Dictionary) ) ENGINE = InnoDB DEFAULT CHARSET=utf8mb4; Для добавления и удаления терминов или удаления целого словаря требуется привилегия MASKING_DICTIONARY_ADMIN.
Таблица может содержать несколько словарей и их терминов.
Любой пользователь может просматривать словари. При достаточном количестве запросов все термины в словарях могут быть получены. Избегайте добавления конфиденциальных данных в таблицу словаря.
Предположим, что словарь с именем DE_cities содержит следующие названия городов Германии:
Berlin
Munich
Bremen
Используйте masking_dictionary_term_add() для присвоения имени словаря и одного термина:
mysql> SELECT masking_dictionary_term_add('DE_Cities', 'Berlin');
+----------------------------------------------------+
| masking_dictionary_term_add('DE_Cities', 'Berlin') |
+----------------------------------------------------+
| 1 |
+----------------------------------------------------+
mysql> SELECT masking_dictionary_term_add('DE_Cities', 'Munich');
+----------------------------------------------------+
| masking_dictionary_term_add('DE_Cities', 'Munich') |
+----------------------------------------------------+
| 1 |
+----------------------------------------------------+
mysql> SELECT masking_dictionary_term_add('DE_Cities', 'Bremen');
+----------------------------------------------------+
| masking_dictionary_term_add('DE_Cities', 'Bremen') |
+----------------------------------------------------+
| 1 |
+----------------------------------------------------+
Также предположим, что словарь с именем US_Cities содержит следующие названия городов США:
Houston
Phoenix
Detroit
mysql> SELECT masking_dictionary_term_add('US_Cities', 'Houston');
+-----------------------------------------------------+
| masking_dictionary_term_add('US_Cities', 'Houston') |
+-----------------------------------------------------+
| 1 |
+-----------------------------------------------------+
mysql> SELECT masking_dictionary_term_add('US_Cities', 'Phoenix');
+-----------------------------------------------------+
| masking_dictionary_term_add('US_Cities', 'Phoenix') |
+-----------------------------------------------------+
| 1 |
+-----------------------------------------------------+
mysql> SELECT masking_dictionary_term_add('US_Cities', 'Detroit');
+-----------------------------------------------------+
| masking_dictionary_term_add('US_Cities', 'Detroit') |
+-----------------------------------------------------+
| 1 |
+-----------------------------------------------------+
Для выбора случайного термина из словаря используйте 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). Например, клиент может сказать, что его имя — Джоанна Бонд, и что последние четыре цифры ее номера социального страхования — 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)
);
Приложение, используемое представителями службы поддержки клиентов для проверки номера социального страхования клиента, может выполнить запрос, подобный этому:
mysql> SELECT id, ssn
mysql> FROM customer
mysql> WHERE first_name = 'Joanna' AND last_name = 'Bond';
+-----+-------------+
| id | ssn |
+-----+-------------+
| 786 | 906-39-0007 |
+-----+-------------+
Однако это раскрывает номер социального страхования представителю службы поддержки клиентов, которому не нужно видеть ничего, кроме последних четырех цифр. Вместо этого приложение может использовать следующий запрос для отображения только замаскированного номера социального страхования:
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 | ***-**-0007 |
+-----+-------------+
Теперь представитель видит только необходимое, и конфиденциальность клиента сохраняется.
Почему функция CONVERT() использовалась в качестве аргумента для mask_ssn()? Потому что mask_ssn() требует аргумента длиной 11. Таким образом, даже если ssn определена как VARCHAR(11), если столбец ssn имеет многобайтовую кодировку символов, он может показаться длиннее 11 байтов при передаче в загружаемую функцию и вернёт NULL, выведя при этом ошибку. Преобразование значения в двоичную строку гарантирует, что функция видит аргумент длиной 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 | ***-**-0007 |
+-----+-------------+
© 2025 Oracle
Licensed under the GPLv2 License.