Генерация анонимных идентификаторов в запросе JOIN - PullRequest
0 голосов
/ 13 декабря 2018

Задача - извлечь данные о клиентах и ​​заказах из чувствительной системы.Данные хранятся в базе данных MySQL.

Клиент может быть связан со многими заказами.Простое LEFT JOIN дает мне именно то, что мне нужно:

---------------------------------------------------------
| customer_id | order_id | order_quantity | order_value |
---------------------------------------------------------
|      1      |    100   |       3        |    100.00   |
|      1      |    105   |      12        |    400.00   |
|      2      |    103   |       2        |     75.00   |
---------------------------------------------------------

Однако в сгенерированном извлечении мне не разрешается раскрывать customer_id или order_id.Вместо этого эти идентификаторы должны быть заменены случайными анонимными идентификаторами, сгенерированными во время экспорта данных.

В результирующем, извлеченном экспорте данных все еще необходимо поддерживать отношения между клиентами и их заказами.

Желаемый результат:

-------------------------------------------------------------------
| anon_customer_id | anon_order_id | order_quantity | order_value |
-------------------------------------------------------------------
|         xyz      |      abc123   |       3        |    100.00   |
|         xyz      |      def567   |      12        |    400.00   |
|         pqr      |      hij890   |       2        |     75.00   |
-------------------------------------------------------------------

Есть ли способ сгенерировать anon_customer_id и anon_order_id как часть SELECT, который я запускаю для создания результата данных?

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Одним из вариантов будет использование собственных методов шифрования MySQL, таких как SHA1 или SHA2, и создание VIEW, к которому вы запрашиваете и присоединяетесь.Я решил использовать SHA 512, потому что с очень низкой вероятностью разные данные могут генерировать один и тот же хеш.

CREATE VIEW Table1_VIEW AS (
   SELECT 
      <table>.*
    , SHA2(<table>.customer_id, 512) AS anon_customer_id
    , SHA2(<table>.order_id, 512) AS anon_order_id
   FROM 
    <table>
 )

Запрос и результат

SELECT 
 *
FROM 
 Table1_VIEW

| customer_id | order_id | order_quantity | order_value | anon_customer_id                                                                                                                 | anon_order_id                                                                                                                    |
| ----------- | -------- | -------------- | ----------- | -------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
| 1           | 100      | 3              | 100         | 4dff4ea340f0a823f15d3f4f01ab62eae0e5da579ccb851f8db9dfe84c58b2b37b89903a740e1ee172da793a6e79d560e5f7f9bd058a12a280433ed6fa46510a | 643c30f73a3017050b287794fc8c5bb9ab06b9ce38a1fc58df402a8b66ff58f69bf0a606ae17585352a0306f0e9752de8c5c064aed7003f52808b43ff992a603 |
| 1           | 105      | 12             | 400         | 4dff4ea340f0a823f15d3f4f01ab62eae0e5da579ccb851f8db9dfe84c58b2b37b89903a740e1ee172da793a6e79d560e5f7f9bd058a12a280433ed6fa46510a | 03d25c7071bce10d6b462d53854b969d9f61b982e3aee8771bdcca1ecb70495574e6929042f52e859ee9a253b58f776514180ff16e1338f5505e86c7ff328f72 |
| 2           | 103      | 2              | 75          | 40b244112641dd78dd4f93b6c9190dd46e0099194d5a44257b7efad6ef9ff4683da1eda0244448cb343aa688f5d3efd7314dafe580ac0bcbf115aeca9e8dc114 | 947de04bfae0bf062a66fc055d4c284c9779793d9bd58833ee7549fde1ff1effaf7aefdbc6c90ed0ac86c0acc82329e7c057d900c28ea7ed4724486f717ee38d |

демо

ps Вы также можете напрямую использовать SHA2() непосредственно в JOIN offcource.

Пример запроса

SELECT 
      table11.*
    , SHA2(table11.customer_id, 512) AS anon_customer_id
    , SHA2(table11.order_id, 512) AS anon_order_id 
FROM 
 Table1 table11
LEFT JOIN
 Table1 table12
ON
 table11.customer_id = table12.customer_id

demo

только MYSQL 5.7+

Если у вас есть хотя бы MySQL 5.7+, у вас есть еще лучший вариант.Который является сгенерированными столбцами

CREATE TABLE Table1 (
  `customer_id` INTEGER,
  `order_id` INTEGER,
  `order_quantity` INTEGER,
  `order_value` INTEGER,
  anon_customer_id VARCHAR(255) AS ( SHA2(Table1.customer_id, 512) ) VIRTUAL,
  anon_order_id VARCHAR(255) AS ( SHA2(Table1.order_id, 512) ) VIRTUAL
);

демо

Редактировать из-за комментария от Луи

Я хотел сказать, что кто-то сможет извлечь конфиденциальный идентификатор клиента после его хеширования.Просто путем вычисления хэшей всех возможных или вероятных идентификаторов клиентов и определения того же.Если идентификатор клиента не является возрастающим числом с предсказуемым диапазоном, а некоторым произвольно назначаемым очень большим числом или действительно длинной случайной строкой, то может быть лучше

Это очень верно, что вы можете сделать, это добавить больше энтропиик хэшу, так что настоящая идентификация не так просто поднять.В этом случае вы добавляете не менее 52 символов (datetime (6) и наоборот) в качестве энтропии, которой должно быть более чем достаточно для защиты от грубых действий в течение (некоторых) лет.

CREATE VIEW Table1_VIEW_more_entropy AS (
   SELECT 
      Table1.*
    , SHA2(CONCAT_WS(':', Table1.id, Table1.date_created, REVERSE(Table1.date_created), Table1.customer_id), 512)
    , SHA2(CONCAT_WS(':', Table1.id, Table1.date_created, REVERSE(Table1.date_created), Table1.order_id), 512)   
   FROM 
    Table1
 );

см. демо

0 голосов
/ 13 декабря 2018

Вы можете использовать любую хеш-функцию, например, MD5:

SELECT MD5(customer_id) AS anon_customer_id FROM customers;

Но учтите, что MD5 не очень безопасен: https://security.stackexchange.com/questions/19906/is-md5-considered-insecure

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...