如何解决客户端如何知道要使用SQL Server始终加密的列?
我想知道sql客户端在将数据发送到sql Server之前如何知道要加密的列?毕竟,加密设置是在sql Server中管理的。
在EF元数据中没有这些设置的痕迹。另外,我发现可以更改列的加密设置,而无需部署应用程序的更新版本。
上下文:
- Microsoft documentation on Always Encrypted
- sql Server 2017
- EF Core 3.1客户端
解决方法
SQL Server Profiler揭示了客户端用来推断要加密的列的机制。
在这种情况下,我更新了用户42的活动标志。
首先,客户端发送以下查询:
NdOverlay
这将返回两个带有加密元数据的结果集:
第一个包含以下列:
- column_encryption_key_ordinal
- database_id
- column_encryption_key_id
- column_encryption_key_version
- column_encryption_key_metadata_version
- column_encryption_key_encrypted_value
- column_master_key_store_provider_name
- column_master_key_path
- column_encryption_key_encryption_algorithm_name
第二个具有以下列:
- parameter_ordinal
- 参数名称
- column_encryption_algorithm
- column_encryption_type
- column_encryption_key_ordinal
- column_encryption_normalization_rule_version
其后是实际的更新查询:
exec sp_describe_parameter_encryption N'SET NOCOUNT ON;
UPDATE [Users] SET [Active] = @p0
WHERE [Id] = @p1;
SELECT @@ROWCOUNT;
',N'@p1 int,@p0 bit'
就我而言,此列上没有实际的加密,因此exec sp_executesql N'SET NOCOUNT ON;
UPDATE [Users] SET [Active] = @p0
WHERE [Id] = @p1;
SELECT @@ROWCOUNT;
',@p0 bit',@p1=42,@p0=1
的结果不是很有趣,但是机制很明确。
SELECT查询之前没有这样的元查询。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。