Compartir a través de


DECRYPTBYKEYAUTOCERT (Transact-SQL)

Se aplica a:SQL ServerAzure SQL Managed Instance

Esta función descifra datos con una clave simétrica. Esa clave simétrica se descifra de forma automática con un certificado.

Convenciones de sintaxis de Transact-SQL

Sintaxis

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

Argumentos

cert_ID

El identificador del certificado que se usa para proteger la clave simétrica. cert_ID tiene un tipo de datos int.

cert_password

La contraseña que se usa para cifrar la clave privada del certificado. Puede tener un NULL valor si la clave maestra de base de datos (DMK) protege la clave privada. cert_password tiene un tipo de datos nvarchar.

'ciphertext'

La cadena de datos cifrados con la clave. ciphertext tiene un tipo de datos varbinary.

@ciphertext

Una variable de tipo varbinary que contiene los datos cifrados con la clave.

add_authenticator

Indica si el proceso de cifrado original incluía, y cifraba, un autenticador junto con el texto sin formato. Debe coincidir con el valor pasado a ENCRYPTBYKEY durante el proceso de cifrado de datos. add_authenticator tiene un valor de 1 si el proceso de cifrado usó un autenticador. add_authenticator tiene un tipo de datos int.

@add_authenticator

Una variable que indica si el proceso de cifrado original incluía, y cifraba, un autenticador junto con el texto sin formato. Debe coincidir con el valor pasado a ENCRYPTBYKEY durante el proceso de cifrado de datos. @add_authenticator tiene un tipo de datos int.

authenticator

Los datos que se usaron como base para la generación del autenticador. Debe coincidir con el valor proporcionado a ENCRYPTBYKEY. autenticador tiene un tipo de datos sysname.

@authenticator

Una variable que contiene datos a partir de los que se genera un autenticador. Debe coincidir con el valor proporcionado a ENCRYPTBYKEY. @authenticator tiene un tipo de datos sysname.

Tipos de retorno

varbinary, con un tamaño máximo de 8 000 bytes.

Observaciones

DECRYPTBYKEYAUTOCERT combina las funciones de OPEN SYMMETRIC KEY y DECRYPTBYKEY. En una sola operación, primero descifra una clave simétrica y después la usa para descifrar el texto cifrado.

Permisos

Se requiere el permiso VIEW DEFINITION en la clave simétrica y el permiso CONTROL en el certificado.

Ejemplos

En este ejemplo se muestra cómo DECRYPTBYKEYAUTOCERT puede simplificar el código de descifrado. Este código debe ejecutarse en una AdventureWorks2025 base de datos que aún no tiene una DMK. Reemplace por <password> una contraseña segura.

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