Поделиться через


ENCRYPTBYKEY (Transact-SQL)

Производит шифрование данных при использовании симметричного ключа.

Значок ссылки на разделСоглашения о синтаксисе в Transact-SQL

Синтаксис

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

Аргументы

  • key_GUID
    Идентификатор GUID ключа, используемого для шифрования cleartext. uniqueidentifier.

  • 'cleartext'
    Данные, которые шифруются ключом.

  • @cleartext
    Переменная типа nvarchar, char, varchar, binary, varbinary или nchar, содержащая данные, которые будут зашифрованы ключом.

  • add_authenticator
    Указывает, будут ли вместе с аргументом cleartext зашифрованы данные проверки подлинности. При использовании данных проверки подлинности аргумент должен иметь значение 1. int.

  • @add_authenticator
    Указывает, будут ли вместе с аргументом cleartext зашифрованы данные проверки подлинности. При использовании данных проверки подлинности аргумент должен иметь значение 1. int.

  • authenticator
    Данные, из которых формируются данные проверки подлинности. Имеет тип sysname.

  • @authenticator
    Переменная, содержащая данные, из которых формируются данные проверки подлинности.

Типы возвращаемых данных

varbinary с максимальным размером 8 000 байт.

Замечания

Функция EncryptByKey использует симметричный ключ. Этот ключ должен быть открыт. Если симметричный ключ уже открыт в текущем сеансе, не нужно открывать его снова в контексте запроса.

Данные проверки подлинности позволяют исключить прямую подмену зашифрованных полей. Например, рассмотрим следующую таблицу с платежной ведомостью.

ИД_сотрудника

Стандартная_должность

Базовый_оклад

345

Помощник копировщика

Fskj%7^edhn00

697

Финансовый директор

M0x8900f56543

694

Контролер ввода данных

Cvc97824%^34f

Не взламывая шифр, злоумышленник может получить важные сведения из контекста, в котором хранятся зашифрованные данные. Но, поскольку оплата труда финансового директора заведомо выше, чем оплата труда помощника копировщика, из этого следует, что значение, зашифрованное как «M0x8900f56543», должно быть больше, чем значение, зашифрованное как «Fskj%7^edhn00». В таком случае любой пользователь с разрешением ALTER для данной таблицы может дать помощнику копировщика повышение, заменив его данные в поле Базовый_оклад простым копированием данных из поля Базовый_оклад финансового директора. Этот прием называется прямой подменой и исключает шифрование как таковое.

Эту опасность можно исключить, добавив к данным перед шифрованием сведения о контексте. Эти сведения будут использоваться для гарантии того, что зашифрованные данные не были перенесены с другого места.

Если при шифровании данных указано средство проверки подлинности, то для дешифровки данных функцией DecryptByKey потребуются эти же данные средства проверки подлинности. При шифровании хэш данных проверки подлинности шифруется вместе с данными. При дешифровке эти же данные проверки подлинности должны быть переданы функции DecryptByKey. Если эти данные не совпадают, дешифровка завершится ошибкой. Это будет означать, что значение перемещено с другого места со времени шифрования. В качестве структуры проверки подлинности рекомендуется использовать столбец, содержащий уникальное и неизменное значение. Если значение структуры проверки подлинности изменится, можно утратить доступ к данным.

Симметричное шифрование и дешифрование осуществляется сравнительно быстро и подходит для обработки больших объемов данных.

Важное примечаниеВажно!

Использование функций шифрования SQL Server совместно с параметром ANSI_PADDING OFF может привести к потере данных из-за неявных преобразований. Дополнительные сведения о параметре ANSI_PADDING см. в разделе SET ANSI_PADDING (Transact-SQL).

Примеры

Возможности, продемонстрированные в следующих примерах, работают с ключами и сертификатами, созданными в разделе Как зашифровать столбец данных.

А. Шифрование строки симметричным ключом

Следующий пример показывает, как добавить столбец к таблице Employee, а затем зашифровать значение номера социального страхования, который хранится в столбце 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

Б. Шифрование записи вместе со значением проверки подлинности

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