Condividi tramite


CERTENCODED (Transact-SQL)

Si applica a: SQL Server database SQL di Azure Istanza gestita di SQL di Azure database SQL in Microsoft Fabric

Questa funzione restituisce la parte pubblica di un certificato in formato binario. Questa funzione accetta un ID certificato come argomento e restituisce il certificato codificato. Per creare un nuovo certificato, passare il risultato binario a CREATE CERTIFICATE ... WITH BINARY.

Sintassi

CERTENCODED ( cert_id )  

Argomenti

cert_id
certificate_id del certificato. Questo valore è disponibile in sys.certificates; viene restituito anche dalla funzione CERT_ID (Transact-SQL). cert_id è un tipo di dati int.

Tipi restituiti

varbinary

Osservazioni:

Usare CERTENCODED e CERTPRIVATEKEY insieme per restituire parti diverse di un certificato in formato binario.

Autorizzazioni

CERTENCODED è disponibile pubblicamente.

Esempi

Esempio semplice

In questo esempio viene creato un certificato denominato Shipping04 e viene usata la funzione CERTENCODED per restituire la codifica binaria del certificato. La data di scadenza del certificato viene impostata al 31 ottobre 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. Copia di un certificato in un altro database

Nell'esempio più complesso vengono creati due database: SOURCE_DB e TARGET_DB. Viene quindi creato un certificato in SOURCE_DB che viene poi copiato in TARGET_DB. Si dimostrerà infine come i dati crittografati in SOURCE_DB possano essere decrittografati in TARGET_DB usando la copia del certificato.

Per creare l'ambiente di esempio, creare i database SOURCE_DB e TARGET_DB e una chiave master in ognuno. Creare quindi un certificato in 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  

Estrarre la descrizione binaria del certificato.

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  

Creare quindi il certificato duplicato nel database TARGET_DB. Per il corretto funzionamento, modificare il codice seguente inserendo i due valori binari @CERTENC e @CERTPVK restituiti nel passaggio precedente. Non racchiudere questi valori tra virgolette.

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

Questo codice, eseguito come singolo batch, dimostra che TARGET_DB è in grado di decrittografare i dati originariamente crittografati in 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  

Vedi anche

Funzioni di sicurezza (Transact-SQL)
CREATE CERTIFICATE (Transact-SQL)
CERTPRIVATEKEY (Transact-SQL)
sys.certificates (Transact-SQL)