このトピックでは、Transact-SQL を使用して SQL Server 2014 の 2 つの異なるサーバーで同じ対称キーを作成する方法について説明します。 暗号化テキストの暗号化を解除するには、暗号化に使用されたキーが必要です。 暗号化と暗号化解除の両方が 1 つのデータベースで行われる場合、キーはデータベースに格納され、アクセス許可に応じて暗号化と暗号化解除の両方で使用できます。 ただし、暗号化と暗号化解除が別々のデータベースまたは別のサーバーで行われる場合、1 つのデータベースに格納されているキーは、2 番目のデータベースでは使用できません。
このトピックについて
開始する前に
制限事項と制約条件
対称キーを作成するときは、少なくとも 1 つの証明書、パスワード、対称キー、非対称キー、または PROVIDER を使用して対称キーを暗号化する必要があります。 キーは、種類ごとに複数の暗号化を持つことができます。 つまり、複数の証明書、パスワード、対称キー、および非対称キーを同時に使用して、1 つの対称キーを暗号化できます。
対称キーがデータベース マスター キーの公開キーではなくパスワードで暗号化されている場合は、TRIPLE DES 暗号化アルゴリズムが使用されます。 このため、AES などの強力な暗号化アルゴリズムを使用して作成されたキー自体は、弱いアルゴリズムによって保護されます。
安全
権限
データベースに対する ALTER ANY SYMMETRIC KEY 権限が必要です。 AUTHORIZATION が指定されている場合は、データベース ユーザーに対する IMPERSONATE 権限、またはアプリケーション ロールに対する ALTER 権限が必要です。 暗号化が証明書または非対称キーによる場合は、証明書または非対称キーに対する VIEW DEFINITION 権限が必要です。 対称キーを所有できるのは、Windows ログイン、SQL Server ログイン、アプリケーション ロールだけです。 グループとロールは対称キーを所有できません。
Transact-SQL の使用
2 つの異なるサーバーで同じ対称キーを作成するには
オブジェクト エクスプローラーで、 データベース エンジンのインスタンスに接続します。
標準バーで [新しいクエリ] をクリックします。
次の CREATE MASTER KEY、CREATE CERTIFICATE、CREATE SYMMETRIC KEY ステートメントを実行して、キーを作成します。
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'My p@55w0Rd'; GO CREATE CERTIFICATE [cert_keyProtection] WITH SUBJECT = 'Key Protection'; GO CREATE SYMMETRIC KEY [key_DataShare] WITH KEY_SOURCE = 'My key generation bits. This is a shared secret!', ALGORITHM = AES_256, IDENTITY_VALUE = 'Key Identity generation bits. Also a shared secret' ENCRYPTION BY CERTIFICATE [cert_keyProtection]; GO
別のサーバー インスタンスに接続し、別のクエリ ウィンドウを開き、上記の SQL ステートメントを実行して、2 番目のサーバーに同じキーを作成します。
最初のサーバーで OPEN SYMMETRIC KEY ステートメントと以下の SELECT ステートメントを実行して、キーをテストします。
OPEN SYMMETRIC KEY [key_DataShare] DECRYPTION BY CERTIFICATE cert_keyProtection; GO SELECT encryptbykey(key_guid('key_DataShare'), 'MyData' ) GO -- For example, the output might look like this: 0x2152F8DA8A500A9EDC2FAE26D15C302DA70D25563DAE7D5D1102E3056CE9EF95CA3E7289F7F4D0523ED0376B155FE9C3
2 番目のサーバーで、前の SELECT ステートメントの結果を
@blob
の値として次のコードに貼り付け、次のコードを実行して、重複するキーが暗号テキストを復号化できることを確認します。OPEN SYMMETRIC KEY [key_DataShare] DECRYPTION BY CERTIFICATE cert_keyProtection; GO DECLARE @blob varbinary(8000); SET @blob = SELECT CONVERT(varchar(8000), decryptbykey(@blob)); GO
両方のサーバーで対称キーを閉じます。
CLOSE SYMMETRIC KEY [key_DataShare]; GO
詳細については以下をご覧ください: