3

我想知道是否可以始终加密Memory Optimized Table并自动播种其主密钥?例如,我想创建以下内容:

CREATE TABLE Foo
(
    [Id] [int] Identity(1,1) NOT NULL,
    [Bar] NVARCHAR(MAX) NOT NULL,
    CONSTRAINT [PK_Foo] PRIMARY KEY NONCLUSTERED ([Id] ASC)
)
WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_ONLY)
GO

相当简单的表并且最初创建得很好但是,当我尝试加密列时,Bar我得到以下异常。

2017 年 4 月 21 日 09:23:00 [错误] WorkitemExecution:消息:内部异常:System.Data.SqlClient.SqlException 详细信息:当 IDENTITY_INSERT 设置为 OFF 时,无法在表“Foo”中插入标识列的显式值。

我也尝试SET IDENTITY_INSERT Foo ON在 create table 语句之后进行设置,但仍然没有运气。

阅读文档似乎并不表明这是不可能的,但也许我错过了什么?如果这是不可能的,我有另一种我知道会起作用的方法。

我想我的问题总结是.. “内存优化表是否支持始终使用标识列加密”

4

2 回答 2

2

您无法使用 Always Encrypted 对标识列进行加密,无论它们是存储在内存优化表还是常规表中。在正常的 Always Encrypted 查询处理流程中,插入加密列的值是在客户端创建和加密的。请注意,只有客户端拥有加密密钥并且可以加密/解密数据。SQL Server 在设计上无法访问加密密钥,也无法执行加密操作。标识列值是在服务器端生成的,因此它们不适合上述工作流程。

了解您尝试加密身份列的原因会很有用。Always Encrypted 旨在用于保护敏感数据。自动生成的标识符通常不被视为敏感信息。

谢谢,

雅库布

于 2017-04-21T16:59:03.367 回答
1

即使通过向导加密失败,您也应该为您创建 CMK 和 CEK。您可以通过在 SSMS 对象资源管理器中浏览到 YourDb -> Security -> Always Encrypted Keys -> Column Encryption Keys 来检查创建的 CEK 的名称。在我的例子中,CEK 的名称是 CEK_Auto1

如果您发现上述位置没有列加密密钥,您可以按照本文的配置列主密钥(新列主密钥)和配置列加密密钥(新列加密密钥)中概述的步骤创建一个新

您应该能够按如下方式创建表

CREATE TABLE Foo
(
    [Id] [int] Identity(1,1) NOT NULL,
    [Bar] NVARCHAR(MAX) COLLATE Latin1_General_BIN2 ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [CEK_Auto1], ENCRYPTION_TYPE = Deterministic, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NULL,
    CONSTRAINT [PK_Foo] PRIMARY KEY NONCLUSTERED ([Id] ASC)
)
WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_ONLY)
GO
于 2017-04-21T18:32:26.793 回答