Compartilhar via


ENCRYPTBYKEY (Transact-SQL)

Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure Azure Synapse Analytics

Criptografa dados usando uma chave simétrica.

Convenções de sintaxe de Transact-SQL

Observação

Não há suporte a essa sintaxe para o pool de SQL sem servidor no Azure Synapse Analytics.

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'
São os dados que serão criptografados 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
São os dados dos quais 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 um tamanho máximo de 8.000 bytes.

Retorna o NULL se a chave não estiver aberta, se a chave não existir ou se a chave for uma chave de RC4 preterida e o banco de dados não estiver no nível de compatibilidade 110 ou superior.

Retorna NULL se o valor cleartext é NULL.

Comentários

EncryptByKey usa uma chave simétrica. Essa chave deve estar aberta. Se a chave simétrica já estiver aberta na sessão atual, não será 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 de dados de folha de pagamento a seguir.

Employee_ID Standard_Title Base_Pay
345 Copy Room Assistant Fskj%7^edhn00
697 Chief Financial Officer M0x8900f56543
694 Data Entry Supervisor 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 Chief Financial Officer ganha mais do que um Copy Room Assistant, 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 Copy Room Assistant substituindo os dados em seu campo Base_Pay por uma cópia dos dados armazenados no campo Base_Pay do Chief Financial Officer. Esse ataque de substituição do valor inteiro ignora completamente a criptografia.

Os ataques de substituição do valor inteiro podem ser impedidos adicionando-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 a descriptografia simétricas são relativamente rápidas e adequadas para trabalhar com grandes quantidades de dados.

Importante

O uso das funções de criptografia do SQL Server com a configuração ANSI_PADDING OFF pode provocar perda de dados devido a conversões implícitas. Para obter mais informações sobre ANSI_PADDING, veja 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 adiciona uma coluna à tabela Employee e, em seguida, criptografa o valor do número de Social Security que é armazenado na coluna NationalIDNumber.

USE AdventureWorks2022;  
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 AdventureWorks2022;  
  
-- 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 Também

DECRYPTBYKEY (Transact-SQL)
CREATE SYMMETRIC KEY (Transact-SQL)
ALTER SYMMETRIC KEY (Transact-SQL)
DROP SYMMETRIC KEY (Transact-SQL)
Hierarquia de criptografia
HASHBYTES (Transact-SQL)