ENCRYPTBYKEY (Transact-SQL)
Criptografa dados usando uma chave simétrica.
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.
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, 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 adiciona uma coluna à tabela Employee e, em seguida, criptografa o valor do número de Social Security que é armazenado na coluna NationalIDNumber.
USE AdventureWorks2008R2;
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 AdventureWorks2008R2;
-- 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