如何在加密列上执行 "Order by"(确定性加密 - SQL 2016)

How to perform "Order by" on an encrypted column (deterministic encryption - SQL 2016)

如何对加密列执行 "Order by"(确定性加密 - SQL Server 2016)?

在 SSMS 2017 上执行时出现错误(需要 AE 设置)

SELECT * 
FROM [dbo].[X] 
ORDER BY lastName

lastName列定义如下:

[lastName] [varchar](60) COLLATE Latin1_General_BIN2 ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [X]

我收到一个错误:

Msg 33299, Level 16, State 2, Line 9
Encryption scheme mismatch for columns/variables 'lastName'. The encryption scheme for the columns/variables is (encryption_type = 'DETERMINISTIC', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'X', column_encryption_key_database_name = 'X') and the expression near line '3' expects it to be (encryption_type = 'PLAINTEXT') (or weaker).

加密列不支持排序依据。

可以在 this article

上找到更多详细信息

数据库引擎从不对存储在加密列中的纯文本数据进行操作,但它仍然支持对加密数据的一些查询,具体取决于列的加密类型。 Always Encrypted 支持两种类型的加密:随机加密和确定性加密。

确定性加密 始终为任何给定的纯文本值生成相同的加密值。使用确定性加密允许在加密列上进行点查找、相等连接、分组和索引。但是,但也可能允许未经授权的用户通过检查加密列中的模式来猜测有关加密值的信息,特别是如果存在一小组可能的加密值,例如 True/False 或 North/South/East/West 区域。确定性加密必须对字符列使用具有 binary2 排序顺序的列排序规则。

随机加密 使用一种以难以预测的方式加密数据的方法。随机加密更安全,但会阻止对加密列进行搜索、分组、索引和连接。 对将用作搜索或分组参数的列使用确定性加密,例如政府 ID 号。使用随机加密,对于机密调查评论等数据,不与其他记录分组,不用于连接表。有关 Always Encrypted 加密算法的详细信息,请参阅 Always Encrypted Cryptography。