【问题标题】:Pattern matching on encrypted columns加密列上的模式匹配
【发布时间】:2018-12-24 09:45:22
【问题描述】:

即使在 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               

【问题讨论】:

  • 相关:stackoverflow.com/q/53275478/1220550(无法标记为重复,因为很遗憾答案未被接受)
  • 根据 AlwaysEncrypted 上的官方文档docs.microsoft.com/en-us/sql/relational-databases/security/…,除了相等之外,您不能进行其他操作:Queries can perform equality comparison on columns encrypted using deterministic encryption, but no other operations (for example, greater/less than, pattern matching using the LIKE operator, or arithmetical operations).

标签: sql-server encryption always-encrypted


【解决方案1】:

您似乎正在使用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 更改为启用 enclave 的新 CMK(在您 generate a new key 时指定)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-30
    • 1970-01-01
    • 2012-10-14
    • 2020-09-02
    • 1970-01-01
    • 2017-10-17
    • 2018-08-13
    相关资源
    最近更新 更多