适用于:SQL Server
Azure SQL 数据库
Azure SQL 托管实例
Azure Synapse Analytics
Microsoft Fabric SQL 数据库
在 SQL Server 中生成对称密钥并指定其属性。
此功能与使用数据层应用程序框架 (DACFx) 的数据库导出不兼容。 必须在导出之前删除所有对称密钥。
注意
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