即使在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%';
输出
消息402,第16级,状态2,第23行
使用(encryption_type ='RANDOMIZED',encryption_algorithm_name ='AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name ='cek',column_encryption_key_database_name ='encrypt')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
答案 0 :(得分:3)
您似乎正在使用Always Encrypted对该列进行加密。在这种情况下,notable limitations之一是
查询可以对使用确定性加密加密的列执行相等比较,但不能进行其他操作(例如,大于/小于,使用LIKE运算符模式匹配或算术运算)。
在您的情况下,您正在使用RANDOMIZED
加密,因此甚至无法执行相等比较!
要执行查询所要求的操作,SQL Server引擎需要解密 所有数据 。假设它将效率低下。并且由于引擎无法访问加密密钥,因此该操作必须在引擎之外执行。使用SQL Server 2016/2017,甚至无法执行此查询。您必须获取客户端上的所有数据,执行解密并在本地搜索。但是由于您正在使用SQL Server 2019,因此我假设您想利用新的Secure Enclaves功能。 Security Enclaves启用对rich computations(当前处于预览状态)的支持,这将允许对加密列进行模式匹配。但是默认情况下它们是禁用的,您必须显式启用它们。
首先,检查服务器上是否支持安全区域。执行此查询:
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-enabled column master key加密了列(在数据库中的列主键元数据中设置了ENCLAVE_COMPUTATIONS属性)时,才可以这样做。但是,列主键的ENCLAVE_COMPUTATIONS属性是不可变的-设置键后就无法更改它。因此,很可能您需要使用新的CMK进行更改,该功能已启用安全区域(在generate a new key时指定)。
最后,我想再说一遍,即使有可能,也没有必要意味着您应该这样做。这是非常繁重的操作。通常,字符串的模式匹配很繁琐,不能使用索引进行这种类型的匹配,而且最重要的是,必须解密所有数据!这听起来真是个坏主意。不要这样!如果您发现自己试图搜索加密的数据,则通常意味着您的设计存在缺陷。毕竟,出于某种原因,应该对这些数据进行加密。