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

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

我已设置 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 列上的加密,一切正常,我可以看到解密的值。

我在这里遗漏了什么吗?

enter image description here

最佳答案

来自此处 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/

相关文章:

sql-server - 是否可以同时安装 SQL Server Express 版本和 SQL Server Developer 版本?

c# - 有没有办法在 C# 中创建一个 sqllocaldb 实例?

c# - Aes 加密...缺少一个重要部分

sql-server - 选择表中的旧记录

java - 为什么我在解密时得到 'BadPaddingException'?

android - 加解密算法

c# - SQL Server 2016中列加密时如何查询数据

sql-server - 通过 SSMS 编辑 dtsx

sql-server - 将 rtf blob 转换为 MS Sql 中的文本

用于查询的 XML 格式的 SQL Server 执行计划太大,无法完整显示或保存