ENCRYPTBYKEY (Transact-SQL)

Cifra datos utilizando una clave simétrica.

Icono de vínculo a temasConvenciones de sintaxis de Transact-SQL

Sintaxis

EncryptByKey (key_GUID , { 'cleartext' | @cleartext }
        [, { add_authenticator | @add_authenticator }
          , { authenticator | @authenticator } ] )

Argumentos

  • key_GUID
    Es el GUID de la clave que se utilizará para cifrar cleartext. uniqueidentifier.

  • 'cleartext'
    Son los datos que se cifrarán con la clave.

  • @cleartext
    Variable de tipo nvarchar, char, varchar, binary, varbinary o nchar que contiene datos que se van a cifrar con la clave.

  • add_authenticator
    Indica si se cifrará un autenticador junto con cleartext. Debe ser 1 cuando se utilice un autenticador. int.

  • @add_authenticator
    Indica si se cifrará un autenticador junto con cleartext. Debe ser 1 cuando se utilice un autenticador. int.

  • authenticator
    Son los datos de los que se derivará un autenticador. sysname.

  • @authenticator
    Es una variable que contiene los datos de los que se derivará un autenticador.

Tipos de valor devueltos

varbinary con un tamaño máximo de 8.000 bytes.

Notas

EncryptByKey utiliza una clave simétrica. Esta clave debe estar abierta. Si la clave simétrica ya está abierta en la sesión actual, no tiene que abrirla de nuevo en el contexto de la consulta.

El autenticador le ayudará a impedir la sustitución de todo el valor de los campos cifrados. Por ejemplo, considere la siguiente tabla de datos de nóminas:

Employee_ID

Standard_Title

Base_Pay

345

Copy Room Assistant

Fskj%7^edhn00

697

Chief Financial Officer

M0x8900f56543

694

Data Entry Supervisor

Cvc97824%^34f

Sin romper el cifrado, un usuario malintencionado puede obtener información importante del contexto en el que se almacena el texto cifrado. Puesto que al Chief Financial Official se le paga más que al Copy Room Assistant, el valor cifrado como M0x8900f56543 debe ser mayor que el valor cifrado como Fskj%7^edhn00. En este caso, cualquier usuario con el permiso ALTER en la tabla puede elevar al Copy Room Assistant al sustituir los datos en su campo Base_Pay con una copia de los datos almacenados en el campo Base_Pay del Chief Financial Officer. Este ataque de sustitución del valor completo omite el cifrado completamente.

Estos ataques de sustitución de valor completo se pueden combatir agregando información contextual al texto sin formato antes de cifrarlo. Esta información contextual se usa para comprobar que el texto sin formato no se ha movido.

Si se especifica un parámetro de autenticador al cifrar los datos, se necesita el mismo autenticador para descifrar los datos mediante DecryptByKey. En el momento del cifrado, se cifra un hash del autenticador junto con el texto sin formato. En el momento del descifrado, el mismo autenticador se debe pasar a DecryptByKey. Si los dos no coinciden, se produce un error en el descifrado. Esto indica que el valor se ha movido desde que se cifró. Recomendamos que utilice una columna que contenga un valor único e invariable como autenticador. Si el valor del autenticador cambia, podría perder el acceso a los datos.

El cifrado y descifrado simétrico es relativamente rápido y se puede adaptar para trabajar con grandes cantidades de datos.

Nota importanteImportante

El uso de las funciones de cifrado de SQL Server junto con el valor ANSI_PADDING OFF podría provocar la pérdida de datos debido a las conversiones implícitas. Para obtener más información sobre ANSI_PADDING, consulte SET ANSI_PADDING (Transact-SQL).

Ejemplos

La funcionalidad ilustrada en los siguientes ejemplos se basa en claves y certificados que se crean en Cómo cifrar una columna de datos.

A. Cifrar una cadena con una clave simétrica

En el siguiente ejemplo se agrega una columna a la tabla Employee y, a continuación, se cifra el valor del número de seguridad social almacenado en la columna NationalIDNumber.

USE AdventureWorks;
GO

-- Create a column in which to store the encrypted data.
ALTER TABLE HumanResources.Employee
    ADD EncryptedNationalIDNumber varbinary(128); 
GO

-- Open the symmetric key with which to encrypt the data.
OPEN SYMMETRIC KEY SSN_Key_01
   DECRYPTION BY CERTIFICATE HumanResources037;

-- Encrypt the value in column NationalIDNumber with symmetric key
-- SSN_Key_01. Save the result in column EncryptedNationalIDNumber.
UPDATE HumanResources.Employee
SET EncryptedNationalIDNumber
    = EncryptByKey(Key_GUID('SSN_Key_01'), NationalIDNumber);
GO

B. Cifrar un registro junto con un valor de autenticación

USE AdventureWorks;

-- Create a column in which to store the encrypted data.
ALTER TABLE Sales.CreditCard. 
    ADD CardNumber_Encrypted varbinary(128); 
GO

-- Open the symmetric key with which to encrypt the data.
OPEN SYMMETRIC KEY CreditCards_Key11
    DECRYPTION BY CERTIFICATE Sales09;

-- Encrypt the value in column CardNumber with symmetric 
-- key CreditCards_Key11.
-- Save the result in column CardNumber_Encrypted.  
UPDATE Sales.CreditCard
SET CardNumber_Encrypted = EncryptByKey(Key_GUID('CreditCards_Key11'), 
    CardNumber, 1, CONVERT( varbinary, CreditCardID) );
GO