Docs 菜单

Docs 主页开发应用程序MongoDB Manual

通过 KMIP 使用客户端字段级自动加密

在此页面上

  • 概述
  • 开始之前
  • 设置 KMS
  • 配置符合 KMIP 的密钥提供商
  • 指定您的证书
  • 创建应用程序
  • 在密钥保管库集合上创建唯一索引
  • 创建数据加密密钥
  • 配置 MongoClient
  • 插入具有加密字段的文档
  • 检索具有加密字段的文档
  • 了解详情

本指南介绍如何使用符合 Key Management Interoperability Protocol (KMIP) 的提供商来构建支持客户端字段级加密 (CSFLE) 的应用程序。

在完成本指南中的步骤后,您应该具有:

  • KMIP兼容提供商上托管的客户主密钥。

  • 正常工作的客户端应用程序;可以使用客户主密钥插入具有加密字段的文档。

要完成并运行本指南中的代码,您需要按照安装要求页面中的步骤来设置开发环境。

在本指南中,代码示例使用占位符文本。在运行示例之前,请用您自己的值替换这些占位符。

例如:

dek_id := "<Your Base64 DEK ID>"

您可以将引号之间的内容替换为您的 DEK ID。

dek_id := "abc123"

从页面右侧的 Select your language(选择语言)下拉菜单中,选择要查看代码示例的编程语言。

提示

请参阅:完整应用程序

要查看本教程的完整可运行应用程序代码,请访问以下链接:

注意

mongod 初创企业读取 KMIP 配置。默认情况下,服务器使用 KMIP 协议版本 1.2。

要连接到版本 1.0 或 1.1 的 KMIP 服务器,请使用useLegacyProtocol设置。

1

要将 MongoDB 驱动程序客户端连接到KMIP兼容密钥提供商,您必须配置KMIP兼容密钥提供商,使其接受客户端的 TLS 证书。

有关如何接受客户端证书的信息,请参阅符合KMIP的密钥提供商的文档。

2

客户端必须通过 TLS 连接到KMIP兼容密钥提供商,并提供KMIP兼容密钥提供商接受的客户端证书:

选择与您在应用程序中使用的 MongoDB 驱动程序相对应的标签页,查看相关代码示例。

1

encryption.__keyVault 命名空间中的 keyAltNames 字段上创建唯一索引。

选择与所需的 MongoDB 驱动程序对应的标签页:

2
1

指定符合KMIP的密钥提供商的 URI 端点:

2

以下代码会提示符合KMIP的提供商自动生成客户主密钥:

3

使用在本教程第一步中声明的变量生成数据加密密钥。

提示

请参阅:完整代码

3

提示

在与前面步骤中创建的文件不同的单独文件中,执行本教程中的其余步骤。

1

指定 encryption.__keyVault 以作为密钥保管库集合命名空间。

2

kmsProviders对象中指定kmip ,并输入KMIP兼容密钥提供程序的 URI 端点:

3

创建加密模式,指定客户端应用程序加密文档字段的方式:

提示

添加数据加密密钥 Base64 ID

请务必更新以下代码以包含您的基本64 DEK ID。您在本指南的“生成数据加密密钥”步骤中收到了该值。

提示

关于模式的进一步阅读

要查看有关如何构建在此步骤中使用的模式的深入说明,请参阅加密模式指南。

要查看加密模式支持的所有加密规则列表,请参阅CSFLE 加密模式指南。

4

注意

自动加密选项

自动加密选项向自动加密共享库提供配置信息,这将修改应用程序在访问加密字段时的行为。

要了解有关自动加密共享库的更多信息,请参阅 CSFLE 的自动加密共享库页面。

5

使用以下自动加密设置实例化 MongoDB 客户端对象,这些设置使用前面步骤中声明的变量:

4

使用启用了 CSFLE 的 MongoClient 实例,通过以下代码片段将具有加密字段的文档插入到 medicalRecords.patients 命名空间中:

在您插入文档时,启用了 CSFLE 的客户端对文档字段进行加密,以使其类似于以下内容:

{
"_id": { "$oid": "<_id of your document>" },
"name": "Jon Doe",
"ssn": {
"$binary": "<cipher-text>",
"$type": "6"
},
"bloodType": {
"$binary": "<cipher-text>",
"$type": "6"
},
"medicalRecords": {
"$binary": "<cipher-text>",
"$type": "6"
},
"insurance": {
"provider": "MaestCare",
"policyNumber": {
"$binary": "<cipher-text>",
"$type": "6"
}
}
}

提示

请参阅:完整代码

5

检索在本指南的“插入具有加密字段的文档”步骤中插入的具有加密字段的文档

为了显示 CSFLE 的功能,以下代码片段使用配置为自动 CSFLE 的客户端以及未配置为自动 CSFLE 的客户端来查询文档。

上述代码片段的输出应如下所示:

Finding a document with regular (non-encrypted) client.
{
_id: new ObjectId("629a452e0861b3130887103a"),
name: 'Jon Doe',
ssn: new Binary(Buffer.from("0217482732d8014cdd9ffdd6e2966e5e7910c20697e5f4fa95710aafc9153f0a3dc769c8a132a604b468732ff1f4d8349ded3244b59cbfb41444a210f28b21ea1b6c737508d9d30e8baa30c1d8070c4d5e26", "hex"), 6),
bloodType: new Binary(Buffer.from("0217482732d8014cdd9ffdd6e2966e5e79022e238536dfd8caadb4d7751ac940e0f195addd7e5c67b61022d02faa90283ab69e02303c7e4001d1996128428bf037dea8bbf59fbb20c583cbcff2bf3e2519b4", "hex"), 6),
'key-id': 'demo-data-key',
medicalRecords: new Binary(Buffer.from("0217482732d8014cdd9ffdd6e2966e5e790405163a3207cff175455106f57eef14e5610c49a99bcbd14a7db9c5284e45e3ee30c149354015f941440bf54725d6492fb3b8704bc7c411cff6c868e4e13c58233c3d5ed9593eca4e4d027d76d3705b6d1f3b3c9e2ceee195fd944b553eb27eee69e5e67c338f146f8445995664980bf0", "hex"), 6),
insurance: {
policyNumber: new Binary(Buffer.from("0217482732d8014cdd9ffdd6e2966e5e79108decd85c05be3fec099e015f9d26d9234605dc959cc1a19b63072f7ffda99db38c7b487de0572a03b2139ac3ee163bcc40c8508f366ce92a5dd36e38b3c742f7", "hex"), 6),
provider: 'MaestCare'
}
}
Finding a document with encrypted client, searching on an encrypted field
{
_id: new ObjectId("629a452e0861b3130887103a"),
name: 'Jon Doe',
ssn: 241014209,
bloodType: 'AB+',
'key-id': 'demo-data-key',
medicalRecords: [ { weight: 180, bloodPressure: '120/80' } ],
insurance: { policyNumber: 123142, provider: 'MaestCare' }
}

提示

请参阅:完整代码

如需了解 CSFLE 的工作原理,请参阅基础知识

如需详细了解本指南中提到的主题,请参阅以下链接:

  • 有关 CSFLE 组件的更多信息,请参阅参考页面。

  • 在“密钥和密钥保管库”页面上了解客户主密钥和数据加密密钥的工作原理。

  • CSFLE KMS 提供者页面上了解 KMS 提供者如何管理您的 CSFLE 密钥。

← 通过 GCP 使用客户端字段级自动加密
参考 →