Partilhar via


CERTENCODED (Transact-SQL)

Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure

Essa função retorna a parte pública de um certificado em formato binário. Essa função usa uma ID de certificado como argumento e retorna o certificado codificado. Para criar um certificado, passe o resultado binário para CREATE CERTIFICATE... WITH BINARY.

Sintaxe

CERTENCODED ( cert_id )  

Argumentos

cert_id
A certificate_id do certificado. Encontre esse valor em sys.certificates; a função CERT_ID (Transact-SQL) o retornará também. cert_id tem um tipo de dados int.

Tipos de retorno

varbinary

Comentários

Use CERTENCODED e CERTPRIVATEKEY em conjunto para retornar, em formato binário, diferentes partes de um certificado.

Permissões

CERTENCODED está disponível publicamente.

Exemplos

Exemplo simples

Este exemplo cria um certificado chamado Shipping04 e, em seguida, usa a função CERTENCODED para retornar a codificação binária do certificado. Este exemplo define a data de expiração do certificado como 31 de outubro de 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. Copiando um certificado em outro banco de dados

O exemplo mais complexo cria dois bancos de dados, SOURCE_DB e TARGET_DB. Em seguida, crie um certificado no SOURCE_DB e, depois, copie o certificado para o TARGET_DB. Por fim, demonstre que os dados criptografados no SOURCE_DB podem ser descriptografados no TARGET_DB usando a cópia do certificado.

Para criar o ambiente de exemplo, crie os bancos de dados SOURCE_DB e TARGET_DB e uma chave mestra em cada banco de dados. Em seguida, crie um certificado no 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  

Depois, extraia a descrição binária do certificado.

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  

Em seguida, crie o certificado duplicado no banco de dados TARGET_DB. Modifique o código a seguir para que isto funcione, inserindo os dois valores binários – @CERTENC e @CERTPVK – retornados na etapa anterior. Não coloque esses valores entre aspas.

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

Esse código, executado como um único lote, demonstra que o TARGET_DB pode descriptografar os dados criptografados originalmente no 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 DecriptedTextInTarget;   
GO  

Confira também

Funções de segurança (Transact-SQL)
CREATE CERTIFICATE (Transact-SQL)
CERTPRIVATEKEY (Transact-SQL)
sys.certificates (Transact-SQL)