我已设置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上的加密,一切正常,我可以看到解密的值。
我在这里错过了什么吗?
答案 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列。