如何在SQL Server 2017中的表的加密列上执行插入,更新和删除操作

时间:2018-09-05 07:45:53

标签: sql-server

我的名字叫Hari varma,我正在担任SQL DBA。

当前,我在测试服务器的SQL Server 2017 Development Edition中遇到始终加密问题。

我对“始终加密”和TDE没有任何经验。我的一位客户要求我对数据库进行加密。

我已经对Always Encryption进行了一些测试,并且可以通过执行以下操作来加密和解密列数据:

On the SQL Server instance
-->Options-->Additional connection Parameter-->Column Encryption Setting = Enabled

启用列加密后,我可以查看表中的加密数据。

但是,我无法在此加密列中插入,更新和删除数据。 另外,我还需要对允许/不允许查看此加密列上的数据的用户设置权限。

我需要授予特定用户哪些权限,并提供始终加密和TDE的所有先决条件。

1 个答案:

答案 0 :(得分:0)

首先,重要的是要了解,在使用Always Encrypted时,您的SQL Server实例不知道用于加密和解密数据的密钥。密钥通常在外部存储,通常存储在Windows证书存储或Azure Key Vault之类的密钥存储中。这意味着SQL Server本身无法加密或解密数据-而是必须由有权访问密钥的客户端应用程序完成。

  

但是我无法在此加密列中插入,更新和删除数据。

我假设您正在尝试直接通过SSMS或类似方法插入,更新和删除数据。这仅在有限的程度上是可能的。这是因为SSMS(在这种情况下,这是您的客户端应用程序)需要能够对数据进行加密,然后再将其发送到SQL Server。

在此处(使用SSMS)详细了解SQL Server中的inserting data into columns that are encrypted via Always Encrypted

有关如何通过SSMS插入加密数据的简短摘要:

  • 您需要在连接字符串中启用列加密设置。当您连接到SSMS中的SQL Server实例时,这是在“选项” >>“附加连接参数”下完成的。在此处添加此文本:Column Encryption Setting = Enabled
  • 连接到数据库并打开查询窗口后,需要为始终加密启用参数化。这是在SSMS中的“查询>>查询选项>>执行>>高级>>为始终加密启用参数化。

完成上述两个步骤后,就可以将数据插入加密列中,如下所示:

DECLARE @ParameterToBeEncrypted NVARCHAR(100) = 'Decrypt me';
INSERT INTO dbo.MyTable(MyEncryptedColumn) VALUES (@ParameterToBeEncrypted);

之所以行之有效,是因为您的客户端应用程序(SSMS)能够在将初始化@ParameterToBeEncrypted的值发送到SQL Server之前对其进行加密。仅当您当前的用户有权访问列加密密钥时,此方法才有效。 SQL Server将永远不会看到纯/未加密的值(“解密我”)-它只会看到应该插入加密列中的加密值。

  

我需要授予特定用户哪些权限,并提供“始终加密”的所有先决条件

这是SQL Server中权限的组合,并且能够访问用于加密和解密数据的密钥。必要的数据库权限为VIEW ANY COLUMN MASTER KEY DEFINITIONVIEW ANY COLUMN ENCRYPTION KEY DEFINITION。 您可以read more about the necessary permissions here.

如果要加密数据库中的一组现有数据,那么最好的选择是编写自己的客户端应用程序(例如,使用C#或类似程序)或创建SSIS包(用作客户端应用程序)。客户端应用程序或SSIS包应从数据库读取数据,对数据库外部的数据进行加密,然后将其作为加密数据发送回数据库。