Docs 菜单

Docs 主页开发应用程序MongoDB Manual

使用显式加密

在此页面上

  • 概述
  • 开始之前
  • 步骤
  • 创建客户主密钥
  • 在密钥保管库集合上创建唯一索引
  • 创建你的数据加密密钥和加密collection
  • 配置 MongoClient 以进行加密读取和写入
  • 插入具有加密字段的文档
  • 检索加密文档
  • 了解详情

本指南向您展示如何使用显式加密和 MongoDB 驱动程序来加密文档。

完成本指南后,您应该能够配置驱动程序,使用显式加密对文档中的字段进行加密。 有了这些知识,您应该能够创建使用显式加密的客户端应用程序。具有自动解密功能。

重要

请勿在生产中使用此应用程序

由于此示例应用程序在应用程序的文件系统上存储了加密密钥,因此您可能会遇到未经授权访问该密钥或丢失解密数据的密钥的风险。

要查看演示如何创建使用远程密钥管理系统的启用了 Queryable Encryption 的应用程序的教程,请参阅教程。

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

提示

请参阅:完整应用程序

要查看您在本指南中创建的应用程序的完整代码,请选择与您的首选 MongoDB 驱动程序对应的标签页,然后点击提供的链接:

1

您必须创建客户主密钥 ( 客户主密钥 ) 才能执行Queryable Encryption。

创建 96 字节的客户主密钥并将其保存到文件 master-key.txt中:

openssl rand 96 > master-key.txt

注意

警告

不要在生产环境中使用本地密钥文件

文件系统中的本地密钥文件不安全, 不建议 用于生产环境。相反,您应该将客户主密钥存储在远程 密钥管理系统 中 (KMS)。

要了解如何在 Queryable Encryption 实施中使用远程 KMS,请参阅教程指南。

2

在你的encryption.__keyVaultcollection中的keyAltNames字段上创建唯一索引。

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

3
1

检索您在本指南的创建客户主密钥步骤中生成的客户主密钥文件的内容。

客户主密钥值传递到您的 KMS 提供商设置。The client uses these settings to discover the CMK. 将提供程序名称设置为local以通知驱动程序您正在使用本地密钥提供程序。

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

2

使用 MongoDB 连接字符串和密钥保管库集合命名空间构建客户端,并创建数据加密密钥:

注意

密钥保管库集合命名空间权限

密钥保管库集合位于encryption.__keyVault命名空间中。 确保应用程序用于连接到 MongoDB 的数据库用户对此命名空间具有ReadWrite权限。

3

使用已启用 Queryable EncryptionMongoClient 的实例指定必须加密的字段并创建加密的 collection:

本节中代码的输出应类似于以下内容:

Created encrypted collection!

提示

请参阅:完整代码

4
1

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

2

指定 KMS 提供商并以内联方式指定客户主密钥:

3

检索在本指南的“创建数据加密密钥”步骤中创建的数据加密密钥

4

提示

了解详情

要了解有关此路径引用的库的更多信息,请参阅用于 Queryable Encryption 的自动加密共享库页面。

5

使用以下自动加密设置实例化MongoClient对象:

注意

自动解密

MongoClient我们使用启用了自动加密的实例来执行自动解密。

要了解有关使用自动解密的显式加密的更多信息,请参阅“基础知识”部分。

6

按如下方式实例化一个ClientEncryption对象:

5

使用已启用 Queryable Encryption 的实例MongoClient,通过以下代码段将加密文档插入到命名空间medicalRecords.patients中:

插入文档时,启用了 Queryable Encryption 的客户端会对文档的字段进行加密,如下所示:

{
"_id": {
"$oid": "6303e36053cc7ec2e6a630bd"
},
"firstName": "Jon",
"patientId": {
"$binary": {
"base64": "BxLJUBmg703civqMz8ASsD4QEYeSneOGiiYHfLE77ELEkp1EC/fXPrKCNRQl2mAFddszqDJ0P3znKrq0DVMEvJoU6wa0Ra+U+JjNVr8NtJE+TpTLCannY5Av6iGfLAaiHbM/E8Ftz1YCQsArQwuNp3wIV/GJPLa2662xsyk0wz7F6IRGC3FlnxpN4UIFaHE1M7Y6kEnx3tEy5uJBvU4Sex7I2H0kqHthClH77Q6xHIHc8H9d6upvgnEbkKBCnmc24A2pSG/xZ7LBsV3j5aOboPISuN/lvg==",
"subType": "06"
}
},
"medications": {
"$binary": {
"base64": "BvOsveapfUxiuQxCMSM2fYIEyRlQaSqR+0NxlMarwurBflvoMz1FrSjSGgCVCpK8X+YrilP6Bac99kkaUmRJfjo4savxcjpOfEnUj5bHciPyfQBYmYF4PMLDtTTzGZpPilb9d5KgpIMBXxHi+dIcog==",
"subType": "06"
}
},
"__safeContent__": [
{
"$binary": {
"base64": "ZLPIpgxzXpHUGrvdIHetwmMagR+mqvuUj5nzXNGf/WM=",
"subType": "00"
}
}
]
}

警告

请勿修改 __safeContent__ 字段

__safeContent__字段对于 Queryable Encryption 至关重要。请勿修改此字段的内容。

提示

请参阅:完整代码

6

通过对加密字段进行查询,检索在本指南的“插入具有加密字段的文档”步骤中插入的加密文档:

上述代码片段的输出应包含以下文档:

{
"__safeContent__": [
{
"Subtype": 0,
"Data": "LfaIuWm9o30MIGrK7GGUoStJMSNOjRgbxy5q2TPiDes="
}
],
"_id": "6303a770857952ca5e363fd2",
"firstName": "Jon",
"medications": ["Atorvastatin", "Levothyroxine"],
"patientId": 12345678
}

提示

请参阅:完整代码

要查看有关将 Queryable Encryption 与远程 KMS 结合使用的教程,请参阅教程。

要了解Queryable Encryption的工作原理,请参阅显式加密。

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

← 将自动可查询加密与 KMIP 结合使用
参考 →