【问题标题】:How to use Like Operator on SQL Server Always Encrypted column?如何在 SQL Server Always Encrypted 列上使用 Like 运算符?
【发布时间】:2018-07-06 00:27:31
【问题描述】:

请帮助我修复 SQL Sever 2016 中的以下查询,其中列 FIRST_NAME、LAST_NAME 始终被加密。

SELECT * FROM MY_TABLE
WHERE (LAST_NAME LIKE '%[@,#,$,%,*]%' OR LAST_NAME LIKE '%,%')
OR (FIRST_NAME LIKE '%[@,#,$,%,*]%' OR FIRST_NAME LIKE '%,%');

我收到以下错误,因为列始终是加密的,而且我无法声明变量并将字符串分配给它。

Msg 206, Level 16, State 2, Line 1
Operand type clash: varchar(50) encrypted with (encryption_type = 'DETERMINISTIC', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'CEK_POC_CERTSTORE', column_encryption_key_database_name = 'UIM-LOCAL-DB') collation_name = 'Latin1_General_BIN2' is incompatible with varchar

【问题讨论】:

  • 不就是加密列的点不解密就不能查询数据吗?可能是我误会了。
  • 好吧,你不能。服务器没有 具有 加密密钥,因此它无法解密列以在服务器端执行通配符匹配,并且无法在内部重写 LIKE 运算符,因此它以某种方式与加密数据。
  • 一种可能的方法是让客户端在每次插入/更新时计算WHERE,并将其结果(是/否)存储为标志,因此您只需执行@987654325 @。然后列的加密不再重要。这仅在这种情况下有效,因为 LIKE 模式是常量(模式的变化意味着您必须重新计算所有列)。

标签: sql-server encryption sql-server-2016 always-encrypted


【解决方案1】:

很遗憾,如果 FIRST_NAME 和 LAST_NAME 始终加密,那么您不能使用 LIKE 运算符来搜索字符串。

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

参考:https://docs.microsoft.com/en-us/sql/relational-databases/security/encryption/always-encrypted-database-engine

【讨论】:

    【解决方案2】:

    从 SQL Server 2019 开始,Secure Enclaves 功能允许对 Always Encrypted 列进行完全查询——使用 LIKE、范围和排序进行模式匹配——包括随机列(不仅仅是确定性的)。

    如果不使用 Secure Enclave,查询将仅限于搜索完全匹配的内容。 (始终加密的字段也可用于 JOIN、GROUP BY 和 DISTINCT。)

    微软对安全飞地的介绍:

    https://docs.microsoft.com/en-us/sql/relational-databases/security/encryption/always-encrypted-enclaves?view=sql-server-ver15

    [此链接取代了之前不幸消失的 RedGate 链接]

    【讨论】:

    • 发布的链接已过期。
    • 已编辑为链接到 Microsoft 文档。
    猜你喜欢
    • 1970-01-01
    • 2020-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-13
    • 2017-10-25
    相关资源
    最近更新 更多