CERTENCODED(Transact-SQL)

인증서의 공개 부분을 이진 형식으로 반환합니다. 이 함수는 인증서 ID를 가져와서 인코딩된 인증서를 반환합니다. 이진 결과를 CREATE CERTIFICATE … WITH BINARY에 전달하여 새 인증서를 만들 수 있습니다.

구문

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'));

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 데이터베이스에서 중복 인증서를 만듭니다. 이전 단계에서 반환된 두 이진 값을 삽입하여 다음 코드를 수정해야 합니다.

-- 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)