加密列上的模式匹配

kum*_*mar 1 sql-server encryption always-encrypted

即使在 SQL Server 2019 版本中,我也无法对加密列进行模式匹配。

SQL Server 2019

加密前

select * 
from messageencryption;     
Run Code Online (Sandbox Code Playgroud)

输出:

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%';       
Run Code Online (Sandbox Code Playgroud)

输出:

id   msgcode   msg              
----------------------------
6    AA56K     onesmallteam                   
7    AA56L     cricket team consists of 11 players                
8    AA56M     indian cricket team               
Run Code Online (Sandbox Code Playgroud)

AFTER加密:

select * 
from messageencryption 
where msg like '%team%';
Run Code Online (Sandbox Code Playgroud)

输出

消息 402,级别 16,状态 2,第 23 行
数据类型 varchar(8000) 使用 (encryption_type = 'RANDOMIZED', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'cek_key_name_database'cek_key_data_encrypt_General_keylation_database'cek_key_data_encrypt_加密列和 varchar 在 like 运算符中不兼容。

预期输出:

id   msgcode   msg              
----------------------------
6    AA56K     onesmallteam                   
7    AA56L     cricket team consists of 11 players                
8    AA56M     indian cricket team               
Run Code Online (Sandbox Code Playgroud)

And*_*lov 5

看起来您正在使用Always Encrypted来加密此列。这种情况下的显着限制之一是

查询可以对使用确定性加密加密的列执行相等比较,但不能执行其他操作(例如,大于/小于、使用 LIKE 运算符的模式匹配或算术运算)。

在您的情况下,您正在使用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'
Run Code Online (Sandbox Code Playgroud)

如果支持,您将获得一行(默认为 0 值)。要启用它,请执行:

EXEC sys.sp_configure 'column encryption enclave type', 1
RECONFIGURE
Run Code Online (Sandbox Code Playgroud)

重新启动您的实例并运行第一个查询以确认它们已启用。现在您需要通过全局启用跟踪标志 127 来对加密列启用丰富的计算:

DBCC traceon(127,-1)
Run Code Online (Sandbox Code Playgroud)

但是,这将不允许您对现有的加密列执行模式匹配。仅当列使用启用 enclave 的列主密钥(设置了数据库中列主密钥元数据中的 ENCLAVE_COMPUTATIONS 属性)加密时,才能完成此操作。但是,列主密钥的 ENCLAVE_COMPUTATIONS 属性是不可变的 - 在配置密钥后无法更改它。因此,您很可能需要使用新的 CMK 更改 CMK,该 CMK 已启用 enclave(在您生成新密钥时指定)。

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