Поделиться через


CERTENCODED (Transact-SQL)

Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure

Эта функция возвращает открытую часть сертификата в двоичном формате. Эта функция принимает в качестве аргумента идентификатор сертификата и возвращает закодированный сертификат. Чтобы создать новый сертификат, передайте двоичный результат в CREATE CERTIFICATE ... С ДВОИЧНЫМ ФАЙЛОМ.

Синтаксис

CERTENCODED ( cert_id )  

Аргументы

cert_id
Идентификатор certificate_id сертификата. Это значение можно найти в sys.certificates. Его также возвращает функция CERT_ID (Transact-SQL). cert_id имеет тип данных int.

Типы возвращаемых данных

varbinary

Замечания

Функции CERTENCODED и CERTPRIVATEKEY используются совместно для возврата различных составляющих сертификата в двоичной форме.

Разрешения

Функция CERTENCODED общедоступна.

Примеры

Простой пример

В этом примере создается сертификат с именем Shipping04, а затем функция CERTENCODED используется для возврата сертификата в двоичной кодировке. В этом примере устанавливается дата окончания срока действия сертификата 31 октября 2040 г.

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_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. Измените следующий код, включив в него два двоичных значения, полученных на предыдущем шаге: @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)