加密列上的模式匹配

时间:2018-12-24 09:45:23

标签: sql-server encryption always-encrypted

即使在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')collat​​ion_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 :(得分: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时指定)。

最后,我想再说一遍,即使有可能,也没有必要意味着您应该这样做。这是非常繁重的操作。通常,字符串的模式匹配很繁琐,不能使用索引进行这种类型的匹配,而且最重要的是,必须解密所有数据!这听起来真是个坏主意。不要这样!如果您发现自己试图搜索加密的数据,则通常意味着您的设计存在缺陷。毕竟,出于某种原因,应该对这些数据进行加密。

相关问题