对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。

KeyVault.rewrapManyDataKey()(mongosh方法)

KeyVault.rewrapManyDataKey(filter, options)

解密多个数据加密密钥 (DEK),并使用新的客户主密钥 (CMK) 重新加密。 使用此方法轮换加密 DEK 的 CMK。 要了解有关 CMK 和 DEK 的更多信息,请参阅数据加密密钥和客户主密钥。

您可以通过masterKey参数指定客户主密钥。如果您不包含masterKey参数,该方法将使用 DEK 元数据中引用的 CMK 解密和加密每个 DEK。 要了解有关 DEK 元数据的更多信息,请参阅用于解密的元数据。

返回:

一个BulkWriteResult对象,报告受影响的数据键数量。

警告

备份你的密钥保管库集合

在轮换数据加密密钥之前,请确保为密钥保管库集合创建备份。 如果您无法访问数据加密密钥,您将丢失所有加密数据。

要了解如何创建collection的备份,请参阅使用 MongoDB 工具进行备份和恢复。

此命令可用于以下环境中托管的部署:

  • MongoDB Atlas:用于云中 MongoDB 部署的完全托管服务

KeyVault.rewrapManyDataKey 通过以下语法实现:

let keyVault = db.getMongo().getKeyVault() keyVault.rewrapManyDataKey( <filter>, <options>)
Parameter
类型
说明

filter

keyvault collection的查询筛选器

options

文档

该文档有两个字段:

  • provider: KMS 提供商(Amazon Web Services KMS、Azure Key Vault、GCP KMS、本地提供商或 KMIP)

  • masterKey:用于加密新数据密钥的 KMS 特定密钥

重要

密钥轮换支持

要查看密钥轮换 API 的驱动程序依赖项,请参阅兼容性。

此操作不是原子操作,不应与其他密钥管理操作并行运行。

mongosh 客户端字段级加密方法需要启用客户端字段级加密的数据库连接。如果当前数据库连接在启动时未启用客户端字段级加密,则任选以下其一:

这些示例可让您快速评估客户端字段级加密。 有关使用每个受支持的KMS提供商的具体示例,请参阅加密密钥管理。

1

启动mongosh客户端。

mongosh --nodb
2

要为本地托管的密钥配置客户端字段级加密,请生成一个不带换行符的 base64 编码的 96 字节字符串。

const TEST_LOCAL_KEY = require("crypto").randomBytes(96).toString("base64")
3

使用生成的本地密钥字符串创建客户端字段级加密选项:

let autoEncryptionOpts = { "keyVaultNamespace" : "encryption.__dataKeys", "kmsProviders" : { "local" : { "key" : BinData(0, TEST_LOCAL_KEY) } } }
4

使用配置了客户端字段级加密选项的Mongo()构造函数来创建数据库连接。 将mongodb://myMongo.example.net URI 替换为目标集群的连接字符串 URI 。

encryptedClient = Mongo( "mongodb://myMongo.example.net:27017/?replSetName=myMongo", autoEncryptionOpts)

检索KeyVault对象并使用KeyVault.rewrapManyDataKey()方法将现有密钥重新包装在新的masterKey中。 如果没有给出新的masterKey ,则每个数据键保留其各自当前的masterKey 。

以下示例展示了如何使用各自的当前masterKey重新包装每个数据键:

let keyVault = mongo.getKeyVault() keyVault.rewrapManyDataKey()

以下示例展示了如何使用新的masterKey重新包装每个数据键:

let keyVault = mongo.getKeyVault() keyVault.rewrapManyDataKey({}, { provider: 'aws', masterKey: { region: 'us-east-2', key: 'arn:aws:kms:us-east-2:...' }})

以下示例展示了如何重新包装过去 30 天内未重新包装的数据密钥。

let keyVault = mongo.getKeyVault() const thirtyDaysAgo = new Date(Date.now() - 30 * 24 * 60 * 60 * 1000); keyVault.rewrapManyDataKey({ updateDate: { $lt: thirtyDaysAgo } });

KeyVault.rewrapManyDataKey()返回一个BulkWriteResult对象,详细说明有多少数据键受到影响:

{ bulkWriteResult: BulkWriteResult { result: { ok: 1, writeErrors: [], writeConcernErrors: [], insertedIds: [], nInserted: 0, nUpserted: 0, nMatched: 3, nModified: 3, nRemoved: 0, upserted: [], opTime: { ts: Timestamp({ t: 1655840760, i: 3 }), t: 23 } } }}
给本页内容打分