CERTENCODED (Transact-SQL)
返回二进制格式的证书的公共部分。 此函数具有证书 ID 并返回已编码的证书。 二进制结果可以传递给 CREATE CERTIFICATE … WITH BINARY 以创建新证书。
适用范围:SQL Server(SQL Server 2012 到当前版本)。 |
语法
CERTENCODED ( cert_id )
参数
- cert_id
是证书的 certificate_id。 可通过 sys.certificates 或通过使用 CERT_ID (Transact-SQL) 函数提供。 cert_id 的类型为 int
返回类型
varbinary
备注
CERTENCODED 和 CERTPRIVATEKEY 一起用于返回二进制格式的证书的不同部分。
权限
CERTENCODED 可用于 public。
示例
简单示例
下面的示例创建一个名为 Shipping04 的证书,然后使用 CERTENCODED 函数返回该证书的二进制编码。
CREATE DATABASE TEST1;
GO
USE TEST1
CREATE CERTIFICATE Shipping04
ENCRYPTION BY PASSWORD = 'pGFD4bb925DGvbd2439587y'
WITH SUBJECT = 'Sammamish Shipping Records',
EXPIRY_DATE = '20161031';
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 数据库中创建副本证书。 您必须修改下面的代码,插入在上一步中返回的两个二进制值。
-- 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