Docs 菜单

Docs 主页开发应用程序MongoDB Manual

密钥和密钥保管库

在此页面上

  • 概述
  • 密钥
  • 密钥保管库集合
  • keyVaultCollectionName
  • 权限
  • 密钥保管库集群
  • 更新密钥保管库集合

本指南中,您可以详细了解客户端字段级加密 (CSFLE) 的以下组件:

  • 数据加密密钥 (DEK)

  • 客户主密钥 (CMK)

  • 密钥保管库集合

  • 密钥管理系统 (KMS)

如需查看演示如何使用前述组件设置启用 CSFLE 的客户端的分步指南,请参阅以下资源:

您的 数据加密密钥 ( DEK ) 是 MongoDB 用于加密文档中的字段的密钥。您可以将DEK存储在Key Vault collection中的文档中,并使用客户主密钥 ( CMK ) 进行加密。

您的客户主密钥是 MongoDB 在创建期间用于加密您的数据加密密钥的密钥。 如果无法访问客户主密钥 ,您的应用程序将无法解密关联的 DEK。

如果删除了 DEK,使用该 DEK 加密的所有字段将永久不可读。如果删除了 CMK,使用该 CMK DEK 加密的所有字段将永久不可读。

警告

客户主密钥是可查询加密中最敏感的密钥。如果您的 CMK 遭到泄露,则可以解密所有加密数据。使用远程密钥管理系统存储 CMK

重要

使用远程密钥管理服务提供商

将您的客户主密钥存储在远程密钥管理系统 (KMS) 上。

要详细了解为什么应使用远程KMS ,请参阅使用远程 KMS 的原因。

要查看所有支持的 KMS 提供商的列表,请参阅 KMS 提供商页面。

要查看详细说明 DEKCMK 和密钥保管库集合如何在所有受支持的 KMS 提供程序架构中交互的图表,请参阅 CSFLE KMS 提供程序

密钥保管库集合是用于存储加密的数据加密密钥(DEK)文档的 MongoDB 集合。DEK 文档是包含 DEK 的 BSON 文档,具有以下结构:

{
"_id" : UUID(<string>),
"status" : <int>,
"masterKey" : {<object>},
"updateDate" : ISODate(<string>),
"keyMaterial" : BinData(0,<string>),
"creationDate" : ISODate(<string>),
"keyAltNames" : <array>
}

您可以像创建标准 MongoDB collection一样创建密钥保管库集合。您的密钥保管库集合必须在keyAltNames字段上具有唯一索引。要检查唯一索引是否存在,请对密钥保管库集合运行listIndexes命令:

1db.runCommand({
2 listIndexes: "__keyVault",
3});
1{
2 cursor: {
3 id: Long("0"),
4 ns: 'encryption.__keyVault',
5 firstBatch: [
6 { v: 2, key: { _id: 1 }, name: '_id_' }
7 ]
8 },
9 ok: 1,
10}

如果不存在唯一索引,应用程序必须在执行 DEK 管理之前创建该索引。

要了解如何创建 MongoDB 集合,请参阅数据库和集合

提示

mongosh 功能

mongosh方法KeyVault.createKey()会自动在keyAltNames字段上创建唯一索引(如果不存在)。

您可以使用任何非管理员命名空间来存储密钥保管库集合。按照惯例,本文档中的示例均使用 encryption.__keyVault 命名空间

警告

请勿使用 admin 数据库存储与加密相关的集合。如果您在此集合中使用管理数据库,您的 MongoDB 客户端可能会因权限不足而无法访问或解密数据。

对 Key Vault 集合具有 read 访问权限的应用程序可以通过查询相应集合来检索加密的数据加密密钥 (DEK)。但是,只有有权访问用于加密 DEK 的客户主密钥 (CMK) 的应用程序才能使用该 DEK 进行加密或解密。您必须为应用程序同时授予对 Key Vault 集合和 CMK 的访问权限,才能使用 DEK 加密和解密文档。

要了解如何授予对 MongoDB 集合的访问权限,请参阅 MongoDB 手册中的管理用户和角色

要了解如何授予应用程序访问 CMK 的权限,请参阅教程的教程。

默认情况下,MongoDB 会在连接的集群上存储“密钥保管库集合”。MongoDB 还支持在与连接集群不同的 MongoDB 部署上托管“密钥保管库集合”。应用程序必须能够访问托管“密钥保管库集合”的集群和连接集群,才能执行“可查询加密”操作。

要指定托管密钥保管库集合的集群,请使用客户端的 MongoClient 对象的 keyVaultClient 字段。要了解有关客户端 MongoClient 对象中的 CSFLE 特定的配置选项的更多信息,请参阅 CSFLE 特定的 MongoClient 选项

要将 DEK 加入密钥保管集合,请使用 ClientEncryption 对象的 createKey 方法。

要删除或更新DEK ,请使用标准CRUD操作。您可以将 DEK 作为文档存储在 MongoDB 中,并且可以将任何文档操作应用于 DEK。

要查看演示如何创建 DEK 的教程,请参阅快速入门

← 加密模式