【问题标题】:Sql 2016 Always Encrypted - Join operation with Encrypted and Non Encrypted column?Sql 2016 Always Encrypted - 使用加密和非加密列加入操作?
【发布时间】:2016-10-28 06:12:40
【问题描述】:

如何在 Sql server 2016 中使用加密和非加密列执行联接操作。我使用 .net 框架 4.6.1。列加密设置 = 在连接字符串中启用。

代码:

cmd = new SqlCommand("select determin.name as name from determin inner join determinjoin on determin.name = determinjoin.name ", con); 

错误:

    The data types varchar(20) encrypted with (encryption_type = 
'DETERMINISTIC', encryption_algorithm_name = 
'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'CEK_Auto4', 
column_encryption_key_database_name = 'depdb') collation_name = 
'Latin1_General_BIN2' and varchar are incompatible in the equal to operator.

【问题讨论】:

  • 此时您不应该问自己更深层次的问题吗?例如,“如果这些数据值得加密,为什么它只在某些表中加密而在其他表中不加密?”
  • 这是要求。我必须在一个表中的加密列上加入连接,在另一个表中加入非加密列。
  • 我想这是不可能的。存储在 sql server 中的值是加密的。列加密设置不会更改数据页上的基础值。您必须使用 MS 的始终加密算法对未加密的值进行哈希处理,以使两个值在连接时匹配。

标签: c# .net c#-4.0 sql-server-2016 always-encrypted


【解决方案1】:

按原样,你不能。查询处理器无权访问用于解密连接的密钥。如果你真的必须加入这两个表,你应该用确定性加密来加密这两个列。

也就是说,您可能仍然不想这样做。对于超过几百万行的任何内容,性能都会从糟糕到糟糕。如果您确实必须并且没有修改架构的选项,那么测试并查看您的用户在看到它的执行方式后是否仍然感觉相同。如果您可以对架构进行小幅调整,则有一些选项可以使这更容易。例如,为此类连接使用一些备用列。可能是代理密钥,甚至可能是对安全不敏感的自然密钥。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-15
    • 2019-02-04
    • 2011-11-01
    相关资源
    最近更新 更多