在 SSMS 21 中使用 Always Encrypted 向导配置列加密

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例

Always Encrypted 向导是一个功能强大的工具,可让你为所选数据库列设置所需的 Always Encrypted 配置。 根据当前配置和所需的目标配置,该向导可以对列加密或解密(删除加密),或重新对其加密(例如,使用为列配置的新列加密密钥或不同于当前类型的加密类型)。 可以在该向导的单次运行中配置多个列。

通过向导,可以使用现有加密密钥加密列、生成新的列加密密钥,或同时生成新的列加密密钥和新列主密钥。

通过向导的评估,可以评估所选数据库中的表,或选择要分析的特定表。 它标识适合加密的列,并突出显示其数据类型、约束和其他因素与 Always Encrypted 不兼容的列。 该向导提供了每个字段的限制的详细列表,解释了为何无法加密特定列。

使用安全 enclave 配置数据库后,无需将数据移出数据库即可运行加密操作。 如果任何依赖项会阻止要加密的列的架构更改,向导将移除所有此类依赖项。 它使用数据库引擎中的 enclave 为每个列颁发就地加密。 加密完成后,向导将重新创建依赖项。 有关具有安全 Enclave 的 Always Encrypted 的详细信息,请参阅具有安全 Enclave 的 Always Encrypted

如果未使用安全 enclave 配置数据库,向导将允许启用安全 enclave。 假设你选择不启用安全 enclave,或者未使用已启用 enclave 的密钥。 在这种情况下,向导将数据移出数据库,并在 SSMS 进程中执行加密操作。 该向导在数据库中创建具有所需加密配置的新表(或表),从原始表加载所有数据,执行请求的加密操作,将数据上传到新表,然后将一个或多个原始表与新表交换。

提示

使用具有安全 enclave 的 Always Encrypted 就地加密(如果环境中可用)可能会大大缩短加密操作的时间和可靠性。

运行加密操作可能需要很长时间。 在此期间,数据库无法写入事务。 建议将 PowerShell 作为对较大表执行加密操作的工具。 请参阅 通过 PowerShell 配置使用 Always Encrypted 的列加密,或 通过 PowerShell 配置就地列加密

权限

若要使用向导执行加密操作,必须具有和VIEW ANY COLUMN MASTER KEY DEFINITIONVIEW ANY COLUMN ENCRYPTION KEY DEFINITION权限。 还需要密钥存储权限才能创建、访问和使用列主密钥。 有关密钥存储权限的详细信息,请转到 为 Always Encrypted 创建和存储列主密钥,或查找与密钥存储相关的部分。

打开 Always Encrypted 向导

可以在三个不同的级别启动该向导:

  • 如果要加密不同表中的多个列,请在数据库级别进行加密。
  • 在表级别,如果要加密相同表中的多个列。
  • 如果要加密某个特定的列,可以在列级层面进行加密。
  1. 使用 SQL Server Management Studio 的对象资源管理器组件连接到 SQL Server。

  2. 若要进行加密,请执行以下操作:

    - 位于数据库中不同表中的多个列,右键单击数据库,指向 “任务”,然后选择“ 始终加密向导”。

    - 同一表中的多个列,导航到该表,右键单击它,然后选择“ 始终加密向导”。

    - 单个列,导航到该列,右键单击该列,然后选择 “始终加密向导”。

“列选择”页

在此页上,选择要加密、重新加密或解密的列,并为其定义目标加密配置。

若要加密纯文本列(未加密的列),请为列选择加密类型(“确定性”或“随机”)和加密密钥。

选择所需的加密类型和密钥以更改加密类型或轮换(更改)已加密列的列加密密钥。

如果希望该向导使用新的列加密密钥加密或重新加密一列或多列,请选取在名称中包含“(New)”的密钥。 向导将生成密钥。

若要解密当前加密的列,请选择 “纯文本 ”作为加密类型。

提示

如果要使用就地加密并使用现有密钥,请确保选择已启用 enclave 的密钥(已启用 enclave)进行批注。

向导不支持对临时表和内存中表执行加密操作。 可以使用 Transact-SQL 创建空的临时表或内存中表,并使用应用程序插入数据。

“列评估”页

将评估所选表和列是否适合 Always Encrypted 或具有安全 enclave 的 Always Encrypted。 评估会自动启动,方法是显示状态栏及其当前评估的表和列的列表,这些表和列已完成,以及要执行哪些操作。 评估会根据 限制检查表列是否符合具有安全 enclave 的 Always Encrypted 或 Always Encrypted 的要求。

如果列不符合要求,评估会显示该列的“错误”状态。 选择“消息”链接可以获取有关无法加密该特定列的原因的详细信息。

可以通过选中复选框来加密传递的评估列。 向导会自动跳过未通过评估的任何列。 此外,还可以通过选择“报表”按钮将结果导出到 CSV 或文本文件。

“主密钥配置”页

如果为上一页上的任何列选择了自动生成的列加密密钥,则需要选择现有的列主密钥,或配置一个新的列主密钥来加密此页上的列加密密钥。

配置新的列主密钥时,可以在 Windows 证书存储或 Azure 密钥库中选择现有密钥,并让向导只为数据库中的密钥创建元数据对象,或者可以选择生成密钥和描述数据库中密钥的元数据对象。

若要使用就地加密,请为新的列主密钥选择 “允许 enclave 计算 ”。 仅当数据库配置了安全 Enclave 时,才允许选择此复选框。

有关在 Windows 证书存储、Azure Key Vault 或其他密钥存储中创建和存储列主密钥的详细信息,请参阅 创建和存储 Always Encrypted 的列主密钥,或 使用安全 enclave 管理 Always Encrypted 的密钥

提示

向导仅允许在 Windows 证书存储和 Azure 密钥库中浏览和创建密钥。 它还自动生成新键的名称和描述它们的数据库元数据对象。 假设你需要更好地控制密钥的预配方式(以及包含列主密钥的密钥存储的更多选择)。 在这种情况下,可以使用“ 新建列主密钥 ”和 “新建列加密密钥 ”对话框先创建密钥,然后运行向导并选择已创建的密钥。 请参阅 使用“新建列主密钥”对话框预配列主密钥预配启用 Enclave 的密钥,以及 使用“新建列加密密钥”对话框预配列加密密钥

“就地加密设置”页

如果在数据库中配置了安全 enclave,并且使用的是已启用 enclave 的密钥,则此页面允许你指定就地加密所需的 enclave 证明参数。 如果不想使用就地加密,请取消选择“对符合条件的列使用就地加密”以继续使用客户端加密。 建议启用此复选框,以便向导可以使用就地加密。

有关 Enclave 证明的详细信息,请参阅 使用 Azure 证明配置 Always Encrypted 证明

“运行设置”页

该向导支持两种方法来设置目标加密配置:联机和脱机。

使用脱机方法时,目标表(以及任何与目标表相关的表,例如,目标表与其具有外键关系的任何表)不可用于在操作期间写入事务。 使用脱机方法时,始终保留外键约束(CHECK 或 NOCHECK)的语义。

使用联机方法,以增量方式执行复制、加密、解密或重新加密数据的操作。 应用程序可以在数据移动操作期间读取和写入目标表的数据,但上次迭代除外,持续时间受 最大停机时间 参数的限制。 若要检测和处理复制数据时应用程序可以进行的更改,向导将在目标数据库中启用更改跟踪。 因此,联机方法可能会消耗数据库端的资源比脱机方法更多的资源。 使用联机方法时,该操作可能需要更多时间,尤其是在针对数据库运行写入密集型工作负荷时。 联机方法可用于一次加密一个表,该表必须有一个主键。 默认情况下,使用 NOCHECK 选项重新创建外键约束,以最大程度地减少对应用程序的影响。 可以通过启用 Keep check foreign key constraints 选项来强制保留外键约束的语义。

下面是在脱机和联机方法之间进行选择的准则:

采用离线方法:

  • 尽量减少操作的持续时间。
  • 同时加密/解密/重新加密多个表中的列。
  • 如果目标表没有主键。

使用联机方法:

  • 最小化数据库对应用程序造成的停机时间/不可用性。

加密后

请清除所有批处理和存储过程的计划缓存,以刷新访问表的参数加密信息。

ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE;

注释

如果不从缓存中删除受影响查询的计划,加密后的第一次执行查询可能会失败。

使用 ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHEDBCC FREEPROCCACHE 仔细清除计划缓存,因为它可能会导致临时查询性能下降。 若要最大程度地减少清除缓存的负面影响,可以选择性地删除仅受影响查询的计划。

调用 sp_refresh_parameter_encryption 更新每个模块(存储过程、函数、视图、触发器)的元数据,这些参数保存在 sys.parameters 中,并且可能已通过加密列来失效。