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


DECRYPTBYKEYAUTOCERT (Transact-SQL)

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

Эта функция расшифровывает данные с помощью симметричного ключа. Симметричный ключ автоматически расшифровывается с помощью сертификата.

Соглашения о синтаксисе Transact-SQL

Синтаксис

DECRYPTBYKEYAUTOCERT ( cert_ID , cert_password
    , { 'ciphertext' | @ciphertext }
  [ , { add_authenticator | @add_authenticator }
  [ , { authenticator | @authenticator } ] ] )

Аргументы

cert_ID

Идентификатор сертификата, используемого для защиты симметричного ключа. cert_ID имеет тип данных int.

cert_password

Пароль, используемый для шифрования закрытого ключа сертификата. Может иметь значение, если главный NULL ключ базы данных (DMK) защищает закрытый ключ. cert_password имеет тип данных nvarchar.

'ciphertext'

Строка данных, зашифрованная с помощью ключа. ciphertext имеет тип данных varbinary.

@ciphertext

Переменная типа varbinary, содержащая данные, зашифрованные с помощью ключа.

add_authenticator

Указывает, включен ли исходный процесс шифрования и зашифрована ли структура проверки подлинности вместе с данными в виде открытого текста. Должен соответствовать значению, передаваемого в ENCRYPTBYKEY во время процесса шифрования данных. add_authenticator имеет значение 1, если в процессе шифрования использовалась структура проверки подлинности. add_authenticator имеет тип данных int.

@add_authenticator

Переменная, указывающая, включен ли исходный процесс шифрования и зашифрована ли структура проверки подлинности вместе с данными в виде открытого текста. Должен соответствовать значению, передаваемого в ENCRYPTBYKEY во время процесса шифрования данных. @add_authenticator имеет тип данных int.

authenticator

Данные, используемые в качестве основы для создания структуры проверки подлинности. Должен соответствовать значению, предоставленному ENCRYPTBYKEY. authenticator имеет тип данных sysname.

@authenticator

Переменная, содержащая данные, из которых формируется структура проверки подлинности. Должен соответствовать значению, предоставленному ENCRYPTBYKEY. authenticator имеет тип данных sysname.

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

Переменная типа varbinary с максимальным размером 8000 байт.

Замечания

Функция DECRYPTBYKEYAUTOCERT объединяет функциональность OPEN SYMMETRIC KEY и DECRYPTBYKEY. За одну операцию она сначала расшифровывает симметричный ключ, а затем с его помощью расшифровывает зашифрованный текст.

Разрешения

Необходимо разрешение VIEW DEFINITION для симметричного ключа и разрешение CONTROL для сертификата.

Примеры

В этом примере показано, как DECRYPTBYKEYAUTOCERT может упростить код расшифровки. Этот код должен выполняться в AdventureWorks2025 базе данных, которая еще не имеет dmK. Замените <password> строгим паролем.

--Create the keys and certificate.
USE AdventureWorks2022;

CREATE MASTER KEY ENCRYPTION BY PASSWORD= '<password>';

OPEN MASTER KEY DECRYPTION BY PASSWORD = '<password>';

CREATE CERTIFICATE HumanResources037
    WITH SUBJECT = 'Sammamish HR', EXPIRY_DATE = '10/31/2035';

CREATE SYMMETRIC KEY SSN_Key_01
    WITH ALGORITHM = AES_256
    ENCRYPTION BY CERTIFICATE HumanResources037;
GO

----Add a column of encrypted data.
ALTER TABLE HumanResources.Employee
    ADD EncryptedNationalIDNumber VARBINARY (128);

OPEN SYMMETRIC KEY SSN_Key_01 DECRYPTION BY CERTIFICATE HumanResources037;

UPDATE HumanResources.Employee
    SET EncryptedNationalIDNumber = EncryptByKey(Key_GUID('SSN_Key_01'), NationalIDNumber);
GO

--
--Close the key used to encrypt the data.
CLOSE SYMMETRIC KEY SSN_Key_01;
--
--There are two ways to decrypt the stored data.
--
--OPTION ONE, using DecryptByKey()
--1. Open the symmetric key
--2. Decrypt the data
--3. Close the symmetric key

OPEN SYMMETRIC KEY SSN_Key_01 DECRYPTION BY CERTIFICATE HumanResources037;

SELECT NationalIDNumber,
       EncryptedNationalIDNumber AS 'Encrypted ID Number',
       CONVERT (NVARCHAR, DecryptByKey(EncryptedNationalIDNumber)) AS 'Decrypted ID Number'
FROM HumanResources.Employee;

CLOSE SYMMETRIC KEY SSN_Key_01;
--
--OPTION TWO, using DECRYPTBYKEYAUTOCERT()

SELECT NationalIDNumber,
       EncryptedNationalIDNumber AS 'Encrypted ID Number',
       CONVERT (NVARCHAR, DECRYPTBYKEYAUTOCERT(cert_ID('HumanResources037'), NULL, EncryptedNationalIDNumber)) AS 'Decrypted ID Number'
FROM HumanResources.Employee;