我有一个datetime
列的表,该列使用SQL Server 2016上的“始终加密”功能进行加密。
现在我正在尝试执行这个简单的选择:
select max(dt_order)
from orders
where customer = 123;
我遇到了这个错误:
Msg 33299,Level 16,State 2,Line 5
列/变量'dt_order'的加密方案不匹配。列/变量的加密方案是(encryption_type ='DETERMINISTIC',encryption_algorithm_name ='AEAD_AES_256_CBC_HMAC_SHA_256',column_encryption_key_name ='myColHML',column_encryption_key_database_name ='TESTING')并且行'1'附近的表达式期望它是(encryption_type =' PLAINTEXT')(或更弱)。
在SSMS中我已经设置了连接选项“列加密设置=启用”,并且我还设置了查询选项“启用参数化以始终加密”
有什么想法吗?
答案 0 :(得分:0)
由于您的数据是使用客户端上的密钥加密的,因此SQL Server将无法计算最大值。这是因为SQL Server没有密钥。 Always Encrypted的主要价值主张是它保护数据免受SQL Server管理员的攻击。目前,加密列上唯一可能的操作是相等。
来自官方文件
确定性加密始终为其生成相同的加密值 任何给定的纯文本值。使用确定性加密允许 对加密的点查找,等同连接,分组和索引 列。但是,也可能允许未经授权的用户猜测 通过检查中的模式来获取有关加密值的信息 加密列,特别是如果有一小部分可能的话 加密值,例如True / False或North / South / East / West区域。 确定性加密必须使用具有binary2的列排序规则 字符列的排序顺序。
随机加密使用一种以较少的方式加密数据的方法 可预测的方式。随机加密更安全,但可以防止 搜索,分组,索引和加入加密列。