CERTENCODED (Transact-SQL)

적용 대상:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceMicrosoft Fabric의 SQL 데이터베이스

이 함수는 인증서의 공용 부분을 이진 형식으로 반환합니다. 이 함수는 인증서 ID를 인수로 사용하고 인코딩된 인증서를 반환합니다. 새 인증서를 생성하려면 이진 결과를 CREATE CERTIFICATE ... 비나리와 함께.

Syntax

CERTENCODED ( cert_id )  

Arguments

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

반환 형식

varbinary

Remarks

CERTENCODED와 CERTPRIVATEKEY를 함께 사용하여 인증서의 여러 부분을 이진 형식으로 반환합니다.

Permissions

CERTENCODED 는 공개적으로 사용할 수 있습니다.

Examples

간단한 예시

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

Note

Azure SQL Database에서 추가 옵션 없이 실행 CREATE DATABASE 하면, 데이터베이스는 기본 설정으로 논리 서버에서 생성됩니다. Azure SQL Database나 Microsoft Fabric의 SQL 데이터베이스에서는 이미 의도된 데이터베이스가 존재한다면, 샘플과 지원되지 USE 않는 문장은 CREATE DATABASE 건너뛸 수 있습니다. 원하는 사용자 데이터베이스에 직접 별도로 master 연결하세요.

USE [master];
GO
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 = '<password>'; -- source database key password  
GO  
CREATE DATABASE TARGET_DB;  
GO  
USE TARGET_DB  
GO  
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>'; -- password in target database
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;  

단일 일괄 처리로 실행되는 다음 코드는 TARGET_DB에서 암호화된 데이터를 SOURCE_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 DecryptedTextInTarget;   
GO