Spec-Zone.ru › MySQL 9.2

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() не показан, потому что ее возвращаемые значения следует использовать только в целях тестирования, а не для публикации. Не гарантируется, что число не присвоено законному номеру.)

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 |
+--------------------------------------+
END_OF_DOCUMENT_MARKER
Генерация случайных данных с помощью словарей

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.
https://docs.oracle.com/cd/E17952_01/mysql-9.2-en/data-masking-component-usage.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API