ENCRYPTBYKEY (Transact-SQL)ENCRYPTBYKEY (Transact-SQL)

SE APLICA A: síSQL Server (a partir de 2008) síAzure SQL Database noAzure SQL Data Warehouse noAlmacenamiento de datos paralelos APPLIES TO: yesSQL Server (starting with 2008) yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

Cifra los datos usando una clave simétrica.Encrypts data by using a symmetric key.

Icono de vínculo de tema Convenciones de sintaxis de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxisSyntax


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

ArgumentosArguments

key_GUIDkey_GUID
Es el GUID de la clave que se usará para cifrar cleartext.Is the GUID of the key to be used to encrypt the cleartext. uniqueidentifier.uniqueidentifier.

'cleartext''cleartext'
Son los datos que se cifrarán con la clave.Is the data that is to be encrypted with the key.

@cleartext
Es una variable de tipo nvarchar, char, varchar, binary, varbinary o nchar que contiene datos que se van a cifrar con la clave.Is a variable of type nvarchar, char, varchar, binary, varbinary, or nchar that contains data that is to be encrypted with the key.

add_authenticatoradd_authenticator
Indica si se cifrará un autenticador junto con cleartext.Indicates whether an authenticator will be encrypted together with the cleartext. Debe ser 1 cuando se utilice un autenticador.Must be 1 when using an authenticator. int.int.

@add_authenticator
Indica si se cifrará un autenticador junto con cleartext.Indicates whether an authenticator will be encrypted together with the cleartext. Debe ser 1 cuando se utilice un autenticador.Must be 1 when using an authenticator. int.int.

authenticatorauthenticator
Son los datos de los que se derivará un autenticador.Is the data from which to derive an authenticator. sysname.sysname.

@authenticator
Es una variable que contiene los datos de los que se derivará un autenticador.Is a variable that contains data from which to derive an authenticator.

Tipos devueltosReturn Types

varbinary con un tamaño máximo de 8000 bytes.varbinary with a maximum size of 8,000 bytes.

Devuelve NULL si la clave no está abierta, si la clave no existe o si se trata de una clave RC4 desusada y la base de datos no está en el nivel de compatibilidad 110 o superior.Returns NULL if the key is not open, if the key does not exist, or if the key is a deprecated RC4 key and the database is not in compatibility level 110 or higher.

Devuelve NULL si el valor cleartext es NULL.Returns NULL if the cleartext value is NULL.

NotasRemarks

EncryptByKey usa una clave simétrica.EncryptByKey uses a symmetric key. Esta clave debe estar abierta.This key must be open. 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.If the symmetric key is already open in the current session, you do not have to open it again in the context of the query.

El autenticador le ayudará a impedir la sustitución de todo el valor de los campos cifrados.The authenticator helps you deter whole-value substitution of encrypted fields. Por ejemplo, considere la siguiente tabla de datos de nóminas:For example, consider the following table of payroll data.

Employee_IDEmployee_ID Standard_TitleStandard_Title Base_PayBase_Pay
345345 Copy Room AssistantCopy Room Assistant Fskj%7^edhn00Fskj%7^edhn00
697697 Chief Financial OfficerChief Financial Officer M0x8900f56543M0x8900f56543
694694 Data Entry SupervisorData Entry Supervisor Cvc97824%^34fCvc97824%^34f

Sin romper el cifrado, un usuario malintencionado puede obtener información importante del contexto en el que se almacena el texto cifrado.Without breaking the encryption, a malicious user can infer significant information from the context in which the ciphertext is stored. 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.Because a Chief Financial Officer is paid more than a Copy Room Assistant, it follows that the value encrypted as M0x8900f56543 must be greater than the value encrypted as 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.If so, any user with ALTER permission on the table can give the Copy Room Assistant a raise by replacing the data in his Base_Pay field with a copy of the data stored in the Base_Pay field of the Chief Financial Officer. Este ataque de sustitución del valor completo omite el cifrado completamente.This whole-value substitution attack bypasses encryption altogether.

Estos ataques de sustitución de valor completo se pueden combatir agregando información contextual al texto simple antes de cifrarlo.Whole-value substitution attacks can be thwarted by adding contextual information to the plaintext before encrypting it. Esta información contextual se usa para comprobar que el texto simple no se ha movido.This contextual information is used to verify that the plaintext data has not been moved.

Si se especifica un parámetro de autenticador al cifrar los datos, se necesita el mismo autenticador para descifrar los datos mediante DecryptByKey.If an authenticator parameter is specified when data is encrypted, the same authenticator is required to decrypt the data by using DecryptByKey. En el momento del cifrado, se cifra un hash del autenticador junto con el texto simple.At encryption time, a hash of the authenticator is encrypted together with the plaintext. En el momento del descifrado, el mismo autenticador se debe pasar a DecryptByKey.At decryption time, the same authenticator must be passed to DecryptByKey. Si los dos no coinciden, se produce un error en el descifrado.If the two do not match, the decryption will fail. Esto indica que el valor se ha movido desde que se cifró.This indicates that the value has been moved since it was encrypted. Recomendamos que utilice una columna que contenga un valor único e invariable como autenticador.We recommend using a column containing a unique and unchanging value as the authenticator. Si el valor del autenticador cambia, podría perder el acceso a los datos.If the authenticator value changes, you might lose access to the data.

El cifrado y descifrado simétrico es relativamente rápido y se puede adaptar para trabajar con grandes cantidades de datos.Symmetric encryption and decryption is relatively fast, and is suitable for working with large amounts of data.

Importante

El uso de las funciones de cifrado de SQL ServerSQL Server junto con el valor ANSI_PADDING OFF podría provocar la pérdida de datos debido a las conversiones implícitas.Using the SQL ServerSQL Server encryption functions together with the ANSI_PADDING OFF setting could cause data loss because of implicit conversions. Para más información sobre ANSI_PADDING, vea SET ANSI_PADDING (Transact-SQL).For more information about ANSI_PADDING, see SET ANSI_PADDING (Transact-SQL).

EjemplosExamples

La funcionalidad ilustrada en los siguientes ejemplos se basa en claves y certificados que se crean en Cómo: Cifrar una columna de datos.The functionality illustrated in the following examples relies on keys and certificates created in How To: Encrypt a Column of Data.

A.A. Cifrar una cadena con una clave simétricaEncrypting a string with a symmetric key

En el ejemplo siguiente 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.The following example adds a column to the Employee table, and then encrypts the value of the Social Security number that is stored in column NationalIDNumber.

USE AdventureWorks2012;  
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.B. Cifrar un registro junto con un valor de autenticaciónEncrypting a record together with an authentication value

USE AdventureWorks2012;  

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

Consulte tambiénSee Also

DECRYPTBYKEY (Transact-SQL) DECRYPTBYKEY (Transact-SQL)
CREATE SYMMETRIC KEY (Transact-SQL) CREATE SYMMETRIC KEY (Transact-SQL)
ALTER SYMMETRIC KEY (Transact-SQL) ALTER SYMMETRIC KEY (Transact-SQL)
DROP SYMMETRIC KEY (Transact-SQL) DROP SYMMETRIC KEY (Transact-SQL)
Jerarquía de cifrado Encryption Hierarchy
HASHBYTES (Transact-SQL)HASHBYTES (Transact-SQL)