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
См. также
Справочник
DecryptByKey (Transact-SQL)
CREATE SYMMETRIC KEY (Transact-SQL)
ALTER SYMMETRIC KEY (Transact-SQL)
DROP SYMMETRIC KEY (Transact-SQL)
HashBytes (Transact-SQL)