如何在SQL Server 2016中加密列时查询数据

时间:2018-06-06 18:07:47

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

我一直在努力寻找这个问题的解决方案。我在SQL Server 2016中从我的数据库加密了我的列。为了读取数据,我已经设置了参数"Column Encryption Setting=Enabled";我知道我的证书中没有问题,因为我能够查询SELECT * FROM TABLE,但我无法使用WHERE条件。例如 "SELECT column FROM Table WHERE column='abc'"类似的东西。

错误是:

  

“操作数类型冲突:varchar与varchar(8000)不兼容   加密(encryption_type ='DETERMINISTIC',......等等“

我不知道为什么我无法从加密列中检索数据。

2 个答案:

答案 0 :(得分:1)

我假设您已使用SQL Server的“始终加密”功能对列进行了加密。

使用始终加密,SQL Server不知道用于加密和解密数据的密钥。客户端应用程序的工作是在将数据发送到SQL Server之前对其进行加密。

执行此查询时:

SELECT column FROM Table WHERE column='abc'

您要SQL Server将未加密的varchar 'abc'与在加密列中找到的加密值进行比较。这将失败-正如您已经指出的那样。

您的客户端应用程序必须先将要在WHERE子句中使用的值加密,然后再发送给SQL Server。

如果您使用的是SSMS,则可以通过对始终加密的参数启用参数化来实现。您可以在SSMS中的查询>>查询选项>>执行>>高级>>为始终加密启用参数化上启用此功能。

启用此功能后,您将可以像这样过滤表格:

DECLARE @MyValue VARCHAR(100) = 'abc'; 
SELECT [Column] FROM [Table] WHERE [Column] = @MyValue;

幕后发生的事情是,SSMS在将参数@MyValue发送给SQL Server之前先对其进行加密。立即声明并初始化参数很重要。否则,SSMS无法在将查询发送到SQL Server之前加密该值。

您可以阅读有关parameterization for always encrypted here的更多信息。如果您不清楚上述解释,请在下面发表评论。

答案 1 :(得分:0)

您需要使用 DECRYPTBYKEY

SELECT *
FROM Table WHERE convert(varchar,DecryptByKey(column))='abc'

使用此功能的方式取决于您使用的是对称密钥和哈希,还是只使用密钥等。