文档菜单
文档首页
/
MongoDB 手册
/ / / / / /

创建您的可查询加密应用程序

本页内容

  • 概述
  • 开始之前
  • 步骤
  • 下一步

本指南向您展示如何构建一个实现可查询加密的应用程序,以自动加密和解密文档字段。

完成本指南中的步骤后,您应该拥有一个可工作的客户端应用程序,该应用程序可以插入使用您的客户主密钥加密的字段。

在创建应用程序之前,请确保已完成以下先决任务

  1. 安装可查询加密兼容的驱动程序和依赖项

  2. 安装和配置可查询加密库

  3. 创建客户主密钥

要查看示例应用程序的完整代码,请选择编程语言选择器中的编程语言。

完整的 mongosh 应用程序

每个示例应用程序仓库都包含一个README.md 文件,您可以使用该文件了解如何设置环境并运行应用程序。

在以下选项卡中选择您的密钥提供程序。

1

本教程中的代码示例使用以下变量执行可查询加密工作流程

  • kmsProviderName - 存储您的客户主密钥的KMS。将其设置为您的密钥提供程序:"aws""azure""gcp""kmip"

  • uri - 您的MongoDB部署连接URI。在 MONGODB_URI 环境变量中设置您的连接URI或直接替换值。

  • keyVaultDatabaseName - 存储您的数据加密密钥(DEK)的MongoDB数据库。将其设置为 "encryption"

  • keyVaultCollectionName - 存储您的DEK的MongoDB集合。将其设置为 "__keyVault"

  • keyVaultNamespace - 存储您的DEK的MongoDB命名空间。将其设置为 keyVaultDatabaseNamekeyVaultCollectionName 变量的值,用句点分隔。

  • encryptedDatabaseName - 存储您的加密数据的MongoDB数据库。将其设置为 "medicalRecords"

  • encryptedCollectionName - 存储您的加密数据的MongoDB集合。将其设置为 "patients"

您可以使用以下代码声明这些变量

// KMS provider name should be one of the following: "aws", "gcp", "azure", "kmip" or "local"
const kmsProviderName = "<Your KMS Provider Name>";
const uri = process.env.MONGODB_URI; // Your connection URI
const keyVaultDatabaseName = "encryption";
const keyVaultCollectionName = "__keyVault";
const keyVaultNamespace = `${keyVaultDatabaseName}.${keyVaultCollectionName}`;
const encryptedDatabaseName = "medicalRecords";
const encryptedCollectionName = "patients";
  • kmsProviderName - 存储您的客户主密钥的KMS。将其设置为您的密钥提供程序:"aws""azure""gcp""kmip"

  • keyVaultDatabaseName - 存储您的数据加密密钥(DEK)的MongoDB数据库。将 keyVaultDatabaseName 设置为 "encryption"

  • keyVaultCollectionName - 存储您的DEK的MongoDB集合。将 keyVaultCollectionName 设置为 "__keyVault"

  • keyVaultNamespace - 存储您的DEK的MongoDB命名空间。将 keyVaultNamespace 设置为一个新的 CollectionNamespace 对象的值,其名称是 keyVaultDatabaseNamekeyVaultCollectionName 变量的值,用句点分隔。

  • 加密数据库名称 - 用于存储加密数据的MongoDB数据库。将encryptedDatabaseName设置为"medicalRecords"

  • 加密集合名称 - 在MongoDB中存储加密数据的集合。将encryptedCollectionName设置为"patients"

  • uri - 您的MongoDB部署连接URI。在appsettings.json文件中设置您的连接URI或直接替换值。

您可以使用以下代码声明这些变量

// KMS provider name should be one of the following: "aws", "gcp", "azure", "kmip" or "local"
const string kmsProviderName = "<your KMS provider name>";
const string keyVaultDatabaseName = "encryption";
const string keyVaultCollectionName = "__keyVault";
var keyVaultNamespace =
CollectionNamespace.FromFullName($"{keyVaultDatabaseName}.{keyVaultCollectionName}");
const string encryptedDatabaseName = "medicalRecords";
const string encryptedCollectionName = "patients";
var appSettings = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build();
var uri = appSettings["MongoDbUri"];
  • kmsProviderName - 存储您的客户主密钥的KMS。将其设置为您的密钥提供程序:"aws""azure""gcp""kmip"

  • uri - 您的MongoDB部署连接URI。在 MONGODB_URI 环境变量中设置您的连接URI或直接替换值。

  • keyVaultDatabaseName - 存储您的数据加密密钥(DEK)的MongoDB数据库。将其设置为 "encryption"

  • keyVaultCollectionName - 存储您的DEK的MongoDB集合。将其设置为 "__keyVault"

  • keyVaultNamespace - 存储您的DEK的MongoDB命名空间。将其设置为 keyVaultDatabaseNamekeyVaultCollectionName 变量的值,用句点分隔。

  • encryptedDatabaseName - 存储您的加密数据的MongoDB数据库。将其设置为 "medicalRecords"

  • encryptedCollectionName - 存储您的加密数据的MongoDB集合。将其设置为 "patients"

您可以使用以下代码声明这些变量

// KMS provider name should be one of the following: "aws", "gcp", "azure", "kmip" or "local"
kmsProviderName := "<KMS provider name>"
uri := os.Getenv("MONGODB_URI") // Your connection URI
keyVaultDatabaseName := "encryption"
keyVaultCollectionName := "__keyVault"
keyVaultNamespace := keyVaultDatabaseName + "." + keyVaultCollectionName
encryptedDatabaseName := "medicalRecords"
encryptedCollectionName := "patients"
  • kmsProviderName - 存储您的客户主密钥的KMS。将其设置为您的密钥提供程序:"aws""azure""gcp""kmip"

  • uri - 您的MongoDB部署连接URI。在 MONGODB_URI 环境变量中设置您的连接URI或直接替换值。

  • keyVaultDatabaseName - 存储您的数据加密密钥(DEK)的MongoDB数据库。将其设置为 "encryption"

  • keyVaultCollectionName - 存储您的DEK的MongoDB集合。将其设置为 "__keyVault"

  • keyVaultNamespace - 存储您的DEK的MongoDB命名空间。将其设置为 keyVaultDatabaseNamekeyVaultCollectionName 变量的值,用句点分隔。

  • encryptedDatabaseName - 存储您的加密数据的MongoDB数据库。将其设置为 "medicalRecords"

  • encryptedCollectionName - 存储您的加密数据的MongoDB集合。将其设置为 "patients"

您可以使用以下代码声明这些变量

// KMS provider name should be one of the following: "aws", "gcp", "azure", "kmip" or "local"
String kmsProviderName = "<KMS provider name>";
String uri = QueryableEncryptionHelpers.getEnv("MONGODB_URI"); // Your connection URI
String keyVaultDatabaseName = "encryption";
String keyVaultCollectionName = "__keyVault";
String keyVaultNamespace = keyVaultDatabaseName + "." + keyVaultCollectionName;
String encryptedDatabaseName = "medicalRecords";
String encryptedCollectionName = "patients";
  • kmsProviderName - 存储您的客户主密钥的KMS。将其设置为您的密钥提供程序:"aws""azure""gcp""kmip"

  • uri - 您的MongoDB部署连接URI。在 MONGODB_URI 环境变量中设置您的连接URI或直接替换值。

  • keyVaultDatabaseName - 存储您的数据加密密钥(DEK)的MongoDB数据库。将其设置为 "encryption"

  • keyVaultCollectionName - 存储您的DEK的MongoDB集合。将其设置为 "__keyVault"

  • keyVaultNamespace - 存储您的DEK的MongoDB命名空间。将其设置为 keyVaultDatabaseNamekeyVaultCollectionName 变量的值,用句点分隔。

  • encryptedDatabaseName - 存储您的加密数据的MongoDB数据库。将其设置为 "medicalRecords"

  • encryptedCollectionName - 存储您的加密数据的MongoDB集合。将其设置为 "patients"

您可以使用以下代码声明这些变量

// KMS provider name should be one of the following: "aws", "gcp", "azure", "kmip" or "local"
const kmsProviderName = "<Your KMS Provider Name>";
const uri = process.env.MONGODB_URI; // Your connection URI
const keyVaultDatabaseName = "encryption";
const keyVaultCollectionName = "__keyVault";
const keyVaultNamespace = `${keyVaultDatabaseName}.${keyVaultCollectionName}`;
const encryptedDatabaseName = "medicalRecords";
const encryptedCollectionName = "patients";
  • kms_provider_name - 您用于存储客户主密钥(CMK)的KMS。将其设置为您的密钥提供程序:"aws""azure""gcp""kmip"

  • uri - 您的MongoDB部署连接URI。在 MONGODB_URI 环境变量中设置您的连接URI或直接替换值。

  • key_vault_database_name - 存储您的数据加密密钥(DEK)的MongoDB数据库。将其设置为"encryption"

  • key_vault_collection_name - 存储您的DEK的MongoDB集合。将其设置为"__keyVault"

  • key_vault_namespace - 存储您的DEK的MongoDB命名空间。将其设置为key_vault_database_namekey_vault_collection_name变量值的组合,由点分隔。

  • encrypted_database_name - 存储加密数据的MongoDB数据库。将其设置为"medicalRecords"

  • encrypted_collection_name - 存储加密数据的MongoDB集合。将其设置为"patients"

您可以使用以下代码声明这些变量

# KMS provider name should be one of the following: "aws", "gcp", "azure", "kmip" or "local"
kms_provider_name = "<KMS provider name>"
uri = os.environ['MONGODB_URI'] # Your connection URI
key_vault_database_name = "encryption"
key_vault_collection_name = "__keyVault"
key_vault_namespace = f"{key_vault_database_name}.{key_vault_collection_name}"
encrypted_database_name = "medicalRecords"
encrypted_collection_name = "patients"

重要

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

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

提示

环境变量

本教程中的示例代码引用了您需要设置的环境变量。或者,您可以直接在代码中替换这些值。

有关如何设置这些环境变量的说明,请参阅GitHub上示例应用程序中包含的README.md文件。

提示

环境变量

本教程中的示例代码引用了您需要设置的环境变量。或者,您可以直接在代码中替换这些值。

了解如何设置这些环境变量,请参阅GitHub上示例应用程序中包含的README.md文件。

提示

环境变量

本教程中的示例代码引用了您需要设置的环境变量。或者,您可以直接在代码中替换这些值。

了解如何设置这些环境变量,请参阅GitHub上示例应用程序中包含的README.md文件。

提示

环境变量

本教程中的示例代码引用了您需要设置的环境变量。或者,您可以直接在代码中替换这些值。

了解如何设置这些环境变量,请参阅GitHub上示例应用程序中包含的README.md文件。

提示

环境变量

本教程中的示例代码引用了您需要设置的环境变量。或者,您可以直接在代码中替换这些值。

有关如何设置这些环境变量的说明,请参阅GitHub上示例应用程序中包含的README.md文件。

提示

环境变量

本教程中的示例代码引用了您需要设置的环境变量。或者,您可以直接在代码中替换这些值。

要了解如何设置这些环境变量,请参阅GitHub上示例应用程序中包含的 README.md 文件。

2

创建一个包含您的KMS凭据的变量,其结构如下。使用您在步骤2.2中创建AWS IAM用户时使用的访问密钥ID和秘密访问密钥。

kmsProviderCredentials = {
aws: {
accessKeyId: process.env["AWS_ACCESS_KEY_ID"], // Your AWS access key ID
secretAccessKey: process.env["AWS_SECRET_ACCESS_KEY"], // Your AWS secret access key
},
};
var kmsProviderCredentials = new Dictionary<string, IReadOnlyDictionary<string, object>>();
var kmsOptions = new Dictionary<string, object>
{
{ "accessKeyId", _appSettings["Aws:AccessKeyId"] }, // Your AWS access key ID
{ "secretAccessKey", _appSettings["Aws:SecretAccessKey"] } // Your AWS secret access key
};
kmsProviderCredentials.Add("aws", kmsOptions);
kmsProviderCredentials := map[string]map[string]interface{}{
"aws": {
"accessKeyId": os.Getenv("AWS_ACCESS_KEY_ID"), // AWS access key ID
"secretAccessKey": os.Getenv("AWS_SECRET_ACCESS_KEY"), // AWS secret access key
},
}
Map<String, Object> kmsProviderDetails = new HashMap<>();
kmsProviderDetails.put("accessKeyId", getEnv("AWS_ACCESS_KEY_ID")); // Your AWS access key ID
kmsProviderDetails.put("secretAccessKey", getEnv("AWS_SECRET_ACCESS_KEY")); // Your AWS secret access key
Map<String, Map<String, Object>> kmsProviderCredentials = new HashMap<String, Map<String, Object>>();
kmsProviderCredentials.put("aws", kmsProviderDetails);
kmsProviders = {
aws: {
accessKeyId: process.env.AWS_ACCESS_KEY_ID, // Your AWS access key ID
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY, // Your AWS secret access key
},
};
kms_provider_credentials = {
"aws": {
"accessKeyId": os.environ['AWS_ACCESS_KEY_ID'], # Your AWS access key ID
"secretAccessKey": os.environ['AWS_SECRET_ACCESS_KEY'] # Your AWS secret access key
}
}

重要

提醒:在生产环境中使用IAM角色进行身份验证

要使用IAM角色而不是IAM用户来对您的应用程序进行身份验证,请指定一个空对象作为您的凭据在KMS提供者对象中。这指示驱动程序自动从环境中检索凭据IAM角色而不是IAM用户来对您的应用程序进行身份验证,请在您的KMS提供者对象中的凭据指定一个空对象。这指示驱动程序自动从环境中检索凭据

kmsProviders = {
aws: { }
};
kmsProviderCredentials.Add("aws", new Dictionary<string, object>);
kmsProviderCredentials := map[string]map[string]interface{}{
"aws": { },
}
kmsProviderCredentials.put("aws", new HashMap<>());
kmsProviders = {
aws: { }
};
kms_provider_credentials = {
"aws": { }
}
3

创建一个包含您的客户主密钥(CMK)凭据的变量,其结构如下。使用您在步骤1.3中创建CMK时记录的ARN和区域。

customerMasterKeyCredentials = {
key: process.env["AWS_KEY_ARN"], // Your AWS Key ARN
region: process.env["AWS_KEY_REGION"], // Your AWS Key Region
};
var customerMasterKeyCredentials = new BsonDocument
{
{ "key", _appSettings["Aws:KeyArn"] }, // Your AWS Key ARN
{ "region", _appSettings["Aws:KeyRegion"] } // Your AWS Key Region
};
customerMasterKeyCredentials := map[string]string{
"key": os.Getenv("AWS_KEY_ARN"), // Your AWS Key ARN
"region": os.Getenv("AWS_KEY_REGION"), // Your AWS Key Region
}
BsonDocument customerMasterKeyCredentials = new BsonDocument();
customerMasterKeyCredentials.put("provider", new BsonString(kmsProviderName));
customerMasterKeyCredentials.put("key", new BsonString(getEnv("AWS_KEY_ARN"))); // Your AWS Key ARN
customerMasterKeyCredentials.put("region", new BsonString(getEnv("AWS_KEY_REGION"))); // Your AWS Key Region
customerMasterKeyCredentials = {
key: process.env.AWS_KEY_ARN, // Your AWS Key ARN
region: process.env.AWS_KEY_REGION, // Your AWS Key Region
};
customer_master_key_credentials = {
"key": os.environ['AWS_KEY_ARN'], # Your AWS Key ARN
"region": os.environ['AWS_KEY_REGION'] # Your AWS Key Region
}
4

注意

自动加密选项

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

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

创建一个具有以下选项的autoEncryptionOptions对象

  • 您的密钥库集合的命名空间

  • 包含您的AWS KMS凭据的kmsProviderCredentials对象

const autoEncryptionOptions = {
keyVaultNamespace: keyVaultNamespace,
kmsProviders: kmsProviderCredentials,
};

创建一个具有以下选项的AutoEncryptionOptions对象

  • 您的密钥库集合的命名空间

  • 包含您的AWS KMS凭据的kmsProviderCredentials对象

  • 包含您的自动加密共享库路径的extraOptions对象

var extraOptions = new Dictionary<string, object>
{
{ "cryptSharedLibPath", _appSettings["CryptSharedLibPath"] } // Path to your Automatic Encryption Shared Library
};
var autoEncryptionOptions = new AutoEncryptionOptions(
keyVaultNamespace,
kmsProviderCredentials,
extraOptions: extraOptions);

创建一个具有以下选项的AutoEncryption对象

  • 您的密钥库集合的命名空间

  • 包含您的AWS KMS凭据的kmsProviderCredentials对象

  • 包含您的自动加密共享库路径的cryptSharedLibraryPath对象

cryptSharedLibraryPath := map[string]interface{}{
"cryptSharedLibPath": os.Getenv("SHARED_LIB_PATH"), // Path to your Automatic Encryption Shared Library
}
autoEncryptionOptions := options.AutoEncryption().
SetKeyVaultNamespace(keyVaultNamespace).
SetKmsProviders(kmsProviderCredentials).
SetExtraOptions(cryptSharedLibraryPath)

创建一个具有以下选项的AutoEncryptionSettings对象

  • 您的密钥库集合的命名空间

  • 包含您的AWS KMS凭据的kmsProviderCredentials对象

  • 包含您的自动加密共享库路径的extraOptions对象

Map<String, Object> extraOptions = new HashMap<String, Object>();
extraOptions.put("cryptSharedLibPath", getEnv("SHARED_LIB_PATH")); // Path to your Automatic Encryption Shared Library
AutoEncryptionSettings autoEncryptionSettings = AutoEncryptionSettings.builder()
.keyVaultNamespace(keyVaultNamespace)
.kmsProviders(kmsProviderCredentials)
.extraOptions(extraOptions)
.build();

创建一个具有以下选项的autoEncryptionOptions对象

  • 您的密钥库集合的命名空间

  • 包含您的AWS KMS凭据的kmsProviders对象

  • 包含您的自动加密共享库路径的sharedLibraryPathOptions对象

const extraOptions = {
cryptSharedLibPath: process.env.SHARED_LIB_PATH, // Path to your Automatic Encryption Shared Library
};
const autoEncryptionOptions = {
keyVaultNamespace,
kmsProviders,
extraOptions,
};

创建一个具有以下选项的AutoEncryptionOpts对象

  • 包含您的AWS KMS凭据的kms_provider_credentials对象

  • 您的密钥库集合的命名空间

  • 您的自动加密共享库的路径

auto_encryption_options = AutoEncryptionOpts(
kms_provider_credentials,
key_vault_namespace,
crypt_shared_lib_path=os.environ['SHARED_LIB_PATH'] # Path to your Automatic Encryption Shared Library>
)
5

要创建一个用于在您的集合中加密和解密数据的客户端,请使用您的连接URI和自动加密选项实例化一个新的MongoClient

const encryptedClient = Mongo(uri, autoEncryptionOptions);

重要:如果您使用的是.NET/C#驱动程序3.0或更高版本,在实例化新的MongoClient之前,您必须将以下代码添加到您的应用程序中

MongoClientSettings.Extensions.AddAutoEncryption(); // .NET/C# Driver v3.0 or later only

使用您的连接URI和自动加密选项实例化一个新的MongoClient

var clientSettings = MongoClientSettings.FromConnectionString(uri);
clientSettings.AutoEncryptionOptions = qeHelpers.GetAutoEncryptionOptions(
keyVaultNamespace,
kmsProviderCredentials);
var encryptedClient = new MongoClient(clientSettings);
encryptedClient, err := mongo.Connect(
context.TODO(),
options.Client().ApplyURI(uri).SetAutoEncryptionOptions(autoEncryptionOptions),
)
if err != nil {
panic(fmt.Sprintf("Unable to connect to MongoDB: %v\n", err))
}
defer func() {
_ = encryptedClient.Disconnect(context.TODO())
}()
MongoClientSettings clientSettings = MongoClientSettings.builder()
.applyConnectionString(new ConnectionString(uri))
.autoEncryptionSettings(autoEncryptionSettings)
.build();
try (MongoClient encryptedClient = MongoClients.create(clientSettings)) {
const encryptedClient = new MongoClient(uri, {
autoEncryption: autoEncryptionOptions,
});
encrypted_client = MongoClient(
uri, auto_encryption_opts=auto_encryption_options)
1

本教程中的代码示例使用以下变量执行可查询加密工作流程

  • kmsProviderName - 存储您的客户主密钥的KMS。将其设置为您的密钥提供程序:"aws""azure""gcp""kmip"

  • uri - 您的MongoDB部署连接URI。在 MONGODB_URI 环境变量中设置您的连接URI或直接替换值。

  • keyVaultDatabaseName - 存储您的数据加密密钥(DEK)的MongoDB数据库。将其设置为 "encryption"

  • keyVaultCollectionName - 存储您的DEK的MongoDB集合。将其设置为 "__keyVault"

  • keyVaultNamespace - 存储您的DEK的MongoDB命名空间。将其设置为 keyVaultDatabaseNamekeyVaultCollectionName 变量的值,用句点分隔。

  • encryptedDatabaseName - 存储您的加密数据的MongoDB数据库。将其设置为 "medicalRecords"

  • encryptedCollectionName - 存储您的加密数据的MongoDB集合。将其设置为 "patients"

您可以使用以下代码声明这些变量

// KMS provider name should be one of the following: "aws", "gcp", "azure", "kmip" or "local"
const kmsProviderName = "<Your KMS Provider Name>";
const uri = process.env.MONGODB_URI; // Your connection URI
const keyVaultDatabaseName = "encryption";
const keyVaultCollectionName = "__keyVault";
const keyVaultNamespace = `${keyVaultDatabaseName}.${keyVaultCollectionName}`;
const encryptedDatabaseName = "medicalRecords";
const encryptedCollectionName = "patients";
  • kmsProviderName - 存储您的客户主密钥的KMS。将其设置为您的密钥提供程序:"aws""azure""gcp""kmip"

  • keyVaultDatabaseName - 存储您的数据加密密钥(DEK)的MongoDB数据库。将 keyVaultDatabaseName 设置为 "encryption"

  • keyVaultCollectionName - 存储您的DEK的MongoDB集合。将 keyVaultCollectionName 设置为 "__keyVault"

  • keyVaultNamespace - 存储您的DEK的MongoDB命名空间。将 keyVaultNamespace 设置为一个新的 CollectionNamespace 对象的值,其名称是 keyVaultDatabaseNamekeyVaultCollectionName 变量的值,用句点分隔。

  • 加密数据库名称 - 用于存储加密数据的MongoDB数据库。将encryptedDatabaseName设置为"medicalRecords"

  • 加密集合名称 - 在MongoDB中存储加密数据的集合。将encryptedCollectionName设置为"patients"

  • uri - 您的MongoDB部署连接URI。在appsettings.json文件中设置您的连接URI或直接替换值。

您可以使用以下代码声明这些变量

// KMS provider name should be one of the following: "aws", "gcp", "azure", "kmip" or "local"
const string kmsProviderName = "<your KMS provider name>";
const string keyVaultDatabaseName = "encryption";
const string keyVaultCollectionName = "__keyVault";
var keyVaultNamespace =
CollectionNamespace.FromFullName($"{keyVaultDatabaseName}.{keyVaultCollectionName}");
const string encryptedDatabaseName = "medicalRecords";
const string encryptedCollectionName = "patients";
var appSettings = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build();
var uri = appSettings["MongoDbUri"];
  • kmsProviderName - 存储您的客户主密钥的KMS。将其设置为您的密钥提供程序:"aws""azure""gcp""kmip"

  • uri - 您的MongoDB部署连接URI。在 MONGODB_URI 环境变量中设置您的连接URI或直接替换值。

  • keyVaultDatabaseName - 存储您的数据加密密钥(DEK)的MongoDB数据库。将其设置为 "encryption"

  • keyVaultCollectionName - 存储您的DEK的MongoDB集合。将其设置为 "__keyVault"

  • keyVaultNamespace - 存储您的DEK的MongoDB命名空间。将其设置为 keyVaultDatabaseNamekeyVaultCollectionName 变量的值,用句点分隔。

  • encryptedDatabaseName - 存储您的加密数据的MongoDB数据库。将其设置为 "medicalRecords"

  • encryptedCollectionName - 存储您的加密数据的MongoDB集合。将其设置为 "patients"

您可以使用以下代码声明这些变量

// KMS provider name should be one of the following: "aws", "gcp", "azure", "kmip" or "local"
kmsProviderName := "<KMS provider name>"
uri := os.Getenv("MONGODB_URI") // Your connection URI
keyVaultDatabaseName := "encryption"
keyVaultCollectionName := "__keyVault"
keyVaultNamespace := keyVaultDatabaseName + "." + keyVaultCollectionName
encryptedDatabaseName := "medicalRecords"
encryptedCollectionName := "patients"
  • kmsProviderName - 存储您的客户主密钥的KMS。将其设置为您的密钥提供程序:"aws""azure""gcp""kmip"

  • uri - 您的MongoDB部署连接URI。在 MONGODB_URI 环境变量中设置您的连接URI或直接替换值。

  • keyVaultDatabaseName - 存储您的数据加密密钥(DEK)的MongoDB数据库。将其设置为 "encryption"

  • keyVaultCollectionName - 存储您的DEK的MongoDB集合。将其设置为 "__keyVault"

  • keyVaultNamespace - 存储您的DEK的MongoDB命名空间。将其设置为 keyVaultDatabaseNamekeyVaultCollectionName 变量的值,用句点分隔。

  • encryptedDatabaseName - 存储您的加密数据的MongoDB数据库。将其设置为 "medicalRecords"

  • encryptedCollectionName - 存储您的加密数据的MongoDB集合。将其设置为 "patients"

您可以使用以下代码声明这些变量

// KMS provider name should be one of the following: "aws", "gcp", "azure", "kmip" or "local"
String kmsProviderName = "<KMS provider name>";
String uri = QueryableEncryptionHelpers.getEnv("MONGODB_URI"); // Your connection URI
String keyVaultDatabaseName = "encryption";
String keyVaultCollectionName = "__keyVault";
String keyVaultNamespace = keyVaultDatabaseName + "." + keyVaultCollectionName;
String encryptedDatabaseName = "medicalRecords";
String encryptedCollectionName = "patients";
  • kmsProviderName - 存储您的客户主密钥的KMS。将其设置为您的密钥提供程序:"aws""azure""gcp""kmip"

  • uri - 您的MongoDB部署连接URI。在 MONGODB_URI 环境变量中设置您的连接URI或直接替换值。

  • keyVaultDatabaseName - 存储您的数据加密密钥(DEK)的MongoDB数据库。将其设置为 "encryption"

  • keyVaultCollectionName - 存储您的DEK的MongoDB集合。将其设置为 "__keyVault"

  • keyVaultNamespace - 存储您的DEK的MongoDB命名空间。将其设置为 keyVaultDatabaseNamekeyVaultCollectionName 变量的值,用句点分隔。

  • encryptedDatabaseName - 存储您的加密数据的MongoDB数据库。将其设置为 "medicalRecords"

  • encryptedCollectionName - 存储您的加密数据的MongoDB集合。将其设置为 "patients"

您可以使用以下代码声明这些变量

// KMS provider name should be one of the following: "aws", "gcp", "azure", "kmip" or "local"
const kmsProviderName = "<Your KMS Provider Name>";
const uri = process.env.MONGODB_URI; // Your connection URI
const keyVaultDatabaseName = "encryption";
const keyVaultCollectionName = "__keyVault";
const keyVaultNamespace = `${keyVaultDatabaseName}.${keyVaultCollectionName}`;
const encryptedDatabaseName = "medicalRecords";
const encryptedCollectionName = "patients";
  • kms_provider_name - 您用于存储客户主密钥(CMK)的KMS。将其设置为您的密钥提供程序:"aws""azure""gcp""kmip"

  • uri - 您的MongoDB部署连接URI。在 MONGODB_URI 环境变量中设置您的连接URI或直接替换值。

  • key_vault_database_name - 存储您的数据加密密钥(DEK)的MongoDB数据库。将其设置为"encryption"

  • key_vault_collection_name - 存储您的DEK的MongoDB集合。将其设置为"__keyVault"

  • key_vault_namespace - 存储您的DEK的MongoDB命名空间。将其设置为key_vault_database_namekey_vault_collection_name变量值的组合,由点分隔。

  • encrypted_database_name - 存储加密数据的MongoDB数据库。将其设置为"medicalRecords"

  • encrypted_collection_name - 存储加密数据的MongoDB集合。将其设置为"patients"

您可以使用以下代码声明这些变量

# KMS provider name should be one of the following: "aws", "gcp", "azure", "kmip" or "local"
kms_provider_name = "<KMS provider name>"
uri = os.environ['MONGODB_URI'] # Your connection URI
key_vault_database_name = "encryption"
key_vault_collection_name = "__keyVault"
key_vault_namespace = f"{key_vault_database_name}.{key_vault_collection_name}"
encrypted_database_name = "medicalRecords"
encrypted_collection_name = "patients"

重要

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

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

提示

环境变量

本教程中的示例代码引用了您需要设置的环境变量。或者,您可以直接在代码中替换这些值。

有关如何设置这些环境变量的说明,请参阅GitHub上示例应用程序中包含的README.md文件。

提示

环境变量

本教程中的示例代码引用了您需要设置的环境变量。或者,您可以直接在代码中替换这些值。

了解如何设置这些环境变量,请参阅GitHub上示例应用程序中包含的README.md文件。

提示

环境变量

本教程中的示例代码引用了您需要设置的环境变量。或者,您可以直接在代码中替换这些值。

了解如何设置这些环境变量,请参阅GitHub上示例应用程序中包含的README.md文件。

提示

环境变量

本教程中的示例代码引用了您需要设置的环境变量。或者,您可以直接在代码中替换这些值。

了解如何设置这些环境变量,请参阅GitHub上示例应用程序中包含的README.md文件。

提示

环境变量

本教程中的示例代码引用了您需要设置的环境变量。或者,您可以直接在代码中替换这些值。

有关如何设置这些环境变量的说明,请参阅GitHub上示例应用程序中包含的README.md文件。

提示

环境变量

本教程中的示例代码引用了您需要设置的环境变量。或者,您可以直接在代码中替换这些值。

要了解如何设置这些环境变量,请参阅GitHub上示例应用程序中包含的 README.md 文件。

2

创建一个包含您的KMS凭据的变量,其结构如下。使用您在将应用程序注册到Azure时记录的Azure密钥保管库凭据。

kmsProviderCredentials = {
azure: {
tenantId: process.env["AZURE_TENANT_ID"], // Your Azure tenant ID
clientId: process.env["AZURE_CLIENT_ID"], // Your Azure client ID
clientSecret: process.env["AZURE_CLIENT_SECRET"], // Your Azure client secret
},
};
var kmsProviderCredentials = new Dictionary<string, IReadOnlyDictionary<string, object>>();
var kmsOptions = new Dictionary<string, object>
{
{ "tenantId", _appSettings["Azure:TenantId"] }, // Your Azure tenant ID
{ "clientId", _appSettings["Azure:ClientId"] }, // Your Azure client ID
{ "clientSecret", _appSettings["Azure:ClientSecret"] } // Your Azure client secret
};
kmsProviderCredentials.Add("azure", kmsOptions);
kmsProviderCredentials := map[string]map[string]interface{}{
"azure": {
"tenantId": os.Getenv("AZURE_TENANT_ID"), // Azure tenant ID
"clientId": os.Getenv("AZURE_CLIENT_ID"), // Azure client ID
"clientSecret": os.Getenv("AZURE_CLIENT_SECRET"), // Azure client secret
},
}
Map<String, Object> kmsProviderDetails = new HashMap<>();
kmsProviderDetails.put("tenantId", getEnv("AZURE_TENANT_ID")); // Your Azure tenant ID
kmsProviderDetails.put("clientId", getEnv("AZURE_CLIENT_ID")); // Your Azure client ID
kmsProviderDetails.put("clientSecret", getEnv("AZURE_CLIENT_SECRET")); // Your Azure client secret
Map<String, Map<String, Object>> kmsProviderCredentials = new HashMap<String, Map<String, Object>>();
kmsProviderCredentials.put("azure", kmsProviderDetails);
kmsProviders = {
azure: {
tenantId: process.env.AZURE_TENANT_ID, // Your Azure tenant ID
clientId: process.env.AZURE_CLIENT_ID, // Your Azure client ID
clientSecret: process.env.AZURE_CLIENT_SECRET, // Your Azure client secret
},
};
kms_provider_credentials = {
"azure": {
"tenantId": os.environ['AZURE_TENANT_ID'], # Your Azure tenant ID
"clientId": os.environ['AZURE_CLIENT_ID'], # Your Azure client ID
"clientSecret": os.environ['AZURE_CLIENT_SECRET'] # Your Azure client secret
}
}
3

创建一个包含您的客户主密钥凭据的变量,其结构如下。使用您在创建CMK时记录的CMK详细信息。

customerMasterKeyCredentials = {
keyVaultEndpoint: process.env["AZURE_KEY_VAULT_ENDPOINT"], // Your Azure Key Vault Endpoint
keyName: process.env["AZURE_KEY_NAME"], // Your Azure Key Name
};
var customerMasterKeyCredentials = new BsonDocument
{
{ "keyVaultEndpoint", _appSettings["Azure:KeyVaultEndpoint"] }, // Your Azure Key Vault Endpoint
{ "keyName", _appSettings["Azure:KeyName"] } // Your Azure Key Name
};
customerMasterKeyCredentials := map[string]string{
"keyVaultEndpoint": os.Getenv("AZURE_KEY_VAULT_ENDPOINT"), // Your Azure Key Vault Endpoint
"keyName": os.Getenv("AZURE_KEY_NAME"), // Your Azure Key Name
}
BsonDocument customerMasterKeyCredentials = new BsonDocument();
customerMasterKeyCredentials.put("provider", new BsonString(kmsProviderName));
customerMasterKeyCredentials.put("keyName", new BsonString(getEnv("AZURE_KEY_NAME"))); // Your Azure Key Vault Endpoint
customerMasterKeyCredentials.put("keyVaultEndpoint", new BsonString(getEnv("AZURE_KEY_VAULT_ENDPOINT"))); // Your Azure Key Name
customerMasterKeyCredentials = {
keyVaultEndpoint: process.env.AZURE_KEY_VAULT_ENDPOINT, // Your Azure Key Vault Endpoint
keyName: process.env.AZURE_KEY_NAME, // Your Azure Key Name
};
customer_master_key_credentials = {
"keyName": os.environ['AZURE_KEY_NAME'], # Your Azure key name
"keyVaultEndpoint": os.environ['AZURE_KEY_VAULT_ENDPOINT'] # Your Azure key vault endpoint
}
4

要创建一个用于加密和解密加密集合中数据的客户端,请使用您的连接 URI 和自动加密选项实例化一个新的 MongoClient

const encryptedClient = Mongo(uri, autoEncryptionOptions);

重要:如果您使用的是.NET/C#驱动程序3.0或更高版本,在实例化新的MongoClient之前,您必须将以下代码添加到您的应用程序中

MongoClientSettings.Extensions.AddAutoEncryption(); // .NET/C# Driver v3.0 or later only

使用您的连接URI和自动加密选项实例化一个新的MongoClient

var clientSettings = MongoClientSettings.FromConnectionString(uri);
clientSettings.AutoEncryptionOptions = qeHelpers.GetAutoEncryptionOptions(
keyVaultNamespace,
kmsProviderCredentials);
var encryptedClient = new MongoClient(clientSettings);
encryptedClient, err := mongo.Connect(
context.TODO(),
options.Client().ApplyURI(uri).SetAutoEncryptionOptions(autoEncryptionOptions),
)
if err != nil {
panic(fmt.Sprintf("Unable to connect to MongoDB: %v\n", err))
}
defer func() {
_ = encryptedClient.Disconnect(context.TODO())
}()
MongoClientSettings clientSettings = MongoClientSettings.builder()
.applyConnectionString(new ConnectionString(uri))
.autoEncryptionSettings(autoEncryptionSettings)
.build();
try (MongoClient encryptedClient = MongoClients.create(clientSettings)) {
const encryptedClient = new MongoClient(uri, {
autoEncryption: autoEncryptionOptions,
});
encrypted_client = MongoClient(
uri, auto_encryption_opts=auto_encryption_options)
1

本教程中的代码示例使用以下变量执行可查询加密工作流程

  • kmsProviderName - 存储您的客户主密钥的KMS。将其设置为您的密钥提供程序:"aws""azure""gcp""kmip"

  • uri - 您的MongoDB部署连接URI。在 MONGODB_URI 环境变量中设置您的连接URI或直接替换值。

  • keyVaultDatabaseName - 存储您的数据加密密钥(DEK)的MongoDB数据库。将其设置为 "encryption"

  • keyVaultCollectionName - 存储您的DEK的MongoDB集合。将其设置为 "__keyVault"

  • keyVaultNamespace - 存储您的DEK的MongoDB命名空间。将其设置为 keyVaultDatabaseNamekeyVaultCollectionName 变量的值,用句点分隔。

  • encryptedDatabaseName - 存储您的加密数据的MongoDB数据库。将其设置为 "medicalRecords"

  • encryptedCollectionName - 存储您的加密数据的MongoDB集合。将其设置为 "patients"

您可以使用以下代码声明这些变量

// KMS provider name should be one of the following: "aws", "gcp", "azure", "kmip" or "local"
const kmsProviderName = "<Your KMS Provider Name>";
const uri = process.env.MONGODB_URI; // Your connection URI
const keyVaultDatabaseName = "encryption";
const keyVaultCollectionName = "__keyVault";
const keyVaultNamespace = `${keyVaultDatabaseName}.${keyVaultCollectionName}`;
const encryptedDatabaseName = "medicalRecords";
const encryptedCollectionName = "patients";
  • kmsProviderName - 存储您的客户主密钥的KMS。将其设置为您的密钥提供程序:"aws""azure""gcp""kmip"

  • keyVaultDatabaseName - 存储您的数据加密密钥(DEK)的MongoDB数据库。将 keyVaultDatabaseName 设置为 "encryption"

  • keyVaultCollectionName - 存储您的DEK的MongoDB集合。将 keyVaultCollectionName 设置为 "__keyVault"

  • keyVaultNamespace - 存储您的DEK的MongoDB命名空间。将 keyVaultNamespace 设置为一个新的 CollectionNamespace 对象的值,其名称是 keyVaultDatabaseNamekeyVaultCollectionName 变量的值,用句点分隔。

  • 加密数据库名称 - 用于存储加密数据的MongoDB数据库。将encryptedDatabaseName设置为"medicalRecords"

  • 加密集合名称 - 在MongoDB中存储加密数据的集合。将encryptedCollectionName设置为"patients"

  • uri - 您的MongoDB部署连接URI。在appsettings.json文件中设置您的连接URI或直接替换值。

您可以使用以下代码声明这些变量

// KMS provider name should be one of the following: "aws", "gcp", "azure", "kmip" or "local"
const string kmsProviderName = "<your KMS provider name>";
const string keyVaultDatabaseName = "encryption";
const string keyVaultCollectionName = "__keyVault";
var keyVaultNamespace =
CollectionNamespace.FromFullName($"{keyVaultDatabaseName}.{keyVaultCollectionName}");
const string encryptedDatabaseName = "medicalRecords";
const string encryptedCollectionName = "patients";
var appSettings = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build();
var uri = appSettings["MongoDbUri"];
  • kmsProviderName - 存储您的客户主密钥的KMS。将其设置为您的密钥提供程序:"aws""azure""gcp""kmip"

  • uri - 您的MongoDB部署连接URI。在 MONGODB_URI 环境变量中设置您的连接URI或直接替换值。

  • keyVaultDatabaseName - 存储您的数据加密密钥(DEK)的MongoDB数据库。将其设置为 "encryption"

  • keyVaultCollectionName - 存储您的DEK的MongoDB集合。将其设置为 "__keyVault"

  • keyVaultNamespace - 存储您的DEK的MongoDB命名空间。将其设置为 keyVaultDatabaseNamekeyVaultCollectionName 变量的值,用句点分隔。

  • encryptedDatabaseName - 存储您的加密数据的MongoDB数据库。将其设置为 "medicalRecords"

  • encryptedCollectionName - 存储您的加密数据的MongoDB集合。将其设置为 "patients"

您可以使用以下代码声明这些变量

// KMS provider name should be one of the following: "aws", "gcp", "azure", "kmip" or "local"
kmsProviderName := "<KMS provider name>"
uri := os.Getenv("MONGODB_URI") // Your connection URI
keyVaultDatabaseName := "encryption"
keyVaultCollectionName := "__keyVault"
keyVaultNamespace := keyVaultDatabaseName + "." + keyVaultCollectionName
encryptedDatabaseName := "medicalRecords"
encryptedCollectionName := "patients"
  • kmsProviderName - 存储您的客户主密钥的KMS。将其设置为您的密钥提供程序:"aws""azure""gcp""kmip"

  • uri - 您的MongoDB部署连接URI。在 MONGODB_URI 环境变量中设置您的连接URI或直接替换值。

  • keyVaultDatabaseName - 存储您的数据加密密钥(DEK)的MongoDB数据库。将其设置为 "encryption"

  • keyVaultCollectionName - 存储您的DEK的MongoDB集合。将其设置为 "__keyVault"

  • keyVaultNamespace - 存储您的DEK的MongoDB命名空间。将其设置为 keyVaultDatabaseNamekeyVaultCollectionName 变量的值,用句点分隔。

  • encryptedDatabaseName - 存储您的加密数据的MongoDB数据库。将其设置为 "medicalRecords"

  • encryptedCollectionName - 存储您的加密数据的MongoDB集合。将其设置为 "patients"

您可以使用以下代码声明这些变量

// KMS provider name should be one of the following: "aws", "gcp", "azure", "kmip" or "local"
String kmsProviderName = "<KMS provider name>";
String uri = QueryableEncryptionHelpers.getEnv("MONGODB_URI"); // Your connection URI
String keyVaultDatabaseName = "encryption";
String keyVaultCollectionName = "__keyVault";
String keyVaultNamespace = keyVaultDatabaseName + "." + keyVaultCollectionName;
String encryptedDatabaseName = "medicalRecords";
String encryptedCollectionName = "patients";
  • kmsProviderName - 存储您的客户主密钥的KMS。将其设置为您的密钥提供程序:"aws""azure""gcp""kmip"

  • uri - 您的MongoDB部署连接URI。在 MONGODB_URI 环境变量中设置您的连接URI或直接替换值。

  • keyVaultDatabaseName - 存储您的数据加密密钥(DEK)的MongoDB数据库。将其设置为 "encryption"

  • keyVaultCollectionName - 存储您的DEK的MongoDB集合。将其设置为 "__keyVault"

  • keyVaultNamespace - 存储您的DEK的MongoDB命名空间。将其设置为 keyVaultDatabaseNamekeyVaultCollectionName 变量的值,用句点分隔。

  • encryptedDatabaseName - 存储您的加密数据的MongoDB数据库。将其设置为 "medicalRecords"

  • encryptedCollectionName - 存储您的加密数据的MongoDB集合。将其设置为 "patients"

您可以使用以下代码声明这些变量

// KMS provider name should be one of the following: "aws", "gcp", "azure", "kmip" or "local"
const kmsProviderName = "<Your KMS Provider Name>";
const uri = process.env.MONGODB_URI; // Your connection URI
const keyVaultDatabaseName = "encryption";
const keyVaultCollectionName = "__keyVault";
const keyVaultNamespace = `${keyVaultDatabaseName}.${keyVaultCollectionName}`;
const encryptedDatabaseName = "medicalRecords";
const encryptedCollectionName = "patients";
  • kms_provider_name - 您用于存储客户主密钥(CMK)的KMS。将其设置为您的密钥提供程序:"aws""azure""gcp""kmip"

  • uri - 您的MongoDB部署连接URI。在 MONGODB_URI 环境变量中设置您的连接URI或直接替换值。

  • key_vault_database_name - 存储您的数据加密密钥(DEK)的MongoDB数据库。将其设置为"encryption"

  • key_vault_collection_name - 存储您的DEK的MongoDB集合。将其设置为"__keyVault"

  • key_vault_namespace - 存储您的DEK的MongoDB命名空间。将其设置为key_vault_database_namekey_vault_collection_name变量值的组合,由点分隔。

  • encrypted_database_name - 存储加密数据的MongoDB数据库。将其设置为"medicalRecords"

  • encrypted_collection_name - 存储加密数据的MongoDB集合。将其设置为"patients"

您可以使用以下代码声明这些变量

# KMS provider name should be one of the following: "aws", "gcp", "azure", "kmip" or "local"
kms_provider_name = "<KMS provider name>"
uri = os.environ['MONGODB_URI'] # Your connection URI
key_vault_database_name = "encryption"
key_vault_collection_name = "__keyVault"
key_vault_namespace = f"{key_vault_database_name}.{key_vault_collection_name}"
encrypted_database_name = "medicalRecords"
encrypted_collection_name = "patients"

重要

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

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

提示

环境变量

本教程中的示例代码引用了您需要设置的环境变量。或者,您可以直接在代码中替换这些值。

有关如何设置这些环境变量的说明,请参阅GitHub上示例应用程序中包含的README.md文件。

提示

环境变量

本教程中的示例代码引用了您需要设置的环境变量。或者,您可以直接在代码中替换这些值。

了解如何设置这些环境变量,请参阅GitHub上示例应用程序中包含的README.md文件。

提示

环境变量

本教程中的示例代码引用了您需要设置的环境变量。或者,您可以直接在代码中替换这些值。

了解如何设置这些环境变量,请参阅GitHub上示例应用程序中包含的README.md文件。

提示

环境变量

本教程中的示例代码引用了您需要设置的环境变量。或者,您可以直接在代码中替换这些值。

了解如何设置这些环境变量,请参阅GitHub上示例应用程序中包含的README.md文件。

提示

环境变量

本教程中的示例代码引用了您需要设置的环境变量。或者,您可以直接在代码中替换这些值。

有关如何设置这些环境变量的说明,请参阅GitHub上示例应用程序中包含的README.md文件。

提示

环境变量

本教程中的示例代码引用了您需要设置的环境变量。或者,您可以直接在代码中替换这些值。

要了解如何设置这些环境变量,请参阅GitHub上示例应用程序中包含的 README.md 文件。

2

创建一个包含您的 KMS 凭据的变量,其结构如下。

kmsProviderCredentials = {
gcp: {
email: process.env["GCP_EMAIL"], // Your GCP email
privateKey: process.env["GCP_PRIVATE_KEY"], // Your GCP private key
},
};
var kmsProviderCredentials = new Dictionary<string, IReadOnlyDictionary<string, object>>();
var kmsOptions = new Dictionary<string, object>
{
{ "email", _appSettings["Gcp:Email"] }, // Your GCP email
{ "privateKey", _appSettings["Gcp:PrivateKey"] } // Your GCP private key
};
kmsProviderCredentials.Add("gcp", kmsOptions);
kmsProviderCredentials := map[string]map[string]interface{}{
"gcp": {
"email": os.Getenv("GCP_EMAIL"), // GCP email
"privateKey": os.Getenv("GCP_PRIVATE_KEY"), // GCP private key
},
}
Map<String, Object> kmsProviderDetails = new HashMap<>();
kmsProviderDetails.put("email", getEnv("GCP_EMAIL")); // Your GCP email
kmsProviderDetails.put("privateKey", getEnv("GCP_PRIVATE_KEY")); // Your GCP private key
Map<String, Map<String, Object>> kmsProviderCredentials = new HashMap<String, Map<String, Object>>();
kmsProviderCredentials.put("gcp", kmsProviderDetails);
kmsProviders = {
gcp: {
email: process.env.GCP_EMAIL, // Your GCP email
privateKey: process.env.GCP_PRIVATE_KEY, // Your GCP private key
},
};
kms_provider_credentials = {
"gcp": {
"email": os.environ['GCP_EMAIL'], # Your GCP email
"privateKey": os.environ['GCP_PRIVATE_KEY'] # Your GCP private key
}
}
3

创建一个包含客户主密钥凭证的变量,其结构如下。使用您在创建CMK时记录的凭证。

customerMasterKeyCredentials = {
projectId: process.env["GCP_PROJECT_ID"], // Your GCP Project ID
location: process.env["GCP_LOCATION"], // Your GCP Key Location
keyRing: process.env["GCP_KEY_RING"], // Your GCP Key Ring
keyName: process.env["GCP_KEY_NAME"], // Your GCP Key Name
};
var customerMasterKeyCredentials = new BsonDocument
{
{ "projectId", _appSettings["Gcp:ProjectId"] }, // Your GCP Project ID
{ "location", _appSettings["Gcp:Location"] }, // Your GCP Key Location
{ "keyRing", _appSettings["Gcp:KeyRing"] }, // Your GCP Key Ring
{ "keyName", _appSettings["Gcp:KeyName"] } // Your GCP Key Name
};
customerMasterKeyCredentials := map[string]string{
"projectId": os.Getenv("GCP_PROJECT_ID"), // Your GCP Project ID
"location": os.Getenv("GCP_LOCATION"), // Your GCP Key Location
"keyRing": os.Getenv("GCP_KEY_RING"), // Your GCP Key Ring
"keyName": os.Getenv("GCP_KEY_NAME"), // Your GCP Key Name
}
BsonDocument customerMasterKeyCredentials = new BsonDocument();
customerMasterKeyCredentials.put("provider", new BsonString(kmsProviderName));
customerMasterKeyCredentials.put("projectId", new BsonString(getEnv("GCP_PROJECT_ID"))); // Your GCP Project ID
customerMasterKeyCredentials.put("location", new BsonString(getEnv("GCP_LOCATION"))); // Your GCP Key Location
customerMasterKeyCredentials.put("keyRing", new BsonString(getEnv("GCP_KEY_RING"))); // Your GCP Key Ring
customerMasterKeyCredentials.put("keyName", new BsonString(getEnv("GCP_KEY_NAME"))); // Your GCP Key Name
customerMasterKeyCredentials = {
projectId: process.env.GCP_PROJECT_ID, // Your GCP Project ID
location: process.env.GCP_LOCATION, // Your GCP Key Location
keyRing: process.env.GCP_KEY_RING, // Your GCP Key Ring
keyName: process.env.GCP_KEY_NAME, // Your GCP Key Name
};
customer_master_key_credentials = {
"projectId": os.environ['GCP_PROJECT_ID'], # Your GCP email
"location": os.environ['GCP_LOCATION'], # Your GCP private key
"keyRing": os.environ['GCP_KEY_RING'], # Your GCP private key
"keyName": os.environ['GCP_KEY_NAME'] # Your GCP private key
}
4

要创建一个用于加密和解密加密集合中数据的客户端,请使用您的连接 URI 和自动加密选项实例化一个新的 MongoClient

const encryptedClient = Mongo(uri, autoEncryptionOptions);

重要:如果您使用的是.NET/C#驱动程序3.0或更高版本,在实例化新的MongoClient之前,您必须将以下代码添加到您的应用程序中

MongoClientSettings.Extensions.AddAutoEncryption(); // .NET/C# Driver v3.0 or later only

使用您的连接URI和自动加密选项实例化一个新的MongoClient

var clientSettings = MongoClientSettings.FromConnectionString(uri);
clientSettings.AutoEncryptionOptions = qeHelpers.GetAutoEncryptionOptions(
keyVaultNamespace,
kmsProviderCredentials);
var encryptedClient = new MongoClient(clientSettings);
encryptedClient, err := mongo.Connect(
context.TODO(),
options.Client().ApplyURI(uri).SetAutoEncryptionOptions(autoEncryptionOptions),
)
if err != nil {
panic(fmt.Sprintf("Unable to connect to MongoDB: %v\n", err))
}
defer func() {
_ = encryptedClient.Disconnect(context.TODO())
}()
MongoClientSettings clientSettings = MongoClientSettings.builder()
.applyConnectionString(new ConnectionString(uri))
.autoEncryptionSettings(autoEncryptionSettings)
.build();
try (MongoClient encryptedClient = MongoClients.create(clientSettings)) {
const encryptedClient = new MongoClient(uri, {
autoEncryption: autoEncryptionOptions,
});
encrypted_client = MongoClient(
uri, auto_encryption_opts=auto_encryption_options)
1

本教程中的代码示例使用以下变量执行可查询加密工作流程

  • kmsProviderName - 存储您的客户主密钥的KMS。将其设置为您的密钥提供程序:"aws""azure""gcp""kmip"

  • uri - 您的MongoDB部署连接URI。在 MONGODB_URI 环境变量中设置您的连接URI或直接替换值。

  • keyVaultDatabaseName - 存储您的数据加密密钥(DEK)的MongoDB数据库。将其设置为 "encryption"

  • keyVaultCollectionName - 存储您的DEK的MongoDB集合。将其设置为 "__keyVault"

  • keyVaultNamespace - 存储您的DEK的MongoDB命名空间。将其设置为 keyVaultDatabaseNamekeyVaultCollectionName 变量的值,用句点分隔。

  • encryptedDatabaseName - 存储您的加密数据的MongoDB数据库。将其设置为 "medicalRecords"

  • encryptedCollectionName - 存储您的加密数据的MongoDB集合。将其设置为 "patients"

您可以使用以下代码声明这些变量

// KMS provider name should be one of the following: "aws", "gcp", "azure", "kmip" or "local"
const kmsProviderName = "<Your KMS Provider Name>";
const uri = process.env.MONGODB_URI; // Your connection URI
const keyVaultDatabaseName = "encryption";
const keyVaultCollectionName = "__keyVault";
const keyVaultNamespace = `${keyVaultDatabaseName}.${keyVaultCollectionName}`;
const encryptedDatabaseName = "medicalRecords";
const encryptedCollectionName = "patients";
  • kmsProviderName - 存储您的客户主密钥的KMS。将其设置为您的密钥提供程序:"aws""azure""gcp""kmip"

  • keyVaultDatabaseName - 存储您的数据加密密钥(DEK)的MongoDB数据库。将 keyVaultDatabaseName 设置为 "encryption"

  • keyVaultCollectionName - 存储您的DEK的MongoDB集合。将 keyVaultCollectionName 设置为 "__keyVault"

  • keyVaultNamespace - 存储您的DEK的MongoDB命名空间。将 keyVaultNamespace 设置为一个新的 CollectionNamespace 对象的值,其名称是 keyVaultDatabaseNamekeyVaultCollectionName 变量的值,用句点分隔。

  • 加密数据库名称 - 用于存储加密数据的MongoDB数据库。将encryptedDatabaseName设置为"medicalRecords"

  • 加密集合名称 - 在MongoDB中存储加密数据的集合。将encryptedCollectionName设置为"patients"

  • uri - 您的MongoDB部署连接URI。在appsettings.json文件中设置您的连接URI或直接替换值。

您可以使用以下代码声明这些变量

// KMS provider name should be one of the following: "aws", "gcp", "azure", "kmip" or "local"
const string kmsProviderName = "<your KMS provider name>";
const string keyVaultDatabaseName = "encryption";
const string keyVaultCollectionName = "__keyVault";
var keyVaultNamespace =
CollectionNamespace.FromFullName($"{keyVaultDatabaseName}.{keyVaultCollectionName}");
const string encryptedDatabaseName = "medicalRecords";
const string encryptedCollectionName = "patients";
var appSettings = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build();
var uri = appSettings["MongoDbUri"];
  • kmsProviderName - 存储您的客户主密钥的KMS。将其设置为您的密钥提供程序:"aws""azure""gcp""kmip"

  • uri - 您的MongoDB部署连接URI。在 MONGODB_URI 环境变量中设置您的连接URI或直接替换值。

  • keyVaultDatabaseName - 存储您的数据加密密钥(DEK)的MongoDB数据库。将其设置为 "encryption"

  • keyVaultCollectionName - 存储您的DEK的MongoDB集合。将其设置为 "__keyVault"

  • keyVaultNamespace - 存储您的DEK的MongoDB命名空间。将其设置为 keyVaultDatabaseNamekeyVaultCollectionName 变量的值,用句点分隔。

  • encryptedDatabaseName - 存储您的加密数据的MongoDB数据库。将其设置为 "medicalRecords"

  • encryptedCollectionName - 存储您的加密数据的MongoDB集合。将其设置为 "patients"

您可以使用以下代码声明这些变量

// KMS provider name should be one of the following: "aws", "gcp", "azure", "kmip" or "local"
kmsProviderName := "<KMS provider name>"
uri := os.Getenv("MONGODB_URI") // Your connection URI
keyVaultDatabaseName := "encryption"
keyVaultCollectionName := "__keyVault"
keyVaultNamespace := keyVaultDatabaseName + "." + keyVaultCollectionName
encryptedDatabaseName := "medicalRecords"
encryptedCollectionName := "patients"
  • kmsProviderName - 存储您的客户主密钥的KMS。将其设置为您的密钥提供程序:"aws""azure""gcp""kmip"

  • uri - 您的MongoDB部署连接URI。在 MONGODB_URI 环境变量中设置您的连接URI或直接替换值。

  • keyVaultDatabaseName - 存储您的数据加密密钥(DEK)的MongoDB数据库。将其设置为 "encryption"

  • keyVaultCollectionName - 存储您的DEK的MongoDB集合。将其设置为 "__keyVault"

  • keyVaultNamespace - 存储您的DEK的MongoDB命名空间。将其设置为 keyVaultDatabaseNamekeyVaultCollectionName 变量的值,用句点分隔。

  • encryptedDatabaseName - 存储您的加密数据的MongoDB数据库。将其设置为 "medicalRecords"

  • encryptedCollectionName - 存储您的加密数据的MongoDB集合。将其设置为 "patients"

您可以使用以下代码声明这些变量

// KMS provider name should be one of the following: "aws", "gcp", "azure", "kmip" or "local"
String kmsProviderName = "<KMS provider name>";
String uri = QueryableEncryptionHelpers.getEnv("MONGODB_URI"); // Your connection URI
String keyVaultDatabaseName = "encryption";
String keyVaultCollectionName = "__keyVault";
String keyVaultNamespace = keyVaultDatabaseName + "." + keyVaultCollectionName;
String encryptedDatabaseName = "medicalRecords";
String encryptedCollectionName = "patients";
  • kmsProviderName - 存储您的客户主密钥的KMS。将其设置为您的密钥提供程序:"aws""azure""gcp""kmip"

  • uri - 您的MongoDB部署连接URI。在 MONGODB_URI 环境变量中设置您的连接URI或直接替换值。

  • keyVaultDatabaseName - 存储您的数据加密密钥(DEK)的MongoDB数据库。将其设置为 "encryption"

  • keyVaultCollectionName - 存储您的DEK的MongoDB集合。将其设置为 "__keyVault"

  • keyVaultNamespace - 存储您的DEK的MongoDB命名空间。将其设置为 keyVaultDatabaseNamekeyVaultCollectionName 变量的值,用句点分隔。

  • encryptedDatabaseName - 存储您的加密数据的MongoDB数据库。将其设置为 "medicalRecords"

  • encryptedCollectionName - 存储您的加密数据的MongoDB集合。将其设置为 "patients"

您可以使用以下代码声明这些变量

// KMS provider name should be one of the following: "aws", "gcp", "azure", "kmip" or "local"
const kmsProviderName = "<Your KMS Provider Name>";
const uri = process.env.MONGODB_URI; // Your connection URI
const keyVaultDatabaseName = "encryption";
const keyVaultCollectionName = "__keyVault";
const keyVaultNamespace = `${keyVaultDatabaseName}.${keyVaultCollectionName}`;
const encryptedDatabaseName = "medicalRecords";
const encryptedCollectionName = "patients";
  • kms_provider_name - 您用于存储客户主密钥(CMK)的KMS。将其设置为您的密钥提供程序:"aws""azure""gcp""kmip"

  • uri - 您的MongoDB部署连接URI。在 MONGODB_URI 环境变量中设置您的连接URI或直接替换值。

  • key_vault_database_name - 存储您的数据加密密钥(DEK)的MongoDB数据库。将其设置为"encryption"

  • key_vault_collection_name - 存储您的DEK的MongoDB集合。将其设置为"__keyVault"

  • key_vault_namespace - 存储您的DEK的MongoDB命名空间。将其设置为key_vault_database_namekey_vault_collection_name变量值的组合,由点分隔。

  • encrypted_database_name - 存储加密数据的MongoDB数据库。将其设置为"medicalRecords"

  • encrypted_collection_name - 存储加密数据的MongoDB集合。将其设置为"patients"

您可以使用以下代码声明这些变量

# KMS provider name should be one of the following: "aws", "gcp", "azure", "kmip" or "local"
kms_provider_name = "<KMS provider name>"
uri = os.environ['MONGODB_URI'] # Your connection URI
key_vault_database_name = "encryption"
key_vault_collection_name = "__keyVault"
key_vault_namespace = f"{key_vault_database_name}.{key_vault_collection_name}"
encrypted_database_name = "medicalRecords"
encrypted_collection_name = "patients"

重要

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

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

提示

环境变量

本教程中的示例代码引用了您需要设置的环境变量。或者,您可以直接在代码中替换这些值。

有关如何设置这些环境变量的说明,请参阅GitHub上示例应用程序中包含的README.md文件。

提示

环境变量

本教程中的示例代码引用了您需要设置的环境变量。或者,您可以直接在代码中替换这些值。

了解如何设置这些环境变量,请参阅GitHub上示例应用程序中包含的README.md文件。

提示

环境变量

本教程中的示例代码引用了您需要设置的环境变量。或者,您可以直接在代码中替换这些值。

了解如何设置这些环境变量,请参阅GitHub上示例应用程序中包含的README.md文件。

提示

环境变量

本教程中的示例代码引用了您需要设置的环境变量。或者,您可以直接在代码中替换这些值。

了解如何设置这些环境变量,请参阅GitHub上示例应用程序中包含的README.md文件。

提示

环境变量

本教程中的示例代码引用了您需要设置的环境变量。或者,您可以直接在代码中替换这些值。

有关如何设置这些环境变量的说明,请参阅GitHub上示例应用程序中包含的README.md文件。

提示

环境变量

本教程中的示例代码引用了您需要设置的环境变量。或者,您可以直接在代码中替换这些值。

要了解如何设置这些环境变量,请参阅GitHub上示例应用程序中包含的 README.md 文件。

2

创建一个包含您的KMIP兼容密钥提供程序端点的变量,其结构如下

kmsProviderCredentials = {
kmip: {
endpoint: process.env["KMIP_KMS_ENDPOINT"], // Your KMIP KMS endpoint
},
};
var kmsProviderCredentials = new Dictionary<string, IReadOnlyDictionary<string, object>>();
var kmsOptions = new Dictionary<string, object>
{
{ "endpoint", _appSettings["Kmip:KmsEndpoint"] } // Your KMIP KMS endpoint
};
kmsProviderCredentials.Add("kmip", kmsOptions);
kmsProviderCredentials := map[string]map[string]interface{}{
"kmip": {
"endpoint": os.Getenv("KMIP_KMS_ENDPOINT"), // KMIP KMS endpoint
},
}
Map<String, Object> kmsProviderDetails = new HashMap<>();
kmsProviderDetails.put("endpoint", getEnv("KMIP_KMS_ENDPOINT")); // Your KMIP KMS endpoint
Map<String, Map<String, Object>> kmsProviderCredentials = new HashMap<String, Map<String, Object>>();
kmsProviderCredentials.put("kmip", kmsProviderDetails);
kmsProviders = {
kmip: {
endpoint: process.env.KMIP_KMS_ENDPOINT, // Your KMIP KMS endpoint
},
};
kms_provider_credentials = {
"kmip": {
"endpoint": os.environ['KMIP_KMS_ENDPOINT'] # Your KMIP KMS endpoint
}
}
3

如以下代码示例所示,创建一个空对象。这将提示您的KMIP兼容密钥提供者生成一个新的客户主密钥。

customerMasterKeyCredentials = {};
var customerMasterKeyCredentials = new BsonDocument();
cmkCredentials := map[string]string{}
BsonDocument customerMasterKeyCredentials = new BsonDocument();
customerMasterKeyCredentials = {};
customer_master_key_credentials = {}
4

要创建一个用于加密和解密加密集合中数据的客户端,请使用您的连接 URI 和自动加密选项实例化一个新的 MongoClient

const encryptedClient = Mongo(uri, autoEncryptionOptions);

重要:如果您使用的是.NET/C#驱动程序3.0或更高版本,在实例化新的MongoClient之前,您必须将以下代码添加到您的应用程序中

MongoClientSettings.Extensions.AddAutoEncryption(); // .NET/C# Driver v3.0 or later only

使用您的连接URI和自动加密选项实例化一个新的MongoClient

var clientSettings = MongoClientSettings.FromConnectionString(uri);
clientSettings.AutoEncryptionOptions = qeHelpers.GetAutoEncryptionOptions(
keyVaultNamespace,
kmsProviderCredentials);
var encryptedClient = new MongoClient(clientSettings);
encryptedClient, err := mongo.Connect(
context.TODO(),
options.Client().ApplyURI(uri).SetAutoEncryptionOptions(autoEncryptionOptions),
)
if err != nil {
panic(fmt.Sprintf("Unable to connect to MongoDB: %v\n", err))
}
defer func() {
_ = encryptedClient.Disconnect(context.TODO())
}()
MongoClientSettings clientSettings = MongoClientSettings.builder()
.applyConnectionString(new ConnectionString(uri))
.autoEncryptionSettings(autoEncryptionSettings)
.build();
try (MongoClient encryptedClient = MongoClients.create(clientSettings)) {
const encryptedClient = new MongoClient(uri, {
autoEncryption: autoEncryptionOptions,
});
encrypted_client = MongoClient(
uri, auto_encryption_opts=auto_encryption_options)

在安装驱动程序和依赖项、创建客户主密钥以及创建您的应用程序后,请参阅概述:使用查询加密以加密和查询数据。

返回

创建客户主密钥