EncryptByKey (Transact-SQL)
使用对称密钥加密数据。
语法
EncryptByKey (
key_GUID , { 'cleartext' | @cleartext }
[
, { add_authenticator | @add_authenticator }
, { authenticator | @authenticator }
]
)
参数
- key_GUID
用于加密 cleartext 的密钥的 GUID。 uniqueidentifier.
- 'cleartext'
要使用密钥加密的数据。
- @cleartext
类型为 nvarchar、char、varchar、binary、varbinary 或 nchar 的变量,其中包含将以该密钥加密的数据。
- add_authenticator
指示是否将验证器与 cleartext 一起加密。 在使用验证器时必须为 1。 int.
- @add_authenticator
指示是否将验证器与 cleartext 一起加密。 在使用验证器时必须为 1。 int.
- authenticator
从中派生验证器的数据。类型是 sysname。
- @authenticator
包含用于派生验证器的数据的变量。
返回类型
最大大小为 8,000 个字节的 varbinary。
备注
EncryptByKey 使用对称密钥。 该密钥必须打开。 如果在当前会话中已打开该对称密钥,则无需在查询上下文中再次打开它。
验证器有助于禁止对加密字段进行整个值替换。 例如,请考虑下面的工资单数据表。
Employee_ID | Standard_Title | Base_Pay |
---|---|---|
345 |
Copy Room Assistant |
Fskj%7^edhn00 |
697 |
Chief Financial Officer |
M0x8900f56543 |
694 |
Data Entry Supervisor |
Cvc97824%^34f |
黑客无需进行解密,即可根据存储密文的上下文推断出重要信息。 由于 Chief Financial Officer 的工资高于 Copy Room Assistant 的工资,因此 M0x8900f56543 的加密值必须大于 Fskj%7^edhn00 的加密值。 如果是这样,则对表具有 ALTER 权限的任何用户都能提高 Copy Room Assistant 的工资,方法是:使用 Chief Financial Officer 的 Base_Pay 字段中存储的数据的副本替换 Copy Room Assistant Base_Pay 字段中的数据。 这种整个值替换攻击可以完全绕过加密。
加密纯文本前在该文本中添加上下文信息,可避免上述整个值替换攻击。 此上下文信息用于验证未移动的纯文本数据。
如果加密数据时指定了验证器参数,则使用 DecryptByKey 对数据进行解密时,需要相同的验证器。 在加密时,验证器的哈希将与纯文本一起加密。 解密时,必须将同一验证器传递给 DecryptByKey。 如果这两个验证器不匹配,则解密会失败。 这指示该值在加密值之后已发生移动。 建议使用存储结果的表的主键作为此参数的值
对称加密和解密速度相对较快,适于处理大量数据。
重要提示: |
---|
利用使用 ANSI_PADDING OFF 设置的 SQL Server 加密函数会由于隐式转换而导致数据丢失。 有关 ANSI_PADDING 的详细信息,请参阅 SET ANSI_PADDING (Transact-SQL)。 |
示例
以下示例说明的功能依赖于在如何加密数据列中创建的密钥和证书。
A. 使用对称密钥加密字符串
以下示例向 Employee
表中添加一列,然后加密 NationalIDNumber
列中存储的身份证号码的值。
USE AdventureWorks;
GO
-- Create a column in which to store the encrypted data.
ALTER TABLE HumanResources.Employee
ADD EncryptedNationalIDNumber varbinary(128);
GO
-- Open the symmetric key with which to encrypt the data.
OPEN SYMMETRIC KEY SSN_Key_01
DECRYPTION BY CERTIFICATE HumanResources037;
-- Encrypt the value in column NationalIDNumber with symmetric key
-- SSN_Key_01. Save the result in column EncryptedNationalIDNumber.
UPDATE HumanResources.Employee
SET EncryptedNationalIDNumber
= EncryptByKey(Key_GUID('SSN_Key_01'), NationalIDNumber);
GO
B. 将记录与身份验证值一起加密
USE AdventureWorks;
-- Create a column in which to store the encrypted data.
ALTER TABLE Sales.CreditCard.
ADD CardNumber_Encrypted varbinary(128);
GO
-- Open the symmetric key with which to encrypt the data.
OPEN SYMMETRIC KEY CreditCards_Key11
DECRYPTION BY CERTIFICATE Sales09;
-- Encrypt the value in column CardNumber with symmetric
-- key CreditCards_Key11.
-- Save the result in column CardNumber_Encrypted.
UPDATE Sales.CreditCard
SET CardNumber_Encrypted = EncryptByKey(Key_GUID('CreditCards_Key11'),
CardNumber, 1, CONVERT( varbinary, CreditCardID) );
GO
请参阅
参考
DecryptByKey (Transact-SQL)
CREATE SYMMETRIC KEY (Transact-SQL)
ALTER SYMMETRIC KEY (Transact-SQL)
DROP SYMMETRIC KEY (Transact-SQL)
HashBytes (Transact-SQL)