ALTER COLUMN ENCRYPTION KEY (Transact-SQL)

适用于:SQL Server 2016 (13.x) 及更高版本 Azure SQL 数据库 Azure SQL 托管实例

在数据库中更改列加密密钥,添加或删除加密的值。 列加密密钥最多可具有两个值,这样使相应的列主密钥能够进行轮换。 使用 Always Encrypted具有安全 enclave 的 Always Encrypted 加密列时,会使用列加密密钥。 添加列加密密钥值之前,必须使用 SQL Server Management Studio 或 CREATE MASTER KEY 语句定义用于加密该值的列主密钥。

Transact-SQL 语法约定

语法

ALTER COLUMN ENCRYPTION KEY key_name   
    [ ADD | DROP ] VALUE   
    (  
        COLUMN_MASTER_KEY = column_master_key_name   
        [, ALGORITHM = 'algorithm_name' , ENCRYPTED_VALUE =  varbinary_literal ]   
    ) [;]  

参数

key_name
要更改的列加密密钥。

column_master_key_name
指定用于对列加密密钥 (CEK) 进行加密的列主密钥 (CMK) 的名称。

algorithm_name
用于对值进行加密的加密算法的名称。 系统提供程序的算法必须为 RSA_OAEP。 删除列加密密钥值时,此参数无效。

varbinary_literal
使用指定的主加密密钥加密的 CEK BLOB。 删除列加密密钥值时,此参数无效。

警告

切勿在此语句中传递纯文本 CEK 值。 这样做不利于发挥此功能的优点。

备注

通常情况下,创建列加密密钥时,密钥只具有一个加密值。 列主密钥需要进行轮换(需要将当前的列主密钥替换为新的列主密钥)时,可以为列加密密钥添加一个新值,并使用新的列主密钥进行加密。 此工作流可以确保客户端应用程序能访问使用列加密密钥加密的数据,同时客户端应用程序将能使用新的列主密钥。 通过 Always Encrypted 功能,无权访问新主密钥的客户端应用程序中的驱动程序将能够通过列加密密钥值(使用旧的列主密钥进行加密)来访问敏感数据。 Always Encrypted 支持的加密算法要求纯文本值具有 256 位。

建议使用诸如 SQL Server Management Studio (SSMS) 或 PowerShell 等工具来轮换列主密钥。 请参阅使用 SQL Server Management Studio 轮换 Always Encrypted 密钥使用 PowerShell 轮换 Always Encrypted 密钥

应使用密钥存储提供程序生成加密值,该提供程序封装了存储有列主密钥的密钥存储。

轮换列主密钥,原因如下:

  • 法规遵从性要求可能要求定期轮换密钥。
  • 列主密匙遭到破坏,出于安全考虑,需对其进行轮换。
  • 若要启用或禁用与服务器端上的安全 enclave 共享列加密密钥。 例如,如果当前列主密钥不支持 enclave 计算(尚未使用 ENCLAVE_COMPUTATIONS 属性定义)并且你想要在使用列主密钥加密的列加密密钥进行保护的列上启用 enclave 计算,需要将列主密钥替换为具有 ENCLAVE_COMPUTATIONS 属性的新密钥。 Always Encrypted 密钥管理概述管理具有安全 enclave 的 Always Encrypted 的密钥

可使用 sys.columns (Transact-SQL)sys.column_encryption_keys (Transact-SQL)sys.column_encryption_key_values (Transact-SQL) 查看列加密密钥的相关信息。

权限

需要对数据库具有 ALTER ANY COLUMN ENCRYPTION KEY 权限

示例

A. 添加列加密密钥值

下面的示例更改名为 MyCEK 的列加密密钥。

ALTER COLUMN ENCRYPTION KEY MyCEK  
ADD VALUE  
(  
    COLUMN_MASTER_KEY = MyCMK2,   
    ALGORITHM = 'RSA_OAEP',   
    ENCRYPTED_VALUE = 0x016E000001630075007200720065006E00740075007300650072002F006D0079002F0064006500650063006200660034006100340031003000380034006200350033003200360066003200630062006200350030003600380065003900620061003000320030003600610037003800310066001DDA6134C3B73A90D349C8905782DD819B428162CF5B051639BA46EC69A7C8C8F81591A92C395711493B25DCBCCC57836E5B9F17A0713E840721D098F3F8E023ABCDFE2F6D8CC4339FC8F88630ED9EBADA5CA8EEAFA84164C1095B12AE161EABC1DF778C07F07D413AF1ED900F578FC00894BEE705EAC60F4A5090BBE09885D2EFE1C915F7B4C581D9CE3FDAB78ACF4829F85752E9FC985DEB8773889EE4A1945BD554724803A6F5DC0A2CD5EFE001ABED8D61E8449E4FAA9E4DD392DA8D292ECC6EB149E843E395CDE0F98D04940A28C4B05F747149B34A0BAEC04FFF3E304C84AF1FF81225E615B5F94E334378A0A888EF88F4E79F66CB377E3C21964AACB5049C08435FE84EEEF39D20A665C17E04898914A85B3DE23D56575EBC682D154F4F15C37723E04974DB370180A9A579BC84F6BC9B5E7C223E5CBEE721E57EE07EFDCC0A3257BBEBF9ADFFB00DBF7EF682EC1C4C47451438F90B4CF8DA709940F72CFDC91C6EB4E37B4ED7E2385B1FF71B28A1D2669FBEB18EA89F9D391D2FDDEA0ED362E6A591AC64EF4AE31CA8766C259ECB77D01A7F5C36B8418F91C1BEADDD4491C80F0016B66421B4B788C55127135DA2FA625FB7FD195FB40D90A6C67328602ECAF3EC4F5894BFD84A99EB4753BE0D22E0D4DE6A0ADFEDC80EB1B556749B4A8AD00E73B329C95827AB91C0256347E85E3C5FD6726D0E1FE82C925D3DF4A9  
);  
GO  
  

B. 删除列加密密钥值

下面的示例删除了一个值,对名为 MyCEK 的列加密密钥进行了更改。

ALTER COLUMN ENCRYPTION KEY MyCEK  
DROP VALUE  
(  
    COLUMN_MASTER_KEY = MyCMK  
);  
GO  

另请参阅

CREATE COLUMN ENCRYPTION KEY (Transact-SQL)
DROP COLUMN ENCRYPTION KEY (Transact-SQL)
CREATE COLUMN MASTER KEY (Transact-SQL)
Always Encrypted(数据库引擎)
sys.column_encryption_keys (Transact-SQL)
sys.column_encryption_key_values (Transact-SQL)
sys.columns (Transact-SQL)
Always Encrypted
Always Encrypted 密钥管理概述
管理具有安全 enclave 的 Always Encrypted 的密钥