密钥和密钥保管库
Overview
在本指南中,您可以详细了解 Queryable Encryption 的以下组件:
数据加密密钥 (DEK)
客户主密钥 (CMK)
密钥保管库集合
密钥管理系统 (KMS)
要查看演示如何使用上述组件设置启用了 Queryable Encryption 的客户端的分步指南,请参阅以下资源:
密钥
您的 数据加密密钥 ( DEK ) 是 MongoDB 用于加密文档中的字段的密钥。您可以将DEK存储在Key Vault collection中的文档中,并使用客户主密钥 ( CMK ) 进行加密。
您的客户主密钥是 MongoDB 在创建期间用于加密您的数据加密密钥的密钥。 如果无法访问客户主密钥 ,您的应用程序将无法解密关联的 DEK。
如果删除了 DEK,使用该 DEK 加密的所有字段将永久不可读。如果删除了 CMK,使用该 CMK 的 DEK 加密的所有字段将永久不可读。
警告
客户主密钥是可查询加密中最敏感的密钥。如果您的 CMK 遭到泄露,则可以解密所有加密数据。使用远程密钥管理系统存储 CMK。
重要
使用远程密钥管理服务提供商
要查看详细说明DEK 、 CMK和 Key Vault 集合如何在所有支持的KMS提供程序架构中进行交互的图表,请参阅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
命令:
1 db.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 集合,请参阅数据库和集合。
keyVaultCollectionName
您可以使用任何非管理员命名空间来存储密钥保管库集合。按照惯例,本文档中的示例均使用 encryption.__keyVault
命名空间。
警告
请勿使用 admin
数据库存储与加密相关的集合。如果您在此集合中使用管理数据库,您的 MongoDB 客户端可能会因权限不足而无法访问或解密数据。
权限
对 Key Vault 集合具有 read
访问权限的应用程序可以通过查询相应集合来检索加密的数据加密密钥 (DEK)。但是,只有有权访问用于加密 DEK 的客户主密钥 (CMK) 的应用程序才能使用该 DEK 进行加密或解密。您必须为应用程序同时授予对 Key Vault 集合和 CMK 的访问权限,才能使用 DEK 加密和解密文档。
要了解如何授予对 MongoDB 集合的访问权限,请参阅 MongoDB 手册中的管理用户和角色。
要了解如何授予应用程序访问客户主密钥的权限,请参阅教程教程。
密钥保管库集群
默认情况下,MongoDB 会在连接的集群上存储“密钥保管库集合”。MongoDB 还支持在与连接集群不同的 MongoDB 部署上托管“密钥保管库集合”。应用程序必须能够访问托管“密钥保管库集合”的集群和连接集群,才能执行“可查询加密”操作。
要指定托管密钥保管库集合的集群,请使用客户端的MongoClient
对象的keyVaultClient
字段。 要了解有关客户端MongoClient
对象中 Queryable Encryption 特定配置选项的更多信息,请参阅MongoClient for Queryable Encryption 选项。
更新密钥保管库集合
要将 DEK 加入密钥保管集合,请使用 ClientEncryption
对象的 createKey
方法。
要删除或更新DEK ,请使用标准CRUD操作。 您可以将 DEK 作为文档存储在 MongoDB 中,并且可以将任何文档操作应用于 DEK。
要查看演示如何创建 DEK 的教程,请参阅快速入门。