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
這是含有要衍生驗證器之資料的變數。
傳回類型
varbinary,大小上限為 8,000 位元組。
備註
EncryptByKey 使用對稱金鑰。這個金鑰必須開啟。如果目前工作階段已經開啟對稱金鑰,就不必在查詢內容再開啟一次。
驗證器可以幫助您防止代換已加密欄位的資料值。例如,請參考下面的薪資資料表。
Employee_ID |
Standard_Title |
Base_Pay |
---|---|---|
345 |
影印室助手 |
Fskj%7^edhn00 |
697 |
財務長 |
M0x8900f56543 |
694 |
排版設計總監 |
Cvc97824%^34f |
惡意使用者不必破解加密,就可以從儲存加密文字的內容,推斷出大量資訊。由於財務長的薪水比影印室助理高,因而可推論加密為 M0x8900f56543 的值必然大於加密為 Fskj%7^edhn00 的值。若是如此,則只要是對資料表具有 ALTER 權限的使用者,都可以將影印室助理的 Base_Pay 欄位資料,換成財務長的 Base_Pay 欄位資料,為影印室助理加薪。這種全值替換攻擊完全跳過加密。
若要阻止全值替換攻擊,可以在對純文字進行加密之前,先加入內容資訊。這個內容資訊是用來確認純文字資料沒有被移動。
如果驗證器參數是在資料加密時指定,若要利用 DecryptByKey 將資料解密,必須使用同一個驗證器。在加密時,驗證器的雜湊會與純文字一起加密。在解密時,必須將同一個驗證器傳遞給 DecryptByKey。如果兩者不相符,解密會失敗。這表示值在加密後有被移動過。我們建議您使用包含唯一且不變之值的資料行當做驗證器。如果驗證器的值變更,您可能會遺失資料的存取權。
對稱加密和解密相當快速,而且很適合處理大量資料。
重要事項 |
---|
將 SQL Server 加密函數與 ANSI_PADDING OFF 設定一起使用,可能會因為隱含轉換而造成資料遺失。如需有關 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