EncryptByKey (Transact-SQL)

使用对称密钥加密数据。

主题链接图标Transact-SQL 语法约定

语法

EncryptByKey ( 
                                key_GUID , { 'cleartext' | @cleartext }
                [ 
                                        , { add_authenticator | @add_authenticator }
                                        , { authenticator | @authenticator } 
                ]
                          )

参数

  • key_GUID
    用于加密 cleartext 的密钥的 GUID。 uniqueidentifier.
  • 'cleartext'
    要使用密钥加密的数据。
  • @cleartext
    类型为 nvarcharcharvarcharbinaryvarbinarynchar 的变量,其中包含将以该密钥加密的数据。
  • 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。 如果这两个验证器不匹配,则解密会失败。 这指示该值在加密值之后已发生移动。 建议使用存储结果的表的主键作为此参数的值

对称加密和解密速度相对较快,适于处理大量数据。

ms174361.note(zh-cn,SQL.90).gif重要提示:
利用使用 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)

其他资源

加密层次结构

帮助和信息

获取 SQL Server 2005 帮助