“文档” 菜单
文档首页
/
MongoDB Manual
/ / / / /

加密集合管理

在此页面上

  • 概述
  • 元数据集合
  • 存储成本
  • 写入成本
  • 插入操作
  • 更新操作
  • 删除操作
  • 索引压缩

在本指南中,您可以了解如何托管您的加密collection,以及Queryable Encryption的存储和写入成本。

Queryable Encryption引入了使用随机加密对文档中的敏感字段进行加密的能力,同时仍然能够查询加密的字段。

使用 Queryable Encryption,给定的明文值始终会加密为不同的密文,同时仍然可查询。为了启用此功能,Queryable Encryption使用四种数据结构:

  • 三个元数据集合

  • 在加密collection中每个文档的字段叫做 __safeContent__

重要

不得修改或删除这些数据结构,这一点至关重要,否则查询结果不正确。

使用 Queryable Encryption 创建加密集合时,MongoDB 会创建三个元数据集合:

  • enxcol_.<collectionName>.esc,称为 ESC

  • enxcol_.<collectionName>.ecc,称为 ECC

  • enxcol_.<collectionName>.ecoc,称为 ECOC

例子

如果创建名为“患者”的集合,MongoDB 将创建以下元数据集合:

  • enxcol_.patients.esc

  • enxcol_.patients.ecc

  • enxcol_.patients.ecoc

当您插入要查询的包含加密字段的文档时,MongoDB 会更新元数据集合以维护支持查询的索引。 MongoDB 将其称为“索引字段”。 这是以存储和写入速度为代价的。

存储和写入成本根据每个文档的索引字段数量而增加。

重要

技术预览

MongoDB的指导在技术预览期间是,预计Queryable Encryption collection和关联的元数据集合的存储要求是两到三倍。例如,对于关联的元数据集合,1 GB 的collection可能需要 2-3 GB 的存储空间。

本指导将在未来版本中进行调整。

插入文档时,每个索引字段都需要对元数据集合进行两次写入。

  • 一个写入 ESC

  • 一个写入 ECOC

例子

插入具有两个索引字段的文档需要:

  • 对加密collection的一次写入。

  • 四次写入元数据集合。

更新文档时,每个索引字段都需要对元数据集合进行四次写入。

  • 一个写入 ESC

  • 一个写入 ECC

  • 两次写入 ECOC

例子

更新具有两个索引字段的文档需要:

  • 对加密collection的一次写入。

  • 对元数据集合进行 8 次写入。

删除文档时,每个索引字段都需要对元数据集合进行两次写入。

  • 一个写入 ECC

  • 一个写入 ECOC

例子

删除具有两个索引字段的文档需要:

  • 对加密collection的一次写入。

  • 四次写入元数据集合。

重要

技术预览

您需要在技术预览版期间运行索引压缩。 MongoDB 计划在未来版本中自动运行索引压缩。

当您插入、更新和删除文档时,元数据集合会发生变化和增长。索引压实是修剪元数据集合并减小其大小的过程。

ECOC的大小超过 1 GB 时,应运行压实。

您可以使用mongosh并发出db.collection.totalSize()命令来检查集合的大小。

例子

在此示例中,加密collection名为“患者”。

db.enxcol_.patients.ecoc.totalSize()
1407960328

重要

您必须为 Queryable Encryption 配置客户端才能运行索引压实。

要运行索引压缩,请使用mongosh并运行db.collection.compactStructuredEncryptionData()命令以减小元数据集合的大小。

例子

const eDB = "encryption"
const eKV = "__keyVault"
const secretDB = "records"
const secretCollection = "patients"
const localKey = fs.readFileSync("master-key.txt")
const localKeyProvider = { key: localKey }
const queryableEncryptionOpts = {
kmsProviders: { local: localKeyProvider },
keyVaultNamespace: `${eDB}.${eKV}`,
}
const encryptedClient = Mongo("localhost:27017", queryableEncryptionOpts)
const encryptedDB = encryptedClient.getDB(secretDB)
const encryptedCollection = encryptedDB.getCollection(secretCollection)
encryptedCollection.compactStructuredEncryptionData()
{
"stats": {
...
},
"ok": 1,
...
}
← 字段加密和可查询性