ENCRYPTBYKEY (Transact-SQL)

Criptografa dados usando uma chave simétrica.

Ícone de vínculo de tópicoConvenções de sintaxe Transact-SQL

Sintaxe

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

Argumentos

  • key_GUID
    É o GUID da chave a ser usado para criptografar o cleartext. uniqueidentifier.

  • 'cleartext'
    É o dado que será criptografado com a chave.

  • @cleartext
    É uma variável do tipo nvarchar, char, varchar, binary, varbinary ou nchar que contém dados a serem criptografados com a chave.

  • add_authenticator
    Indica se um autenticador será criptografado junto com o cleartext. Deve ser 1 ao usar um autenticador. int.

  • @add_authenticator
    Indica se um autenticador será criptografado junto com o cleartext. Deve ser 1 ao usar um autenticador. int.

  • authenticator
    É o dado do qual será derivado um autenticador. sysname.

  • @authenticator
    É uma variável que contém dados a partir dos quais o autenticador será derivado.

Tipos de retorno

varbinary com no máximo 8.000 bytes.

Comentários

EncryptByKey usa uma chave simétrica. Esta chave deve estar aberta. Se a chave simétrica já estiver aberta na sessão atual, não é necessário abri-la novamente no contexto da consulta.

O autenticador ajuda a impedir a substituição do valor inteiro de campos criptografados. Por exemplo, considere a tabela seguinte de dados de folha de pagamento.

ID_Funcionário

Cargo_Padrão

Salário_Base

345

Assistente de departamento de cópias

Fskj%7^edhn00

697

Diretor financeiro

M0x8900f56543

694

Supervisor de entrada de dados

Cvc97824%^34f

Sem quebrar a criptografia, um usuário mal-intencionado pode deduzir informações significativas a partir do contexto em que o texto cifrado é armazenado. Como um Diretor financeiro ganha mais do que um Assistente de departamento de cópias, deduz-se que o valor criptografado como M0x8900f56543 seja maior do que o valor criptografado como Fskj%7^edhn00. Portanto, qualquer usuário com permissão ALTER na tabela pode conceder um aumento ao Assistente de departamento de cópias substituindo os dados em seu campo Salário_Base por uma cópia dos dados armazenados no campo Salário_Base do Diretor financeiro. Este ataque de substituição do valor inteiro ignora completamente a criptografia.

Os ataques de substituição do valor inteiro podem ser impedidos acrescentando-se informações contextuais ao texto não criptografado antes de criptografá-lo. Essas informações contextuais são usadas para verificar se os dados de texto não criptografado não foram movidos.

Se um parâmetro de autenticador for especificado no momento em que os dados são criptografados, o mesmo autenticador será necessário para descriptografar os dados usando o DecryptByKey. No momento da criptografia, um hash do autenticador é criptografado com o texto não criptografado. No momento da descriptografia, o mesmo autenticador deve ser passado para a DecryptByKey. Se não houver correspondência entre os dois, a descriptografia falhará. Isso indica que o valor foi movido desde que foi criptografado. Recomendamos usar uma coluna que contenha um valor exclusivo e inalterável como o autenticador. Se o valor do autenticador for alterado, você poderá perder o acesso aos dados.

A criptografia e descriptografia simétrica é relativamente rápida e adequada para trabalhar com grandes quantidades de dados.

Observação importanteImportante

Usando as funções de criptografia SQL Server com a ANSI_PADDING OFF configuração poderia causar perda de dados devido a conversões implícitas. Para obter mais informações sobre ANSI_PADDING, consulte SET ANSI_PADDING (Transact-SQL).

Exemplos

A funcionalidade ilustrada nos exemplos a seguir se baseia em chaves e certificados criados em Como criptografar uma coluna de dados.

A. Criptografando uma cadeia de caracteres com uma chave simétrica

O exemplo a seguir acrescenta uma coluna à tabela Employee e, em seguida, criptografa o valor do número de Previdência Social que é armazenado na coluna 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. Criptografando um registro com um valor de autenticação

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