Настройка шифрования столбцов на месте с помощью Transact-SQL
В этой статье описывается использование Always Encrypted с безопасными анклавами для выполнения криптографических операций на месте в столбцах с помощью инструкции ALTER TABLE/ ALTER COLUMN . Основные сведения о шифровании на месте и общие предварительные требованиях см. в статье Настройка шифрования столбцов на месте с помощью Always Encrypted с безопасными анклавами.
С помощью инструкции ALTER TABLE или ALTER COLUMN можно задать целевую конфигурацию шифрования для столбца. При выполнении инструкции защищенный анклав на стороне сервера шифрует, повторно шифрует или расшифровывает данные, хранящиеся в столбце, в зависимости от текущей и целевой конфигурации шифрования, указанной в определении столбца в инструкции.
- Если столбец в настоящий момент не зашифрован, он будет зашифрован, если в определении столбца указано предложение ENCRYPTED WITH .
- Если столбец зашифрован, он будет расшифрован (преобразован в столбец с открытым текстом), если в определении столбца не указано предложение ENCRYPTED WITH .
- Если столбец зашифрован, он будет повторно зашифрован, если указано предложение ENCRYPTED WITH , а указанный тип шифрования столбца или ключ шифрования столбца отличаются от используемого в настоящий момент типа шифрования или ключа шифрования столбца.
Криптографические операции нельзя сочетать с другими изменениями в одной инструкции ALTER TABLE / ALTER COLUMN . Исключением является изменение столбца на NULL или NOT NULL либо изменение параметров сортировки. Например, вы не можете зашифровать столбец и изменить тип данных столбца в одной инструкции Transact-SQL ALTER TABLE / ALTER COLUMN . Используйте для этого две отдельных инструкции.
Как и любой запрос, использующий защищенный анклава на стороне сервера, инструкция ALTER TABLE / ALTER COLUMN , которая инициирует шифрование на месте, должна отправляться через подключение с включенной функцией Always Encrypted и вычислениями анклава.
В оставшейся части этой статьи описывается запуск шифрования на месте с помощью инструкции ALTER TABLE / ALTER COLUMN из SQL Server Management Studio. Кроме того, можно выполнить ALTER TABLE / ALTER COLUMN из Azure Data Studio или из приложения.
В настоящее время командлет Invoke-Sqlcmd в модуле SqlServer PowerShell и sqlcmd не поддерживают использование ALTER TABLE / ALTER COLUMN для криптографических операций на месте.
Выполнение шифрования на месте с помощью Transact-SQL в среде SSMS
Предварительные требования
- Предварительные требования см. в статье Настройка шифрования столбцов на месте с помощью Always Encrypted с защищенными анклавами.
- Скачайте последнюю общедоступную версию SQL Server Management Studio (SSMS).
Шаги
- Откройте окно запроса с поддержкой вычислений в анклаве и Always Encrypted для подключения к базе данных. Дополнительные сведения см. в разделе «Включение и отключение Always Encrypted» для подключения к базе данных.
- В окне запроса выполните инструкцию ALTER TABLE / ALTER COLUMN , указав целевую конфигурацию шифрования для столбца, который необходимо зашифровать, расшифровать или зашифровать повторно. Если вы шифруете или повторно шифруете столбец, используйте ENCRYPTED WITH предложение. Если столбец является строковым столбцом (например, char , varchar , nchar , nvarchar ), также может потребоваться изменить тип сортировки на BIN2.
Заметка Если главный ключ столбца хранится в Azure Key Vault, вам может быть предложено выполнить вход в Azure.
ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE;
Заметка Если вы не удалите план затронутого запроса из кэша, первое выполнение запроса после шифрования может завершиться сбоем. Внимательно используйте ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE или DBCC FREEPROCCACHE для очистки кэша планов, так как эта операция может привести к временному ухудшению производительности запросов. Чтобы свести к минимуму негативное влияние очистки кэша, вы можете выборочно удалять планы только для затронутых запросов.
Примеры
Шифрование столбца на месте
В приведенном ниже примере предполагается:
- CEK1 — это ключ шифрования столбцов с поддержкой анклава.
- Столбец SSN содержит открытый текст и в настоящее время использует сортировку базы данных по умолчанию, такую как Latin1, а не параметры сортировки BIN2 (например, Latin1_General_CI_AI_KS_WS ).
Инструкция шифрует SSN столбец с помощью детерминированного шифрования и ключа шифрования столбца с поддержкой анклава. Она также перезаписывает сортировку базы данных по умолчанию соответствующими (в той же кодовой странице) параметрами сортировки BIN2.
Операция выполняется в сети ( ONLINE = ON ). Также обратите внимание на вызов ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE , который восстанавливает планы запросов, затронутые изменением схемы таблицы.
ALTER TABLE [dbo].[Employees] ALTER COLUMN [SSN] [char](11) COLLATE Latin1_General_BIN2 ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [CEK1], ENCRYPTION_TYPE = Deterministic, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NOT NULL WITH (ONLINE = ON); GO ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE; GO
Повторное шифрование столбца на месте для изменения типа шифрования
В приведенном ниже примере предполагается:
- SSN столбец зашифрован с помощью детерминированного шифрования и ключа шифрования столбца с поддержкой анклава CEK1 .
- Текущие параметры сортировки, установленные на уровне столбца, имеют тип Latin1_General_BIN2 .
Приведенная ниже инструкция повторно шифрует столбец с помощью случайного шифрования и того же ключа ( CEK1 ).
ALTER TABLE [dbo].[Employees] ALTER COLUMN [SSN] [char](11) COLLATE Latin1_General_BIN2 ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [CEK1] , ENCRYPTION_TYPE = Randomized , ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NOT NULL; GO ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE; GO
Повторное шифрование столбца на месте для смены ключа шифрования столбца
В приведенном ниже примере предполагается:
- SSN столбец зашифрован с помощью случайного шифрования и ключа шифрования столбца с поддержкой анклава CEK1 .
- CEK2 — это ключ шифрования столбца с поддержкой анклава (отличный от CEK1 ).
- Текущие параметры сортировки, установленные на уровне столбца, имеют тип Latin1_General_BIN2 .
Приведенная ниже инструкция повторно шифрует столбец с помощью CEK2 .
ALTER TABLE [dbo].[Employees] ALTER COLUMN [SSN] [char](11) COLLATE Latin1_General_BIN2 ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [CEK2] , ENCRYPTION_TYPE = Randomized , ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NOT NULL; GO ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE; GO
Расшифровка столбца на месте
В приведенном ниже примере предполагается:
- SSN столбец зашифрован с помощью ключа шифрования столбца с поддержкой анклава.
- Текущие параметры сортировки, установленные на уровне столбца, имеют тип Latin1_General_BIN2 .
Приведенная ниже инструкция расшифровывает столбец и оставляет без изменений параметры сортировки. При необходимости можно изменить параметры сортировки. Например, изменить параметры сортировки на отличные от BIN2, в той же инструкции.
ALTER TABLE [dbo].[Employees] ALTER COLUMN [SSN] [char](11) COLLATE Latin1_General_BIN2 WITH (ONLINE = ON); GO ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE; GO
Далее
- Выполнение инструкций Transact-SQL с помощью безопасных анклавов
- Создание и использование индексов в столбцах с помощью Always Encrypted с безопасными анклавами
- Разработка приложений с помощью Always Encrypted с безопасными анклавами
См. также
- Устранение распространенных неполадок Always Encrypted с безопасными анклавами
- Настройка шифрования столбцов на месте с помощью Always Encrypted с безопасными анклавами
- Включение Always Encrypted с безопасными анклавами для существующих зашифрованных столбцов
- Руководство. Начало работы с Always Encrypted с безопасными анклавами
Шифрование столбца данных
В этой статье описывается, как шифровать столбец данных с помощью симметричного шифрования в SQL Server с помощью Transact-SQL. Иногда это называется шифрованием на уровне столбца или ячейки.
В этой статье требуется AdventureWorks2022 пример базы данных, которую можно скачать на домашней странице примеров и проектов сообщества Microsoft SQL Server.
Безопасность
Разрешения
Для выполнения приведенных ниже шагов необходимы следующие разрешения.
- Разрешение CONTROL в базе данных.
- Разрешение CREATE CERTIFICATE в базе данных. Сертификаты могут принадлежать только именам входа Windows, именам входа SQL Server и ролям приложений. Сертификаты не могут принадлежать группам и ролям.
- Разрешение ALTER в базе данных.
- Некоторые разрешения применяются к ключу; также не должно быть запрета на разрешение VIEW DEFINITION .
Создание главного ключа базы данных
Для применения приведенных ниже примеров требуется главный ключ базы данных. Если в базе данных еще нет главного ключа базы данных, создайте его. Для этого подключитесь к базе данных и выполните следующий скрипт. Обязательно используйте сложный пароль.
Скопируйте и вставьте следующий пример в окно запроса, подключенное к примеру базы данных AdventureWorks . Выберите Выполнить.
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '';
Всегда создавайте резервную копию главного ключа базы данных. Дополнительные сведения о главных ключах базы данных см. в статье CREATE MASTER KEY (Transact-SQL).
Пример. Шифрование с помощью симметричного шифрования и средства проверки подлинности
- В обозревателе объектов подключитесь к экземпляру ядра СУБД.
- На стандартной панели выберите пункт Создать запрос.
- Скопируйте и вставьте следующий пример в окно запроса, подключенное к примеру базы данных AdventureWorks . Выберите Выполнить.
CREATE CERTIFICATE Sales09 WITH SUBJECT = 'Customer Credit Card Numbers'; GO CREATE SYMMETRIC KEY CreditCards_Key11 WITH ALGORITHM = AES_256 ENCRYPTION BY CERTIFICATE Sales09; GO -- Create a column in which to store the encrypted data. ALTER TABLE Sales.CreditCard ADD CardNumber_Encrypted varbinary(160); 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 using the -- symmetric key CreditCards_Key11. -- Save the result in column CardNumber_Encrypted. UPDATE Sales.CreditCard SET CardNumber_Encrypted = EncryptByKey(Key_GUID('CreditCards_Key11') , CardNumber, 1, HASHBYTES('SHA2_256', CONVERT( varbinary , CreditCardID))); GO -- Verify the encryption. -- First, open the symmetric key with which to decrypt the data. OPEN SYMMETRIC KEY CreditCards_Key11 DECRYPTION BY CERTIFICATE Sales09; GO -- Now list the original card number, the encrypted card number, -- and the decrypted ciphertext. If the decryption worked, -- the original number will match the decrypted number. SELECT CardNumber, CardNumber_Encrypted AS 'Encrypted card number', CONVERT(nvarchar, DecryptByKey(CardNumber_Encrypted, 1 , HASHBYTES('SHA2_256', CONVERT(varbinary, CreditCardID)))) AS 'Decrypted card number' FROM Sales.CreditCard; GO
Шифрование с помощью простого симметричного шифрования
- В обозревателе объектов подключитесь к экземпляру ядра СУБД.
- На стандартной панели выберите пункт Создать запрос.
- Скопируйте и вставьте следующий пример в окно запроса, подключенное к примеру базы данных AdventureWorks . Выберите Выполнить.
CREATE CERTIFICATE HumanResources037 WITH SUBJECT = 'Employee Social Security Numbers'; GO CREATE SYMMETRIC KEY SSN_Key_01 WITH ALGORITHM = AES_256 ENCRYPTION BY CERTIFICATE HumanResources037; GO 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 -- Verify the encryption. -- First, open the symmetric key with which to decrypt the data. OPEN SYMMETRIC KEY SSN_Key_01 DECRYPTION BY CERTIFICATE HumanResources037; GO -- Now list the original ID, the encrypted ID, and the -- decrypted ciphertext. If the decryption worked, the original -- and the decrypted ID will match. SELECT NationalIDNumber, EncryptedNationalIDNumber AS 'Encrypted ID Number', CONVERT(nvarchar, DecryptByKey(EncryptedNationalIDNumber)) AS 'Decrypted ID Number' FROM HumanResources.Employee; GO
Далее
- CREATE CERTIFICATE (Transact-SQL)
- CREATE SYMMETRIC KEY (Transact-SQL)
- Инструкция ALTER TABLE (Transact-SQL)
- OPEN SYMMETRIC KEY (Transact-SQL)
