EncryptByKey (Transact-SQL)

対称キーを使用してデータを暗号化します。

トピック リンク アイコンTransact-SQL 構文表記規則

構文

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

引数

  • key_GUID
    cleartext の暗号化に使用するキーの GUID を指定します。uniqueidentifier.
  • 'cleartext'
    キーで暗号化されるデータを指定します。
  • @cleartext
    このキーで暗号化されるデータを含む、nvarcharcharvarcharbinaryvarbinary、または nchar 型の変数を指定します。
  • add_authenticator
    cleartext と共に認証子を暗号化するかどうかを指定します。認証子を使用する場合は 1 にする必要があります。int.
  • @add_authenticator
    cleartext と共に認証子を暗号化するかどうかを指定します。認証子を使用する場合は 1 にする必要があります。int.
  • authenticator
    認証子の派生元のデータを指定します。データ型は sysname です。
  • @authenticator
    認証子の派生元のデータを含む変数を指定します。

戻り値の型

varbinary 型 (最大サイズは 8,000 バイト)

解説

EncryptByKey では対称キーが使用されます。このキーは開いている必要があります。対称キーが現在のセッションで既に開いている場合、クエリのコンテキストで再度開く必要はありません。

認証子を使用すると、暗号化されたフィールド全体が外部から置き換えられるのを防ぐことができます。次の給与データの表を例として説明します。

従業員 ID (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 に渡される必要があります。2 つの認証子が一致しない場合、暗号化は解除できません。これは、値が暗号化の後で移動されたことを示します。このパラメータの値には、結果を格納するテーブルの主キーを使用することをお勧めします。

対称キーの暗号化と暗号化解除は比較的高速なので、データが大きい場合に適しています。

ms174361.note(ja-jp,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 の参考資料の入手