Одним из вариантов будет использование собственных методов шифрования 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
);
см. демо