【问题标题】: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 查询之前没有这样的元查询。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多