【问题标题】:How to query data when columns are encrypted in SQL Server 2016在 SQL Server 2016 中加密列时如何查询数据
【发布时间】:2018-06-06 18:07:47
【问题描述】:

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

错误是:

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

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

【问题讨论】:

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


    【解决方案1】:

    我假设您已经使用 SQL Server 的 Always Encrypted 功能加密了您的列。

    使用 Always Encrypted SQL Server 不知道用于加密和解密数据的密钥。在将数据发送到 SQL Server 之前加密数据是客户端应用程序的工作。

    当你执行这个查询时:

    SELECT column FROM Table WHERE column='abc'
    

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

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

    如果您使用的是 SSMS,您可以通过启用始终加密的参数化来做到这一点。您可以在 SSMS 中的 Query>>Query options>>Execution>>Advanced>>Enable Parameterization for Always Encrypted 下启用此功能。

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

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

    在幕后发生的事情是 SSMS 在将 @MyValue 参数的值发送到 SQL Server 之前为您加密。立即声明和初始化参数很重要。否则 SSMS 在将查询发送到 SQL Server 之前无法加密该值。

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

    【讨论】:

    • 解密所有密钥并搜索 5000 条记录需要多长时间?我想如果不加密,这将花费两倍以上的时间
    【解决方案2】:

    您需要使用DECRYPTBYKEY

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

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

    【讨论】:

    • 我应该如何在上述函数中应用这些键。我不确定这些密钥。目前我知道我只是使用列主密钥和列加密密钥
    • 解密所有密钥并搜索 5000 条记录需要多长时间?我想如果不加密,这将花费两倍以上的时间
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-04
    • 2016-07-16
    相关资源
    最近更新 更多