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)
看起来您正在使用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(在您生成新密钥时指定)。
最后,我想再说一遍,即使这是可能的,但这并不意味着你应该这样做。这是极其繁重的操作。通常字符串的模式匹配很重,不能使用索引进行这种类型的匹配,现在最重要的是,您的所有数据都必须解密!这听起来真是个坏主意。不要这样做!如果您发现自己试图搜索加密数据,这通常意味着您的设计存在缺陷。毕竟,这些数据应该被加密是有原因的。
| 归档时间: |
|
| 查看次数: |
574 次 |
| 最近记录: |