SQL Server 2016 представил новую функцию под названием Always Encrypted, которая также доступна в Azure SQL Database. Always Encrypted позволяет вам шифровать определенные столбцы в таблице с использованием основного ключа и сертификата. Это гарантирует, что данные отображаются как зашифрованные строки для любого, у кого нет необходимого сертификата, установленного на их компьютере. После установки сертификата данные могут быть просмотрены как обычно.
Always Encrypted решает проблемы людей, которые беспокоятся о хранении чувствительных данных на общем сервере в облаке, таком как Microsoft Azure, и доступе к ним через интернет. Данные безопасно зашифрованы и могут быть расшифрованы только приложением с правильным сертификатом, что обеспечивает их безопасность при передаче по сети.
На момент написания, Always Encrypted поддерживается ADO.NET 4.6, JDBC 6.0 и ODBC 13.1. Вызывающее приложение, включая SQL Server Management Studio (SSMS), должно иметь дополнительный параметр в строке подключения: “column encryption setting=enabled”.
Для шифрования данных с использованием Always Encrypted вы можете использовать мастер в SSMS или написать код T-SQL. Давайте рассмотрим пример создания таблицы и шифрования некоторых столбцов:
CREATE TABLE [Customers] (
[CustomerID] [int] NOT NULL,
[FirstName] [nvarchar](25) NOT NULL,
[LastName] [nvarchar](25) NOT NULL,
[SIN] [nvarchar](11) NULL,
[CreditCardNumber] [nvarchar](25) NULL,
[EmailAddress] [nvarchar](50) NULL,
[PhoneNumber] [nvarchar](25) NULL,
[TerritoryID] [int] NULL
)
-- Шифрование данных с помощью мастера
-- Выберите столбцы, которые вы хотите зашифровать, и выберите тип шифрования (детерминированный или случайный)
-- Выберите, где хранить основной ключ шифрования (локальное хранилище сертификатов Windows или хранилище ключей Azure)
-- Запустите процесс шифрования
-- Просмотр зашифрованных данных
SELECT [CustomerID], [FirstName], [LastName], [SIN], [CreditCardNumber], [EmailAddress], [PhoneNumber], [TerritoryID]
FROM [dbo].[Customers]
После завершения процесса шифрования зашифрованные столбцы будут отображать зашифрованные значения. Чтобы просмотреть незашифрованные данные, вам необходимо повторно подключить ваш запрос в SSMS с параметром “column encryption setting=enabled” в параметрах подключения.
Обновление зашифрованных данных требует использования параметризованных запросов. Стандартные запросы обновления не будут работать. Вот пример обновления данных с использованием хранимой процедуры:
CREATE PROCEDURE dbo.AddCustomer
@CustomerID int,
@FirstName nvarchar(25),
@LastName nvarchar(25),
@SIN nvarchar(11),
@CreditCardNumber nvarchar(25),
@EmailAddress nvarchar(50),
@PhoneNumber nvarchar(25),
@TerritoryID int
AS
BEGIN
INSERT INTO [dbo].[Customers] ([CustomerID], [FirstName], [LastName], [SIN], [CreditCardNumber], [EmailAddress], [PhoneNumber], [TerritoryID])
VALUES (@CustomerID, @FirstName, @LastName, @SIN, @CreditCardNumber, @EmailAddress, @PhoneNumber, @TerritoryID)
END
Для обновления таблицы вы должны использовать параметризованный запрос. Стандартные запросы, даже в SSMS, не будут работать. Always Encrypted требует одно из поддерживаемых подключений, таких как ADO.NET 4.6, JDBC 6.0 или ODBC 13.1.
В заключение, Always Encrypted – это мощная функция в SQL Server, которая позволяет безопасно шифровать чувствительные данные. Она обеспечивает дополнительный уровень защиты, независимо от того, где хранятся ваши данные: на собственных серверах или в облаке. Хотя внедрение Always Encrypted может потребовать некоторых настроек вашего приложения и запросов, дополнительная безопасность стоит затраченных усилий.
Не забудьте тщательно управлять своим сертификатом, так как он необходим для расшифровки данных. Без сертификата данные останутся непонятными.
Для получения дополнительной информации о Always Encrypted и его возможностях обратитесь к официальной документации Microsoft.