Delen via


CERTENCODED (Transact-SQL)

van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL-database in Microsoft Fabric

Deze functie retourneert het openbare gedeelte van een certificaat in binaire indeling. Deze functie gebruikt een certificaat-id als argument en retourneert het gecodeerde certificaat. Als u een nieuw certificaat wilt maken, geeft u het binaire resultaat door aan CREATE CERTIFICATE ... MET BINARY.

Syntaxis

CERTENCODED ( cert_id )  

Argumenten

cert_id
De certificate_id van het certificaat. Zoek deze waarde in sys.certificates; de CERT_ID (Transact-SQL) functie retourneert deze ook. cert_id heeft het gegevenstype int.

Retourtypen

varbinaire

Opmerkingen

Gebruik CERTENCODED- en CERTPRIVATEKEY samen om, in binaire vorm, verschillende delen van een certificaat te retourneren.

Machtigingen

CERTENCODED- is openbaar beschikbaar.

Voorbeelden

Eenvoudig voorbeeld

In dit voorbeeld wordt een certificaat met de naam Shipping04gemaakt en wordt vervolgens de functie CERTENCODED gebruikt om de binaire codering van het certificaat te retourneren. In dit voorbeeld wordt de vervaldatum van het certificaat ingesteld op 31 oktober 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. Een certificaat kopiëren naar een andere database

In het complexere voorbeeld worden twee databases gemaakt, SOURCE_DB en TARGET_DB. Maak vervolgens een certificaat in SOURCE_DBen kopieer het certificaat vervolgens naar het TARGET_DB. Ten slotte demonstreert u dat gegevens die zijn versleuteld in SOURCE_DB kunnen worden ontsleuteld in TARGET_DB met behulp van de kopie van het certificaat.

Als u de voorbeeldomgeving wilt maken, maakt u de SOURCE_DB- en TARGET_DB-databases en een hoofdsleutel in elke database. Maak vervolgens een certificaat in 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  

Pak vervolgens de binaire beschrijving van het certificaat uit.

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  

Maak vervolgens het dubbele certificaat in de TARGET_DB-database. Wijzig de volgende code zodat dit werkt, waarbij de twee binaire waarden ( @CERTENC en @CERTPVK ) worden ingevoegd die in de vorige stap zijn geretourneerd. Plaats deze waarden niet tussen aanhalingstekens.

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

Deze code, uitgevoerd als één batch, laat zien dat TARGET_DB oorspronkelijk versleutelde gegevens in SOURCE_DBkan ontsleutelen.

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  

Zie ook

beveiligingsfuncties (Transact-SQL)
CREATE CERTIFICATE (Transact-SQL)
CERTPRIVATEKEY (Transact-SQL)
sys.certificates (Transact-SQL)