次の方法で共有


CERTENCODED (Transact-SQL)

証明書の公開部分をバイナリ形式で返します。 この関数は、証明書の ID を受け取り、エンコードされた証明書を返します。 バイナリの結果を CREATE CERTIFICATE … WITH BINARY に渡して、新しい証明書を作成できます。

適用対象: SQL Server (SQL Server 2012 から現在のバージョンまで)

構文

CERTENCODED ( cert_id )

引数

  • cert_id
    証明書の certificate_id。 これは、sys.certificates または CERT_ID (Transact-SQL) 関数を使用して取得できます。 cert_id のデータ型は int 型です。

戻り値の型

varbinary

解説

証明書の別の部分をバイナリ形式で返すには、CERTENCODED と CERTPRIVATEKEY を一緒に使用します。

権限

CERTENCODED は、public で使用できます。

使用例

簡単な例

次の例では、Shipping04 という名前の証明書を作成した後、CERTENCODED 関数を使用して、証明書のバイナリ エンコードを返します。

CREATE DATABASE TEST1;
GO
USE TEST1
CREATE CERTIFICATE Shipping04 
ENCRYPTION BY PASSWORD = 'pGFD4bb925DGvbd2439587y'
WITH SUBJECT = 'Sammamish Shipping Records', 
EXPIRY_DATE = '20161031';
GO
SELECT CERTENCODED(CERT_ID('Shipping04'));

B. 別のデータベースへの証明書のコピー

次のより複雑な例では、2 つのデータベース (SOURCE_DB と TARGET_DB) を作成します。 この例では、SOURCE_DB に証明書を作成し、その証明書を TARGET_DB にコピーした後、SOURCE_DB 内の暗号化されたデータを TARGET_DB 内の証明書のコピーを使用して暗号化解除します。

この例の環境を作成するために、SOURCE_DB データベースと TARGET_DB データベースおよびそれぞれのマスター キーを作成します。 その後、SOURCE_DB に証明書を作成します。

USE master;
GO
CREATE DATABASE SOURCE_DB;
GO
USE SOURCE_DB;
GO
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'S0URCE_DB KEY Pa$$W0rd';
GO
CREATE DATABASE TARGET_DB;
GO
USE TARGET_DB
GO
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'Pa$$W0rd in TARGET_DB';
GO

-- Create a certificate in SOURCE_DB
USE SOURCE_DB;
GO
CREATE CERTIFICATE SOURCE_CERT WITH SUBJECT = 'SOURCE_CERTIFICATE';
GO

次に、証明書のバイナリ記述を抽出します。

DECLARE @CERTENC VARBINARY(MAX);
DECLARE @CERTPVK VARBINARY(MAX);
SELECT @CERTENC = CERTENCODED(CERT_ID('SOURCE_CERT'));
SELECT @CERTPVK = CERTPRIVATEKEY(CERT_ID('SOURCE_CERT'),
       'CertEncryptionPa$$word');
SELECT @CERTENC AS BinaryCertificate;
SELECT @CERTPVK AS EncryptedBinaryCertificate;
GO

TARGET_DB データベースに証明書の複製を作成します。 次のコードを変更して、前の手順で返される 2 つのバイナリ値を挿入する必要があります。

-- Create the duplicate certificate in the TARGET_DB database
USE TARGET_DB
GO
CREATE CERTIFICATE TARGET_CERT
FROM BINARY = <insert the binary value of the @CERTENC variable>
WITH PRIVATE KEY (
BINARY = <insert the binary value of the @CERTPVK variable>
, DECRYPTION BY PASSWORD = 'CertEncryptionPa$$word');
-- Compare the certificates in the two databases
-- The two certificates should be the same 
-- except for name and (possibly) the certificate_id
SELECT * FROM SOURCE_DB.sys.certificates
UNION
SELECT * FROM TARGET_DB.sys.certificates;

単一のバッチとして実行される次のコードでは、SOURCE_DB 内の暗号化されたデータを、TARGET_DB に暗号化解除します。

USE SOURCE_DB;

DECLARE @CLEARTEXT nvarchar(100);
DECLARE @CIPHERTEXT varbinary(8000);
DECLARE @UNCIPHEREDTEXT_Source nvarchar(100);
SET @CLEARTEXT = N'Hello World';
SET @CIPHERTEXT = ENCRYPTBYCERT(CERT_ID('SOURCE_CERT'), @CLEARTEXT);
SET @UNCIPHEREDTEXT_Source = 
    DECRYPTBYCERT(CERT_ID('SOURCE_CERT'), @CIPHERTEXT)
-- Encryption and decryption result in SOURCE_DB
SELECT @CLEARTEXT AS SourceClearText, @CIPHERTEXT AS SourceCipherText, 
       @UNCIPHEREDTEXT_Source AS SourceDecryptedText;

-- SWITCH DATABASE
USE TARGET_DB;

DECLARE @UNCIPHEREDTEXT_Target nvarchar(100);
SET @UNCIPHEREDTEXT_Target = DECRYPTBYCERT(CERT_ID('TARGET_CERT'), @CIPHERTEXT);
-- Encryption and decryption result in TARGET_DB
SELECT @CLEARTEXT AS ClearTextInTarget, @CIPHERTEXT AS CipherTextInTarget, @UNCIPHEREDTEXT_Target AS DecriptedTextInTarget; 
GO

関連項目

参照

セキュリティ関数 (Transact-SQL)

CREATE CERTIFICATE (Transact-SQL)

CERTPRIVATEKEY (Transact-SQL)

sys.certificates (Transact-SQL)