Docs 菜单

Docs 主页开发应用程序MongoDB Manual

KeyVault.rewrapManyDataKey()

在此页面上

  • 行为
  • 例子
KeyVault.rewrapManyDataKey(filter, options)

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

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

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

let keyVault = db.getMongo().getKeyVault()
keyVault.rewrapManyDataKey(
<filter>,
<options>
)
范围
类型
说明
filter
keyvault collection的查询筛选器
options
文档

该文档有两个字段:

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

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

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

警告

备份你的密钥保管库集合

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

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

重要

密钥轮换支持

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

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

mongosh客户端字段级加密方法需要启用客户端字段级加密的数据库连接。如果当前数据库连接不是在启用客户端字段级加密的情况下启动的,则:

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

1

启动mongosh客户端。

mongosh --nodb
2

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

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

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

var 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 }
}
}
}
← KeyVault.removeKeyAltName()

在此页面上