【问题标题】:How does the client know which columns to encrypt with SQL Server Always encrypted?客户端如何知道要使用 SQL Server 始终加密的列进行加密?
【发布时间】:2020-11-11 16:41:17
【问题描述】:
我想知道 SQL 客户端在将数据发送到 SQL Server 之前如何知道要加密哪些列?毕竟,加密设置是在 SQL Server 中管理的。
在 de EF 元数据中没有这些设置的痕迹。另外,我发现可以更改列的加密设置,而无需部署应用程序的更新版本。
上下文:
【问题讨论】:
标签:
sql-server-2017
ef-core-3.1
always-encrypted
【解决方案1】:
SQL Server Profiler 揭示了客户端用来推断哪些列被加密的机制。
在这种情况下,我更新了用户 42 的活动标志。
首先,客户端发送这个查询:
exec sp_describe_parameter_encryption N'SET NOCOUNT ON;
UPDATE [Users] SET [Active] = @p0
WHERE [Id] = @p1;
SELECT @@ROWCOUNT;
',N'@p1 int,@p0 bit'
这将返回两个带有加密元数据的结果集:
第一个有这些列:
- 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_executesql N'SET NOCOUNT ON;
UPDATE [Users] SET [Active] = @p0
WHERE [Id] = @p1;
SELECT @@ROWCOUNT;
',N'@p1 int,@p0 bit',@p1=42,@p0=1
在我的情况下,这个专栏并没有真正的加密,所以sp_describe_parameter_encryption的结果不是很有趣,但是机制很清楚。
SELECT 查询之前没有这样的元查询。