CERTENCODED(Transact-SQL)

적용 대상: SQL Server(지원되는 모든 버전) Azure SQL Database Azure SQL Managed Instance

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

구문

CERTENCODED ( cert_id )  

참고

SQL Server 2014 이전 버전의 Transact-SQL 구문을 보려면 이전 버전 설명서를 참조하세요.

인수

cert_id
인증서의 certificate_id입니다. sys.certificates에서 이 값을 찾습니다. CERT_ID(Transact-SQL) 함수도 이를 반환합니다. cert_idint 데이터 형식을 갖습니다.

반환 형식

varbinary

설명

CERTENCODEDCERTPRIVATEKEY를 함께 사용하여 이진 형태로 인증서의 다른 부분을 반환합니다.

사용 권한

CERTENCODED는 누구나 사용할 수 있습니다.

예제

간단한 예

이 예에서는 이름이 Shipping04인 인증서를 만든 다음, CERTENCODED 함수를 사용하여 인증서의 이진 인코딩을 반환합니다. 이 예에서는 2040년 10월 31일을 인증서 만료 날짜로 설정합니다.

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

B. 다른 데이터베이스에 인증서 복사

조금 더 복잡한 예에서는 SOURCE_DBTARGET_DB라는 두 데이터베이스를 만듭니다. 그런 다음, SOURCE_DB에 인증서를 만들어 TARGET_DB에 복사합니다. 마지막으로, SOURCE_DB에서 암호화된 데이터가 인증서 사본을 사용하여 TARGET_DB에서 해독될 수 있음을 보여 줍니다.

예제 환경을 만들려면 SOURCE_DBTARGET_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 데이터베이스에서 중복 인증서를 만듭니다. 이 작업을 위해 다음 코드를 수정하여 이전 단계에서 반환된 두 이진 값 @CERTENC 및 @CERTPVK를 삽입합니다. 이 값을 따옴표로 묶지 않습니다.

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