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'
É 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.
Importante |
---|
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