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

Я не могу выполнить сопоставление с шаблоном для зашифрованного столбца даже в версии SQL Server 2019.

SQL Server 2019

ДО шифрования

select * 
from messageencryption;     

Вывод:

id    msgcode   msg      
-------------------------------------------
1      AA56B    this is a text message     
2      AA56C    this is a text123 message    
3      AA56D    EXTENDED BOOTCAMP      
4      AA56E    extended bootcamp       
5      AA56J    advance happy new year       
6      AA56K    oneteam       
7      AA56L    cricket team consists of 11 players       
8      AA56M    indian cricket team      

select * 
from messageencryption 
where msg like '%team%';       

Вывод:

id   msgcode   msg              
----------------------------
6    AA56K     onesmallteam                   
7    AA56L     cricket team consists of 11 players                
8    AA56M     indian cricket team               

ПОСЛЕ шифрование:

select * 
from messageencryption 
where msg like '%team%';

Вывод

Msg 402, Уровень 16, Состояние 2, Строка 23
Типы данных varchar (8000), зашифрованные с помощью (encryption_type = 'RANDOMIZED', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name_name_name_name_name_name_name_name_name_ столбца_cname_name_name_name_name)') collation_name =' Latin1_General_BIN2 'и varchar несовместимы в операторе like.

Ожидаемый результат:

id   msgcode   msg              
----------------------------
6    AA56K     onesmallteam                   
7    AA56L     cricket team consists of 11 players                
8    AA56M     indian cricket team               

1 Ответ

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

Похоже, вы используете Always Encrypted для шифрования этого столбца.Одним из заметных ограничений в этом случае является то, что

Запросы могут выполнять сравнение на равенство для столбцов, зашифрованных с использованием детерминированного шифрования, но без других операций (например, больше / меньше, чем, сопоставление с шаблоном с использованием оператора LIKE * (1009 * или арифметические операции).

В вашем случае вы используете шифрование RANDOMIZED, поэтому вы даже не можете выполнить сравнение на равенство!

Чтобы выполнить запрос, ядро ​​SQL Server должно расшифровать всех ваших данных .Допустим, это будет неэффективно.А поскольку у движка нет доступа к ключам шифрования, эта операция должна выполняться вне движка.В SQL Server 2016/2017 этот запрос даже невозможно было выполнить.Вы должны были получить все данные на клиенте, выполнить расшифровку и выполнить поиск локально.Но поскольку вы используете SQL Server 2019, я предполагаю, что вы хотите воспользоваться новой функциональностью Secure Enclaves .Security Enclaves обеспечивает поддержку расширенных вычислений (в настоящее время в режиме предварительного просмотра), что позволит сопоставлять шаблоны с зашифрованными столбцамиНо они по умолчанию отключены, и вы должны явно включить их.

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

SELECT [name], [value], [value_in_use] FROM sys.configurations
WHERE [name] = 'column encryption enclave type'

Если поддерживается, вы получите одну строку (по умолчанию с 0 значениями).Чтобы включить его, выполните:

EXEC sys.sp_configure 'column encryption enclave type', 1
RECONFIGURE

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

DBCC traceon(127,-1)

Однако это не позволит вам выполнить сопоставление с образцом для существующих зашифрованных столбцов.Это можно сделать только в том случае, если столбцы зашифрованы с помощью главного ключа столбца с поддержкой анклавов (установлено свойство ENCLAVE_COMPUTATIONS в метаданных главного ключа столбца в базе данных).Однако свойство ENCLAVE_COMPUTATIONS главного ключа столбца является неизменным - его нельзя изменить после предоставления ключа.Так что, скорее всего, вам нужно будет заменить CMK на новый, с поддержкой анклава (который указывается, когда вы генерируете новый ключ ).

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

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