不支持使用CommandBehavior = SequentialAccess检索加密列'xxx'

时间:2015-12-18 04:18:14

标签: sql-server encryption sql-server-2016 azure-sql-database always-encrypted

我已设置Azure SQL数据库并启用了始终加密。

其中一列(第3列)是varchar(Max)

当我在不使用"column encryption setting=enabled"的情况下从SSMS查询数据库时,我可以看到所有列都有二进制数据。

当我使用"column encryption setting=enabled"从SSMS查询数据库时,我收到如下错误:

  

执行批处理时发生错误。错误消息是:不支持使用CommandBehavior = SequentialAccess检索加密列'column3'。

这是我的表定义:

CREATE TABLE [dbo].[mytable](
    [column1] [varchar](2000) ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [CEK_Auto1], ENCRYPTION_TYPE = Deterministic, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NULL,
    [column2] [datetime] ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [CEK_Auto1], ENCRYPTION_TYPE = Deterministic, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NULL,
    [column3] [varchar](max) ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [CEK_Auto1], ENCRYPTION_TYPE = Deterministic, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NULL
)

如果我删除了column3上的加密,一切正常,我可以看到解密的值。

我在这里错过了什么吗?

enter image description here

2 个答案:

答案 0 :(得分:2)

来自Always Encrypted团队的开发人员。

SQL Server和Azure SQL DB不允许使用"列加密设置=启用"查询VARCHAR(MAX)列。来自SSMS的SSMS使用顺序访问来传输潜在的大varchar(MAX)值。 SSMS通过设计强制执行此选择,因为它提供了一种查询大对象中的部分字节位置的机制(从而避免在内存中存储整个大blob)。但是,相反,Always Encrypted不允许对加密列进行部分解密。这种限制源于我们使用分组密码并将HMAC存储在加密单元中的事实,没有完整的单元格值,我们无法验证HMAC并解密数据。

作为替代方案,您可以使用"列加密设置=启用"来查询varchar(max)。来自ADO.Net客户端(不使用SequentialAccess)。

答案 1 :(得分:0)

此问题已在2016年8月发布的SSMS 16.3中得到修复。您现在可以查询和解密varchar(max)和其他LOB列。