CREATE SYMMETRIC KEY (Transact-SQL)

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

在 SQL Server 中生成对称密钥并指定其属性。

此功能与使用数据层应用程序框架 (DACFx) 的数据库导出不兼容。 必须在导出之前删除所有对称密钥。

Transact-SQL 语法约定

注意

Azure Synapse Analytics 中的无服务器 SQL 池不支持此语法。

语法

CREATE SYMMETRIC KEY key_name
    [ AUTHORIZATION owner_name ]
    [ FROM PROVIDER provider_name ]
    WITH
        [
            <key_options> [ , ... n ]
            | ENCRYPTION BY <encrypting_mechanism> [ , ... n ]
        ]

<key_options> ::=
    KEY_SOURCE = 'pass_phrase'
    | ALGORITHM = <algorithm>
    | IDENTITY_VALUE = 'identity_phrase'
    | PROVIDER_KEY_NAME = 'key_name_in_provider'
    | CREATION_DISPOSITION = { CREATE_NEW | OPEN_EXISTING }

<algorithm> ::=
    DES | TRIPLE_DES | TRIPLE_DES_3KEY | RC2 | RC4 | RC4_128
    | DESX | AES_128 | AES_192 | AES_256

<encrypting_mechanism> ::=
    CERTIFICATE certificate_name
    | PASSWORD = 'password'
    | SYMMETRIC KEY symmetric_key_name
    | ASYMMETRIC KEY asym_key_name

参数

key_name

指定在数据库中识别该对称密钥的唯一名称。 这是必需参数。 当 key_name 以一个数字符号 (#) 为开头时指定临时密钥。 例如,#temporaryKey900007。 您不能创建名称以多个 # 开头的对称密钥。 您不能使用 EKM 提供程序创建临时对称密钥。

AUTHORIZATION owner_name

指定拥有此密钥的数据库用户或应用程序角色的名称。

FROM PROVIDER provider_name

指定可扩展密钥管理 (EKM) 提供程序和名称。 该密钥不是从 EKM 设备中导出的。 必须先使用 CREATE PROVIDER 语句定义此提供程序。 有关创建外部密钥提供程序的详细信息,请参阅可扩展密钥管理 (EKM)

注意

此选项在包含的数据库中不可用。

KEY_SOURCE = 'pass_phrase'

指定从中派生密钥的密码。

IDENTITY_VALUE = 'identity_phrase'

指定一个标识短语,将根据该短语生成 GUID 以标记使用临时密钥加密的数据。

PROVIDER_KEY_NAME = 'key_name_in_provider'

指定在可扩展密钥管理提供程序中引用的名称。

注意

此选项在包含的数据库中不可用。

CREATION_DISPOSITION = { CREATE_NEW |OPEN_EXISTING }

创建或将一个对称密钥映射到可扩展的密钥管理设备。

  • CREATE_NEW

    在可扩展的密钥管理设备上创建新密钥。 如果密钥已存在于设备上,该语句将失败,并显示错误。

  • OPEN_EXISTING

    将 SQL Server 非对称密钥映射到现有的可扩展密钥管理密钥。 如果未提供 CREATION_DISPOSITION = OPEN_EXISTING,则默认为 CREATE_NEW

certificate_name

指定用于对对称密钥进行加密的证书的名称。 该证书必须已存在于数据库中。

password

指定一个密码,从该密码派生出用来保护对称密钥的 TRIPLE_DES 密钥。 password 必须满足运行 SQL Server 实例的计算机的 Windows 密码策略要求。 始终使用强密码。

symmetric_key_name

指定用于对要创建的密钥进行加密的对称密钥。 指定的密钥必须已存在于数据库中,并且必须打开。

asym_key_name

指定用于对要创建的密钥进行加密的非对称密钥。 此非对称密钥必须已经存在于数据库中。

<算法>

指定加密算法。

警告

从 SQL Server 2016 (13.x)开始,除 AES_128、AES_192 和 AES_256 以外的所有算法都已过时。 若要使用旧算法(不推荐),必须将数据库的数据库兼容级别设置为 120 或更低。

注解

创建对称密钥时,必须使用以下至少一个选项来加密对称密钥:

  • 证书 (certificate)
  • 密码
  • 对称密钥 (symmetric key)
  • 非对称密钥
  • 提供程序

可使用上述每种类型中的多项对密钥进行加密。 换言之,可以同时使用多个证书、密码、对称密钥以及非对称密钥对单个对称密钥进行加密。

为了保护对称密钥的密钥材料,SQL Server 和 Azure SQL 以加密形式存储密钥材料。 从历史上看,此加密利用了 PKCS#1 v1.5 填充模式;从数据库兼容性级别 170 开始,加密使用 OAEP-256 填充模式通过证书或非对称密钥进行加密。 在 dm_database_encryption_keys中, encryptor_type 将显示为 CERTIFICATE_OAEP_256 而不是 CERTIFICATE

注意

使用密码而非证书(或另一个密钥)对对称密钥进行加密时,使用 TRIPLE DES 加密算法来加密密码。 因此,用强加密算法(如 AES)创建的密钥本身受较弱算法的保护。

在将对称密钥分发给多个用户之前,可以使用可选的密码对该密钥进行加密。

临时密钥由创建它们的用户所拥有。 临时密钥只对当前会话有效。

IDENTITY_VALUE 生成一个 GUID,使用该 GUID 来标记使用新对称密钥加密的数据。 该标记可用于将密钥与加密数据进行匹配。 由某个特定短语生成的 GUID 始终相同。 在使用短语生成了 GUID 之后,只要存在至少一个正在使用该短语的此数据库中的对称密钥,就不能再次使用该短语。 IDENTITY_VALUE 是一个可选的子句;但是,我们建议在存储使用临时密钥加密的数据时使用该子句。

没有默认的加密算法。

重要

建议不要使用 RC4 和 RC4_128 序列密码保护敏感数据。 SQL Server 不会对利用此类密钥执行的加密进行进一步编码。

可以在 sys.symmetric_keys 目录视图中查看对称密钥的有关信息。

使用通过加密提供程序创建的对称密钥无法加密对称密钥。

关于 DES 算法的说明

  • DESX 的命名不正确。 使用 ALGORITHM = DESX 创建的对称密钥实际上使用的是具有 192 位密钥的 TRIPLE DES 密码。 不提供 DESX 算法。 在 SQL Server的未来版本中将删除此功能。 请避免在新的开发工作中使用该功能,并着手修改当前还在使用该功能的应用程序。
  • 使用 ALGORITHM = TRIPLE_DES_3KEY 创建的对称密钥使用的是具有 192 位密钥的 TRIPLE DES。
  • 使用 ALGORITHM = TRIPLE_DES 创建的对称密钥使用的是具有 128 位密钥的 TRIPLE DES。

不推荐使用 RC4 算法

对不同数据块重复使用相同的 RC4 或 RC4_128 KEY_GUID 会产生相同的 RC4 密钥,因为 SQL Server 不会自动提供 salt。 重复使用相同的 RC4 密钥是已知错误,会导致加密非常不可靠。 因此,不推荐使用 RC4 和 RC4_128 关键字。 在 SQL Server的未来版本中将删除此功能。 请避免在新的开发工作中使用该功能,并着手修改当前还在使用该功能的应用程序。

警告

RC4 算法仅用于支持向后兼容性。 仅当数据库兼容级别为 90 或 100 时,才能使用 RC4 或 RC4_128 对新材料进行加密。 (建议不要使用。)而是使用一种较新的算法,如 AES 算法之一。 在 SQL Server 中,可以通过任何兼容级别对使用 RC4 或 RC4_128 加密的材料进行解密。

权限

要求对数据库具有 ALTER ANY SYMMETRIC KEY 权限。 如果指定了 AUTHORIZATION,则要求对数据库用户具有 IMPERSONATE 权限,或者对应用程序角色具有 ALTER 权限。 如果使用证书或非对称密钥进行加密,则要求对证书或非对称密钥具有 VIEW DEFINITION 权限。 只有 Windows 登录名、 SQL Server 登录名和应用程序角色才能拥有对称密钥。 其他组和角色不能拥有对称密钥。

示例

答: 创建对称密钥

下面的示例使用 JanainaKey09 算法创建名为 AES 256 的对称密钥,然后使用证书 Shipping04 对新密钥进行加密。

CREATE SYMMETRIC KEY JanainaKey09
WITH ALGORITHM = AES_256
ENCRYPTION BY CERTIFICATE Shipping04;
GO

B. 创建临时对称密钥

下面的示例用密码 #MarketingXXV 创建了一个名为 The square of the hypotenuse is equal to the sum of the squares of the sides 的临时对称密钥。 为该密钥提供了通过字符串 Pythagoras 生成的 GUID,并使用证书 Marketing25 对该密钥进行加密。

CREATE SYMMETRIC KEY #MarketingXXV
WITH ALGORITHM = AES_128,
KEY_SOURCE
     = 'The square of the hypotenuse is equal to the sum of the squares of the sides',
IDENTITY_VALUE = 'Pythagoras'
ENCRYPTION BY CERTIFICATE Marketing25;
GO

°C 使用可扩展密钥管理 (EKM) 设备创建对称密钥

下面的示例使用一个名为 MySymKey 的提供程序和一个密钥名称 MyEKMProvider 创建一个名为 KeyForSensitiveData 的对称密钥。 该示例向 User1 授权,并假定系统管理员已在 SQL Server 中注册了名为 MyEKMProvider 的提供程序。

CREATE SYMMETRIC KEY MySymKey
AUTHORIZATION User1
FROM PROVIDER EKMProvider
WITH
PROVIDER_KEY_NAME='KeyForSensitiveData',
CREATION_DISPOSITION=OPEN_EXISTING;
GO