我已设置 Azure SQL 数据库并启用始终加密。
其中一列 (column3) 是 varchar(Max)
。
当我从 SSMS 查询数据库而不使用“列加密设置=启用”
时,我可以看到所有列都有二进制数据。
当我使用“列加密设置=启用”从 SSMS 查询数据库
时,出现如下错误:
An error occurred while executing batch. Error message is: Retrieving encrypted column 'column3' with CommandBehavior=SequentialAccess is not supported.
这就是我的表定义:
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
)
如果我删除第 3 列上的加密,一切正常,我可以看到解密的值。
我在这里遗漏了什么吗?
最佳答案
来自此处 Always Encrypted 团队的开发人员。
SQL Server 和 Azure SQL DB 不允许从 SSMS 查询具有“列加密设置=启用”的 VARCHAR(MAX) 列,因为 SSMS 采用顺序访问来流式传输可能较大的 varchar(MAX) 值。 SSMS 在设计上强制执行此选择,因为它提供了一种查询大对象中部分字节位置的机制(从而避免在内存中存储整个大 blob)。但是,相比之下,Always Encrypted 不允许对加密列进行部分解密。此限制源于这样一个事实:我们使用分组密码并将 HMAC 存储在加密的单元中,如果没有完整的单元值,我们无法验证 HMAC 并解密数据。
作为替代方案,您可以从 ADO.Net 客户端查询具有“列加密设置=启用”的 varchar(max)(不使用 SequentialAccess)。
关于sql-server - 不支持使用 CommandBehavior=SequentialAccess 检索加密列 'xxx',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34348468/