【问题标题】:How to perform insert, update and delete operations, on encrypted column in a table in SQL server 2017如何对 SQL Server 2017 中表中的加密列执行插入、更新和删除操作
【发布时间】:2019-01-20 19:23:53
【问题描述】:

我的名字是 Hari varma,我是一名 SQL DBA。

目前,我在我们的测试服务器中遇到了 SQL Server 2017 Development Edition 中的 Always Encryption 问题。

我在 Always Encryption 和 TDE 方面没有任何经验。我的一位客户要求我对数据库进行加密。

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

在 SQL Server 实例上 -->Options-->Additional connection Parameter-->Column Encryption Setting = Enabled

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

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

我需要为特定用户授予哪些权限,并为 Always Encryption 和 TDE 提供任何先决条件。

【问题讨论】:

  • 我最近遇到了完全相同的问题。在谷歌搜索了一段时间后,我设法执行了 Insterst / Updates:我在数据库中创建了一个执行手头任务的过程。然后我创建了一个 C# 应用程序/SSIS 组件,它使用所需的参数调用该过程(目前在 SSMS 中似乎不可能对始终加密的列进行 DML)。请随时与我联系以获取更多详细信息。无论如何,“哪些权限”应该是过时的:始终加密适用于密钥对/证书。如果用户缺少所需的 KEY,他将不会发现任何解密数据。
  • 你能提供我一步一步的过程吗?
  • 当然,我会尽力而为。但在我开始之前:您已经尝试/执行了什么?您是否已经生成(并存储)证书(带有密钥)?正如您提到的,您已经看到了加密数据,我想这已经完成了?你还能看到解密的数据吗?
  • 我只是创建一个测试数据库并在测试数据库中创建一个表并插入一些值。表结构包含 PersonID、FirastName、LastName、Address、City。我使用 GUI 进程权限在表加密列上对 City 列进行了加密。 column_encryption_key_name = 'CEK_Auto1' 我在 SSMS 中启用了 Column Encryption Setting=Enabled,启用后我能够以普通文本查看加密数据。当我尝试使用以下查询插入时,出现错误
  • 错误消息 206、级别 16、状态 2、第 9 行操作数类型冲突:varchar 与使用 (encryption_type = 'DETERMINISTIC', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 加密的 varchar(8000) 不兼容'CEK_Auto1', column_encryption_key_database_name = 'Encryption') collat​​ion_name = 'SQL_Latin1_General_CP1_CI_AS' INSERT INTO [dbo].[Persons](PersonID, FirstName, LastName, Address, City) VALUES ('4', 'ABC', 'DEF', ' AP','AP');

标签: sql-server


【解决方案1】:

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

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

我假设您正在尝试直接通过 SSMS 或类似的方式插入、更新和删除数据。这只能在有限的范围内实现。这是因为 SSMS(在这种情况下是您的客户端应用程序)需要能够在将数据发送到您的 SQL Server 之前对其进行加密。

在此处阅读有关 SQL Server 中 inserting data into columns that are encrypted via Always Encrypted 的更多信息(使用 SSMS)。

简单总结一下如何通过SSMS插入加密数据:

  • 您需要在连接字符串中启用列加密设置。当您在 SSMS 中连接到 SQL Server 实例时,这是在选项>>附加连接参数下完成的。在其中添加此文本:Column Encryption Setting=Enabled
  • 连接到数据库并打开查询窗口后,您需要启用始终加密的参数化。这是在 SSMS 中的 Query>>Query Options>>Execution>>Advanced>>Enable Parameterization for Always Encrypted 下完成的。

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

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

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

我需要为特定用户授予哪些权限并为 Always Encryption 提供任何先决条件

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

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

【讨论】:

    猜你喜欢
    • 2011-07-04
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-28
    • 2012-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多