Docs 菜单
Docs 主页
/ /

创建启用 Queryable Encryption 的应用程序

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

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

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

  1. 安装 Queryable Encryption 兼容驱动程序和依赖项

  2. 安装和配置查询分析组件

  3. 创建客户主密钥

如果您使用的是 mongocryptd,则应用应用程序需要对工作目录的写入权限才能创建 mongocryptd.pid文件。

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

完成 mongosh 应用程序

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

选择下面与您的密钥提供程序对应的标签页。

1

本教程中的代码示例使用以下变量来执行 Queryable Encryption 工作流:

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

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

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

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

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

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

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

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

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 - MongoDB 中将存储您的 DEK 的集合。将 keyVaultCollectionName 设置为 "__keyVault"

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

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

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

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

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

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 - MongoDB中将存储您的 DEK 的集合。 将其设置为"__keyVault"

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

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

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

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

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 - MongoDB中将存储您的 DEK 的集合。 将其设置为"__keyVault"

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

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

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

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

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 - MongoDB中将存储您的 DEK 的集合。 将其设置为"__keyVault"

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

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

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

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

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 。将 KMS_PROVIDER 环境变量设置为您的密钥提供商:'aws''azure''gcp''kmip'

  • $uri - 您的MongoDB 部署连接 URI。在 MONGODB_URI 环境变量中设置连接 URI。

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

  • $keyVaultCollectionName - MongoDB中将存储您的 DEK 的集合。将此变量设置为 '__keyVault',这是一种惯例,有助于防止将其误认为是用户集合。

  • $keyVaultNamespace - MongoDB中将存储您的 DEK 的命名空间。将此变量设置为 $keyVaultDatabaseName$keyVaultCollectionName 变量的值,并用句点分隔。

  • $cryptedDatabaseName — MongoDB中将存储您的加密数据的数据库。将此变量设置为 'medicalRecords'

  • $cryptedCollectionName — MongoDB中将存储您的加密数据的集合。将此变量设置为 'patients'

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

$kmsProviderName = getenv('KMS_PROVIDER');
$uri = getenv('MONGODB_URI'); // Your connection URI
$keyVaultDatabaseName = 'encryption';
$keyVaultCollectionName = '__keyVault';
$keyVaultNamespace = $keyVaultDatabaseName . '.' . $keyVaultCollectionName;
$encryptedDatabaseName = 'medicalRecords';
$encryptedCollectionName = 'patients';
  • kms_provider_name — 用于存储客户主密钥的KMS 。 将其设置为您的密钥提供商: "aws""azure""gcp""kmip"

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

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

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

  • key_vault_namespace - MongoDB中存储 DEK 的命名空间。 将其设置为key_vault_database_namekey_vault_collection_name变量的值,并用句点分隔。

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

  • encryption_collection_name - MongoDB中将存储您的加密加密的集合。 将其设置为"patients"

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

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"
  • kms_provider_name - 您用来存储客户主密钥的KMS 。 在本教程中,将此变量设置为"local"

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

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

  • key_vault_collection_name - MongoDB中将存储您的 DEK 的集合。 将此变量设置为"__keyVault" ,这是一种约定,有助于防止将其误认为是用户集合。

  • key_vault_namespace - MongoDB中存储 DEK 的命名空间。将此变量设置为 Namespace 结构,并传递 key_vault_database_namekey_vault_collection_name 变量的值。

  • encryption_database_name - MongoDB中将存储您的加密加密的数据库。 将此变量设置为"medicalRecords"

  • encryption_collection_name - MongoDB中将存储您的加密加密的集合。 将此变量设置为"patients"

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

let kms_provider_name = "<KMS provider name>";
let uri = env::var("MONGODB_URI").expect("Set MONGODB_URI environment variable to your connection string");
let key_vault_database_name = "encryption";
let key_vault_collection_name = "__keyVault";
let key_vault_namespace = Namespace::new(key_vault_database_name, key_vault_collection_name);
let encrypted_database_name = "medicalRecords";
let encrypted_collection_name = "patients";

重要

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

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

提示

环境变量

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

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

提示

环境变量

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

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

提示

环境变量

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

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

提示

环境变量

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

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

提示

环境变量

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

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

提示

环境变量

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

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

提示

环境变量

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

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

提示

环境变量

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

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

2

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

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
},
};

您还可以通过传入一个字符串来为KMS提供商提供自定义名称,该字符串包括KMS提供商的名称,后跟冒号和自定义名称。 通过为KMS提供商提供唯一名称,您可以指定多个同一类型的KMS提供程序。

示例,您可以在KMS凭证变量中将Amazon Web Services KMS提供商命名为“my_aws_provider”,如以下代码所示:

kmsProviderCredentials = {
"aws:my_aws_provider": {
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提供商字符串 "aws"

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);

您还可以通过传入一个字符串来为KMS提供商提供自定义名称,该字符串包括KMS提供商的名称,后跟冒号和自定义名称。 通过为KMS提供商提供唯一名称,您可以指定多个同一类型的KMS提供程序。

示例,您可以在KMS凭证变量中将Amazon Web Services KMS提供商命名为“my_aws_provider”,如以下代码所示:

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:my_aws_provider", kmsOptions);

注意:本教程中的其余步骤使用默认KMS提供商字符串 "aws"

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);

您还可以通过传入一个字符串来为KMS提供商提供自定义名称,该字符串包括KMS提供商的名称,后跟冒号和自定义名称。 通过为KMS提供商提供唯一名称,您可以指定多个同一类型的KMS提供程序。

示例,您可以在KMS凭证变量中将Amazon Web Services KMS提供商命名为“my_aws_provider”,如以下代码所示:

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:my_aws_provider", kmsProviderDetails);

注意:本教程中的其余步骤使用默认KMS提供商字符串 "aws"

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提供商提供自定义名称,该字符串包括KMS提供商的名称,后跟冒号和自定义名称。 通过为KMS提供商提供唯一名称,您可以指定多个同一类型的KMS提供程序。

示例,您可以在KMS凭证变量中将Amazon Web Services KMS提供商命名为“my_aws_provider”,如以下代码所示:

kmsProviderCredentials = {
"aws:my_aws_provider": {
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提供商字符串 "aws"

$kmsProviders = [
'aws' => [
'accessKeyId' => getenv('AWS_ACCESS_KEY_ID'), // Your AWS access key ID
'secretAccessKey' => getenv('AWS_SECRET_ACCESS_KEY'), // Your AWS secret access key
],
];

您还可以通过传入一个字符串来为KMS提供商提供自定义名称,该字符串包括KMS提供商的名称,后跟冒号和自定义名称。 通过为KMS提供商提供唯一名称,您可以指定多个同一类型的KMS提供程序。

示例,您可以在KMS凭证变量中将Amazon Web Services KMS提供商命名为“my_aws_provider”,如以下代码所示:

$kmsProviders = [
'aws:my_aws_provider' => [
'accessKeyId' => getenv('AWS_ACCESS_KEY_ID'), // Your AWS access key ID
'secretAccessKey' => getenv('AWS_SECRET_ACCESS_KEY'), // Your AWS secret access key
],
];

注意:本教程中的其余步骤使用默认KMS提供商字符串 "aws"

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
}
}

您还可以通过传入一个字符串来为KMS提供商提供自定义名称,该字符串包括KMS提供商的名称,后跟冒号和自定义名称。 通过为KMS提供商提供唯一名称,您可以指定多个同一类型的KMS提供程序。

示例,您可以在KMS凭证变量中将Amazon Web Services KMS提供商命名为“my_aws_provider”,如以下代码所示:

kms_provider_credentials = {
"aws:my_aws_provider": {
"accessKeyId": os.environ['AWS_ACCESS_KEY_ID'], # Your AWS access key ID
"secretAccessKey": os.environ['AWS_SECRET_ACCESS_KEY'] # Your AWS secret access key
}
}

注意:本教程中的其余步骤使用默认KMS提供商字符串 "aws"

kms_providers = vec![(
KmsProvider::aws(),
doc! {
"accessKeyId": env::var("AWS_ACCESS_KEY_ID").expect("Set AWS_ACCESS_KEY_ID environment variable"),
"secretAccessKey": env::var("AWS_SECRET_ACCESS_KEY").expect("Set AWS_SECRET_ACCESS_KEY environment variable"),
},
None,
)];

您还可以为KMS提供商提供自定义名称,方法是将名称作为字符串传递给 with_name() 函数。 通过为KMS提供商提供唯一名称,您可以指定多个同一类型的KMS提供程序。

示例,您可以在KMS凭证变量中将Amazon Web Services KMS提供商命名为“my_aws_provider”,如以下代码所示:

kms_providers = vec![(
KmsProvider::aws().with_name("my_aws_provider"),
doc! {
"accessKeyId": env::var("AWS_ACCESS_KEY_ID").expect("Set AWS_ACCESS_KEY_ID environment variable"),
"secretAccessKey": env::var("AWS_SECRET_ACCESS_KEY").expect("Set AWS_SECRET_ACCESS_KEY environment variable"),
},
None,
)];

注意:本教程中的其余步骤使用默认KMS提供商字符串 "aws"

重要

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

要使用 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: { }
};
$kmsProviders = [
'aws' => [],
];
kms_provider_credentials = {
"aws": { }
}
kms_providers = vec![(
KmsProvider::aws(),
doc! {},
None,
)];

如果使用命名的KMS提供商,则无法自动检索凭证。

3

创建一个包含以下结构的客户主密钥凭证的变量。 使用您在步骤 中 创建集合扫描 时记录的 ARN 和地区。1.3

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
};
$customerMasterKeyCredentials = [
'key' => getenv('AWS_KEY_ARN'), // Your AWS key ARN
'region' => getenv('AWS_REGION'), // Your AWS 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
}
let aws_master_key = AwsMasterKey::builder()
.key(env::var("AWS_KEY_ARN").expect("Set the AWS_KEY_ARN environment variable"))
.region(env::var("AWS_KEY_REGION").expect("Set the AWS_KEY_REGION environment variable"))
.build();
4

注意

自动加密选项

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

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

使用以下选项创建autoEncryptionOptions对象:

  • 密钥保管库集合的命名空间

  • kmsProviderCredentials对象,其中包含您的 Amazon Web Services KMS 档案

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

使用以下选项创建AutoEncryptionOptions对象:

  • 密钥保管库集合的命名空间

  • kmsProviderCredentials对象,其中包含您的 Amazon Web Services KMS 档案

  • 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对象:

  • 密钥保管库集合的命名空间

  • kmsProviderCredentials对象,其中包含您的 Amazon Web Services KMS 档案

  • 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对象:

  • 密钥保管库集合的命名空间

  • kmsProviderCredentials对象,其中包含您的 Amazon Web Services KMS 档案

  • 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();

如果您在 AutoEncryptionSettings对象中省略 keyVaultClient 或将 bypassAutomaticEncryption设立为 false,则驱动程序将创建一个单独的内部 MongoClient。内部 MongoClient 配置与父 MongoClient 的不同之处在于,将 minPoolSize 设置为 0 并省略 AutoEncryptionSettings

使用以下选项创建autoEncryptionOptions对象:

  • 密钥保管库集合的命名空间

  • kmsProviders对象,其中包含您的 Amazon Web Services KMS 档案

  • sharedLibraryPathOptions 对象,其中包含指向您的自动加密共享库的路径

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

创建一个包含以下选项的$autoEncryptionOptions对象:

  • 密钥保管库集合的命名空间

  • 上一步中定义的$kmsProviders对象

$autoEncryptionOptions = [
'keyVaultNamespace' => $keyVaultNamespace,
'kmsProviders' => $kmsProviders,
];

使用以下选项创建AutoEncryptionOpts对象:

  • kms_provider_credentials对象,其中包含您的 Amazon Web Services KMS 档案

  • 密钥保管库集合的命名空间

  • 自动加密共享库的路径

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>
)

创建一个包含以下选项的EncryptedClientBuilder对象:

  • ClientOptions对象

  • 密钥保管库集合的命名空间

  • kms_providers对象,其中包含您的 Amazon Web Services KMS 档案

let client_options = ClientOptions::builder().build();
let builder = Client::encrypted_builder(
client_options,
key_vault_namespace.clone(),
kms_providers.clone()
).expect("");
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);
opts := options.Client().
ApplyURI(uri).
SetAutoEncryptionOptions(autoEncryptionOptions)
encryptedClient, err := mongo.Connect(opts)
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,
});
$encryptedClient = new \MongoDB\Client($uri, [], [
'autoEncryption' => $autoEncryptionOptions,
]);
encrypted_client = MongoClient(
uri, auto_encryption_opts=auto_encryption_options)
let encrypted_client = encrypted_client_builder
.extra_options(Some(doc!{
"cryptSharedLibPath": env::var("SHARED_LIB_PATH").expect("Set SHARED_LIB_PATH environment variable to path to crypt_shared library")
}))
.key_vault_client(Client::with_uri_str(uri).await.unwrap())
.build()
.await
.unwrap();
1

本教程中的代码示例使用以下变量来执行 Queryable Encryption 工作流:

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

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

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

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

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

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

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

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

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 - MongoDB 中将存储您的 DEK 的集合。将 keyVaultCollectionName 设置为 "__keyVault"

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

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

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

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

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

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 - MongoDB中将存储您的 DEK 的集合。 将其设置为"__keyVault"

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

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

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

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

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 - MongoDB中将存储您的 DEK 的集合。 将其设置为"__keyVault"

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

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

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

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

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 - MongoDB中将存储您的 DEK 的集合。 将其设置为"__keyVault"

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

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

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

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

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 。将 KMS_PROVIDER 环境变量设置为您的密钥提供商:'aws''azure''gcp''kmip'

  • $uri - 您的MongoDB 部署连接 URI。在 MONGODB_URI 环境变量中设置连接 URI。

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

  • $keyVaultCollectionName - MongoDB中将存储您的 DEK 的集合。将此变量设置为 '__keyVault',这是一种惯例,有助于防止将其误认为是用户集合。

  • $keyVaultNamespace - MongoDB中将存储您的 DEK 的命名空间。将此变量设置为 $keyVaultDatabaseName$keyVaultCollectionName 变量的值,并用句点分隔。

  • $cryptedDatabaseName — MongoDB中将存储您的加密数据的数据库。将此变量设置为 'medicalRecords'

  • $cryptedCollectionName — MongoDB中将存储您的加密数据的集合。将此变量设置为 'patients'

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

$kmsProviderName = getenv('KMS_PROVIDER');
$uri = getenv('MONGODB_URI'); // Your connection URI
$keyVaultDatabaseName = 'encryption';
$keyVaultCollectionName = '__keyVault';
$keyVaultNamespace = $keyVaultDatabaseName . '.' . $keyVaultCollectionName;
$encryptedDatabaseName = 'medicalRecords';
$encryptedCollectionName = 'patients';
  • kms_provider_name — 用于存储客户主密钥的KMS 。 将其设置为您的密钥提供商: "aws""azure""gcp""kmip"

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

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

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

  • key_vault_namespace - MongoDB中存储 DEK 的命名空间。 将其设置为key_vault_database_namekey_vault_collection_name变量的值,并用句点分隔。

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

  • encryption_collection_name - MongoDB中将存储您的加密加密的集合。 将其设置为"patients"

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

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"
  • kms_provider_name - 您用来存储客户主密钥的KMS 。 在本教程中,将此变量设置为"local"

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

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

  • key_vault_collection_name - MongoDB中将存储您的 DEK 的集合。 将此变量设置为"__keyVault" ,这是一种约定,有助于防止将其误认为是用户集合。

  • key_vault_namespace - MongoDB中存储 DEK 的命名空间。将此变量设置为 Namespace 结构,并传递 key_vault_database_namekey_vault_collection_name 变量的值。

  • encryption_database_name - MongoDB中将存储您的加密加密的数据库。 将此变量设置为"medicalRecords"

  • encryption_collection_name - MongoDB中将存储您的加密加密的集合。 将此变量设置为"patients"

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

let kms_provider_name = "<KMS provider name>";
let uri = env::var("MONGODB_URI").expect("Set MONGODB_URI environment variable to your connection string");
let key_vault_database_name = "encryption";
let key_vault_collection_name = "__keyVault";
let key_vault_namespace = Namespace::new(key_vault_database_name, key_vault_collection_name);
let encrypted_database_name = "medicalRecords";
let encrypted_collection_name = "patients";

重要

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

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

提示

环境变量

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

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

提示

环境变量

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

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

提示

环境变量

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

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

提示

环境变量

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

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

提示

环境变量

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

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

提示

环境变量

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

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

提示

环境变量

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

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

提示

环境变量

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

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

2

创建一个包含KMS的变量,其结构如下。 使用您在Azure 注册应用程序Azure时记录的Azure Key Vault凭证。

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
},
};

您还可以通过传入一个字符串来为KMS提供商提供自定义名称,该字符串包括KMS提供商的名称,后跟冒号和自定义名称。 通过为KMS提供商提供唯一名称,您可以指定多个同一类型的KMS提供程序。

示例,您可以在KMS凭证变量中将Azure KMS提供商命名为“my_azure_provider”,如以下代码所示:

kmsProviderCredentials = {
"azure:my_azure_provider": {
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提供商字符串 "azure"

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);

您还可以通过传入一个字符串来为KMS提供商提供自定义名称,该字符串包括KMS提供商的名称,后跟冒号和自定义名称。 通过为KMS提供商提供唯一名称,您可以指定多个同一类型的KMS提供程序。

示例,您可以在KMS凭证变量中将Azure KMS提供商命名为“my_azure_provider”,如以下代码所示:

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:my_azure_provider", kmsOptions);

注意:本教程中的其余步骤使用默认KMS提供商字符串 "azure"

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);

您还可以通过传入一个字符串来为KMS提供商提供自定义名称,该字符串包括KMS提供商的名称,后跟冒号和自定义名称。 通过为KMS提供商提供唯一名称,您可以指定多个同一类型的KMS提供程序。

示例,您可以在KMS凭证变量中将Azure KMS提供商命名为“my_azure_provider”,如以下代码所示:

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:my_azure_provider", kmsProviderDetails);

注意:本教程中的其余步骤使用默认KMS提供商字符串 "azure"

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提供商提供自定义名称,该字符串包括KMS提供商的名称,后跟冒号和自定义名称。 通过为KMS提供商提供唯一名称,您可以指定多个同一类型的KMS提供程序。

示例,您可以在KMS凭证变量中将Azure KMS提供商命名为“my_azure_provider”,如以下代码所示:

kmsProviderCredentials = {
"azure:my_azure_provider": {
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提供商字符串 "azure"

$kmsProviders = [
'azure' => [
'tenantId' => getenv('AZURE_TENANT_ID'), // Your Azure tenant ID
'clientId' => getenv('AZURE_CLIENT_ID'), // Your Azure client ID
'clientSecret' => getenv('AZURE_CLIENT_SECRET'), // Your Azure client secret
],
];

您还可以通过传入一个字符串来为KMS提供商提供自定义名称,该字符串包括KMS提供商的名称,后跟冒号和自定义名称。 通过为KMS提供商提供唯一名称,您可以指定多个同一类型的KMS提供程序。

示例,您可以在KMS凭证变量中将Azure KMS提供商命名为“my_azure_provider”,如以下代码所示:

$kmsProviders = [
'azure:my_azure_provider' => [
'tenantId' => getenv('AZURE_TENANT_ID'), // Your Azure tenant ID
'clientId' => getenv('AZURE_CLIENT_ID'), // Your Azure client ID
'clientSecret' => getenv('AZURE_CLIENT_SECRET'), // Your Azure client secret
],
];

注意:本教程中的其余步骤使用默认KMS提供商字符串 'azure'

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
}
}

您还可以通过传入一个字符串来为KMS提供商提供自定义名称,该字符串包括KMS提供商的名称,后跟冒号和自定义名称。 通过为KMS提供商提供唯一名称,您可以指定多个同一类型的KMS提供程序。

示例,您可以在KMS凭证变量中将Azure KMS提供商命名为“my_azure_provider”,如以下代码所示:

kms_provider_credentials = {
"azure:my_azure_provider": {
"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
}
}

注意:本教程中的其余步骤使用默认KMS提供商字符串 "azure"

kms_providers = vec![(
KmsProvider::azure(),
doc! {
"tenantId": env::var("AZURE_TENANT_ID").expect("Set AZURE_TENANT_ID environment variable"),
"clientId": env::var("AZURE_CLIENT_ID").expect("Set AZURE_CLIENT_ID environment variable"),
"clientSecret": env::var("AZURE_CLIENT_SECRET").expect("AZURE_CLIENT_SECRET environment variable"),
},
None,
)];

您还可以为KMS提供商提供自定义名称,方法是将名称作为字符串传递给 with_name() 函数。 通过为KMS提供商提供唯一名称,您可以指定多个同一类型的KMS提供程序。

示例,您可以在KMS凭证变量中将Azure KMS提供商命名为“my_azure_provider”,如以下代码所示:

kms_providers = vec![(
KmsProvider::azure().with_name("my_azure_provider"),
doc! {
"tenantId": env::var("AZURE_TENANT_ID").expect("Set AZURE_TENANT_ID environment variable"),
"clientId": env::var("AZURE_CLIENT_ID").expect("Set AZURE_CLIENT_ID environment variable"),
"clientSecret": env::var("AZURE_CLIENT_SECRET").expect("AZURE_CLIENT_SECRET environment variable"),
},
None,
)];

注意:本教程中的其余步骤使用默认KMS提供商字符串 "azure"

3

创建一个包含以下结构的客户主密钥凭证的变量。 使用您在创建集合扫描时记录的集合扫描详细信息。

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
};
$customerMasterKeyCredentials = [
'keyVaultEndpoint' => getenv('AZURE_KEY_VAULT_ENDPOINT'), // Your Azure Key Vault Endpoint
'keyName' => getenv('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
}
let azure_master_key = AzureMasterKey::builder()
.key_vault_endpoint(env::var("AZURE_KEY_VAULT_ENDPOINT").expect("Set the AZURE_KEY_VAULT_ENDPOINT environment variable"))
.key_name(env::var("AZURE_KEY_NAME").expect("Set the AZURE_KEY_NAME environment variable"))
.build();
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);
opts := options.Client().
ApplyURI(uri).
SetAutoEncryptionOptions(autoEncryptionOptions)
encryptedClient, err := mongo.Connect(opts)
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,
});
$encryptedClient = new \MongoDB\Client($uri, [], [
'autoEncryption' => $autoEncryptionOptions,
]);
encrypted_client = MongoClient(
uri, auto_encryption_opts=auto_encryption_options)
let encrypted_client = encrypted_client_builder
.extra_options(Some(doc!{
"cryptSharedLibPath": env::var("SHARED_LIB_PATH").expect("Set SHARED_LIB_PATH environment variable to path to crypt_shared library")
}))
.key_vault_client(Client::with_uri_str(uri).await.unwrap())
.build()
.await
.unwrap();
1

本教程中的代码示例使用以下变量来执行 Queryable Encryption 工作流:

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

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

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

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

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

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

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

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

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 - MongoDB 中将存储您的 DEK 的集合。将 keyVaultCollectionName 设置为 "__keyVault"

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

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

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

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

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

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 - MongoDB中将存储您的 DEK 的集合。 将其设置为"__keyVault"

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

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

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

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

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 - MongoDB中将存储您的 DEK 的集合。 将其设置为"__keyVault"

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

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

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

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

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 - MongoDB中将存储您的 DEK 的集合。 将其设置为"__keyVault"

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

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

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

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

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 。将 KMS_PROVIDER 环境变量设置为您的密钥提供商:'aws''azure''gcp''kmip'

  • $uri - 您的MongoDB 部署连接 URI。在 MONGODB_URI 环境变量中设置连接 URI。

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

  • $keyVaultCollectionName - MongoDB中将存储您的 DEK 的集合。将此变量设置为 '__keyVault',这是一种惯例,有助于防止将其误认为是用户集合。

  • $keyVaultNamespace - MongoDB中将存储您的 DEK 的命名空间。将此变量设置为 $keyVaultDatabaseName$keyVaultCollectionName 变量的值,并用句点分隔。

  • $cryptedDatabaseName — MongoDB中将存储您的加密数据的数据库。将此变量设置为 'medicalRecords'

  • $cryptedCollectionName — MongoDB中将存储您的加密数据的集合。将此变量设置为 'patients'

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

$kmsProviderName = getenv('KMS_PROVIDER');
$uri = getenv('MONGODB_URI'); // Your connection URI
$keyVaultDatabaseName = 'encryption';
$keyVaultCollectionName = '__keyVault';
$keyVaultNamespace = $keyVaultDatabaseName . '.' . $keyVaultCollectionName;
$encryptedDatabaseName = 'medicalRecords';
$encryptedCollectionName = 'patients';
  • kms_provider_name — 用于存储客户主密钥的KMS 。 将其设置为您的密钥提供商: "aws""azure""gcp""kmip"

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

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

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

  • key_vault_namespace - MongoDB中存储 DEK 的命名空间。 将其设置为key_vault_database_namekey_vault_collection_name变量的值,并用句点分隔。

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

  • encryption_collection_name - MongoDB中将存储您的加密加密的集合。 将其设置为"patients"

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

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"
  • kms_provider_name - 您用来存储客户主密钥的KMS 。 在本教程中,将此变量设置为"local"

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

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

  • key_vault_collection_name - MongoDB中将存储您的 DEK 的集合。 将此变量设置为"__keyVault" ,这是一种约定,有助于防止将其误认为是用户集合。

  • key_vault_namespace - MongoDB中存储 DEK 的命名空间。将此变量设置为 Namespace 结构,并传递 key_vault_database_namekey_vault_collection_name 变量的值。

  • encryption_database_name - MongoDB中将存储您的加密加密的数据库。 将此变量设置为"medicalRecords"

  • encryption_collection_name - MongoDB中将存储您的加密加密的集合。 将此变量设置为"patients"

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

let kms_provider_name = "<KMS provider name>";
let uri = env::var("MONGODB_URI").expect("Set MONGODB_URI environment variable to your connection string");
let key_vault_database_name = "encryption";
let key_vault_collection_name = "__keyVault";
let key_vault_namespace = Namespace::new(key_vault_database_name, key_vault_collection_name);
let encrypted_database_name = "medicalRecords";
let encrypted_collection_name = "patients";

重要

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

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

提示

环境变量

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

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

提示

环境变量

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

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

提示

环境变量

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

要了解如何设置这些环境变量,请参阅 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
},
};

您还可以通过传入一个字符串来为KMS提供商提供自定义名称,该字符串包括KMS提供商的名称,后跟冒号和自定义名称。 通过为KMS提供商提供唯一名称,您可以指定多个同一类型的KMS提供程序。

示例,您可以在KMS凭证变量中将GCP KMS提供商命名为“my_gcp_provider”,如以下代码所示:

kmsProviderCredentials = {
"gcp:my_gcp_provider": {
email: process.env["GCP_EMAIL"], // Your GCP email
privateKey: process.env["GCP_PRIVATE_KEY"], // Your GCP private key
},
};

注意:本教程中的其余步骤使用默认KMS提供商字符串 "gcp"

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);

您还可以通过传入一个字符串来为KMS提供商提供自定义名称,该字符串包括KMS提供商的名称,后跟冒号和自定义名称。 通过为KMS提供商提供唯一名称,您可以指定多个同一类型的KMS提供程序。

示例,您可以在KMS凭证变量中将GCP KMS提供商命名为“my_gcp_provider”,如以下代码所示:

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:my_gcp_provider", kmsOptions);

注意:本教程中的其余步骤使用默认KMS提供商字符串 "gcp"

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);

您还可以通过传入一个字符串来为KMS提供商提供自定义名称,该字符串包括KMS提供商的名称,后跟冒号和自定义名称。 通过为KMS提供商提供唯一名称,您可以指定多个同一类型的KMS提供程序。

示例,您可以在KMS凭证变量中将GCP KMS提供商命名为“my_gcp_provider”,如以下代码所示:

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:my_gcp_provider", kmsProviderDetails);

注意:本教程中的其余步骤使用默认KMS提供商字符串 "gcp"

kmsProviders = {
gcp: {
email: process.env.GCP_EMAIL, // Your GCP email
privateKey: process.env.GCP_PRIVATE_KEY, // Your GCP private key
},
};

您还可以通过传入一个字符串来为KMS提供商提供自定义名称,该字符串包括KMS提供商的名称,后跟冒号和自定义名称。 通过为KMS提供商提供唯一名称,您可以指定多个同一类型的KMS提供程序。

示例,您可以在KMS凭证变量中将GCP KMS提供商命名为“my_gcp_provider”,如以下代码所示:

kmsProviders = {
"gcp:my_gcp_provider": {
email: process.env.GCP_EMAIL, // Your GCP email
privateKey: process.env.GCP_PRIVATE_KEY, // Your GCP private key
},
};

注意:本教程中的其余步骤使用默认KMS提供商字符串 "gcp"

$kmsProviders = [
'gcp' => [
'email' => getenv('GCP_EMAIL'), // Your GCP email
'privateKey' => getenv('GCP_PRIVATE_KEY'), // Your GCP private key
],
];

您还可以通过传入一个字符串来为KMS提供商提供自定义名称,该字符串包括KMS提供商的名称,后跟冒号和自定义名称。 通过为KMS提供商提供唯一名称,您可以指定多个同一类型的KMS提供程序。

示例,您可以在KMS凭证变量中将GCP KMS提供商命名为“my_gcp_provider”,如以下代码所示:

$kmsProviders = [
'gcp:my_gcp_provider' => [
'email' => getenv('GCP_EMAIL'), // Your GCP email
'privateKey' => getenv('GCP_PRIVATE_KEY'), // Your GCP private key
],
];

注意:本教程中的其余步骤使用默认KMS提供商字符串 'gcp'

kms_provider_credentials = {
"gcp": {
"email": os.environ['GCP_EMAIL'], # Your GCP email
"privateKey": os.environ['GCP_PRIVATE_KEY'] # Your GCP private key
}
}

您还可以通过传入一个字符串来为KMS提供商提供自定义名称,该字符串包括KMS提供商的名称,后跟冒号和自定义名称。 通过为KMS提供商提供唯一名称,您可以指定多个同一类型的KMS提供程序。

示例,您可以在KMS凭证变量中将GCP KMS提供商命名为“my_gcp_provider”,如以下代码所示:

kms_provider_credentials = {
"gcp:my_gcp_provider": {
"email": os.environ['GCP_EMAIL'], # Your GCP email
"privateKey": os.environ['GCP_PRIVATE_KEY'] # Your GCP private key
}
}

注意:本教程中的其余步骤使用默认KMS提供商字符串 "gcp"

kms_providers = vec![(
KmsProvider::gcp(),
doc! {
"email": env::var("GCP_EMAIL").expect("Set GCP_EMAIL environment variable"),
"privateKey": env::var("GCP_PRIVATE_KEY").expect("Set GCP_PRIVATE_KEY environment variable"),
},
None,
)];

您还可以为KMS提供商提供自定义名称,方法是将名称作为字符串传递给 with_name() 函数。 通过为KMS提供商提供唯一名称,您可以指定多个同一类型的KMS提供程序。

示例,您可以在KMS凭证变量中将GCP KMS提供商命名为“my_gcp_provider”,如以下代码所示:

kms_providers = vec![(
KmsProvider::gcp().with_name("my_gcp_provider"),
doc! {
"email": env::var("GCP_EMAIL").expect("Set GCP_EMAIL environment variable"),
"privateKey": env::var("GCP_PRIVATE_KEY").expect("Set GCP_PRIVATE_KEY environment variable"),
},
None,
)];

注意:本教程中的其余步骤使用默认KMS提供商字符串 "gcp"

3

创建一个包含以下结构的客户主密钥凭证的变量。 使用您在创建集合扫描凭证记录的档案。

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
};
$customerMasterKeyCredentials = [
'projectId' => getenv('GCP_PROJECT_ID'), // Your GCP Project ID
'location' => getenv('GCP_LOCATION'), // Your GCP Key Location
'keyRing' => getenv('GCP_KEY_RING'), // Your GCP Key Ring
'keyName' => getenv('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
}
let gcp_master_key = GcpMasterKey::builder()
.project_id(env::var("GCP_PROJECT_ID").expect("Set the GCP_PROJECT_ID environment variable"))
.location(env::var("GCP_LOCATION").expect("Set the GCP_LOCATION environment variable"))
.key_ring(env::var("GCP_KEY_RING").expect("Set the GCP_KEY_RING environment variable"))
.key_name(env::var("GCP_KEY_NAME").expect("Set the GCP_KEY_NAME environment variable"))
.build();
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);
opts := options.Client().
ApplyURI(uri).
SetAutoEncryptionOptions(autoEncryptionOptions)
encryptedClient, err := mongo.Connect(opts)
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,
});
$encryptedClient = new \MongoDB\Client($uri, [], [
'autoEncryption' => $autoEncryptionOptions,
]);
encrypted_client = MongoClient(
uri, auto_encryption_opts=auto_encryption_options)
let encrypted_client = encrypted_client_builder
.extra_options(Some(doc!{
"cryptSharedLibPath": env::var("SHARED_LIB_PATH").expect("Set SHARED_LIB_PATH environment variable to path to crypt_shared library")
}))
.key_vault_client(Client::with_uri_str(uri).await.unwrap())
.build()
.await
.unwrap();
1

本教程中的代码示例使用以下变量来执行 Queryable Encryption 工作流:

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

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

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

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

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

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

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

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

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 - MongoDB 中将存储您的 DEK 的集合。将 keyVaultCollectionName 设置为 "__keyVault"

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

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

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

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

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

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 - MongoDB中将存储您的 DEK 的集合。 将其设置为"__keyVault"

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

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

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

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

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 - MongoDB中将存储您的 DEK 的集合。 将其设置为"__keyVault"

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

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

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

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

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 - MongoDB中将存储您的 DEK 的集合。 将其设置为"__keyVault"

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

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

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

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

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 。将 KMS_PROVIDER 环境变量设置为您的密钥提供商:'aws''azure''gcp''kmip'

  • $uri - 您的MongoDB 部署连接 URI。在 MONGODB_URI 环境变量中设置连接 URI。

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

  • $keyVaultCollectionName - MongoDB中将存储您的 DEK 的集合。将此变量设置为 '__keyVault',这是一种惯例,有助于防止将其误认为是用户集合。

  • $keyVaultNamespace - MongoDB中将存储您的 DEK 的命名空间。将此变量设置为 $keyVaultDatabaseName$keyVaultCollectionName 变量的值,并用句点分隔。

  • $cryptedDatabaseName — MongoDB中将存储您的加密数据的数据库。将此变量设置为 'medicalRecords'

  • $cryptedCollectionName — MongoDB中将存储您的加密数据的集合。将此变量设置为 'patients'

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

$kmsProviderName = getenv('KMS_PROVIDER');
$uri = getenv('MONGODB_URI'); // Your connection URI
$keyVaultDatabaseName = 'encryption';
$keyVaultCollectionName = '__keyVault';
$keyVaultNamespace = $keyVaultDatabaseName . '.' . $keyVaultCollectionName;
$encryptedDatabaseName = 'medicalRecords';
$encryptedCollectionName = 'patients';
  • kms_provider_name — 用于存储客户主密钥的KMS 。 将其设置为您的密钥提供商: "aws""azure""gcp""kmip"

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

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

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

  • key_vault_namespace - MongoDB中存储 DEK 的命名空间。 将其设置为key_vault_database_namekey_vault_collection_name变量的值,并用句点分隔。

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

  • encryption_collection_name - MongoDB中将存储您的加密加密的集合。 将其设置为"patients"

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

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"
  • kms_provider_name - 您用来存储客户主密钥的KMS 。 在本教程中,将此变量设置为"local"

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

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

  • key_vault_collection_name - MongoDB中将存储您的 DEK 的集合。 将此变量设置为"__keyVault" ,这是一种约定,有助于防止将其误认为是用户集合。

  • key_vault_namespace - MongoDB中存储 DEK 的命名空间。将此变量设置为 Namespace 结构,并传递 key_vault_database_namekey_vault_collection_name 变量的值。

  • encryption_database_name - MongoDB中将存储您的加密加密的数据库。 将此变量设置为"medicalRecords"

  • encryption_collection_name - MongoDB中将存储您的加密加密的集合。 将此变量设置为"patients"

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

let kms_provider_name = "<KMS provider name>";
let uri = env::var("MONGODB_URI").expect("Set MONGODB_URI environment variable to your connection string");
let key_vault_database_name = "encryption";
let key_vault_collection_name = "__keyVault";
let key_vault_namespace = Namespace::new(key_vault_database_name, key_vault_collection_name);
let encrypted_database_name = "medicalRecords";
let encrypted_collection_name = "patients";

重要

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

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

提示

环境变量

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

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

提示

环境变量

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

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

提示

环境变量

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

要了解如何设置这些环境变量,请参阅 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
},
};

您还可以通过传入一个字符串来为KMS提供商提供自定义名称,该字符串包括KMS提供商的名称,后跟冒号和自定义名称。 通过为KMS提供商提供唯一名称,您可以指定多个同一类型的KMS提供程序。

示例,您可以在KMS凭证变量中将 KMIP KMS提供商命名为“my_kmip_provider”,如以下代码所示:

kmsProviderCredentials = {
"kmip:my_kmip_provider": {
endpoint: process.env["KMIP_KMS_ENDPOINT"], // Your KMIP KMS endpoint
},
};

注意:本教程中的其余步骤使用默认KMS提供商字符串 "kmip"

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);

您还可以通过传入一个字符串来为KMS提供商提供自定义名称,该字符串包括KMS提供商的名称,后跟冒号和自定义名称。 通过为KMS提供商提供唯一名称,您可以指定多个同一类型的KMS提供程序。

示例,您可以在KMS凭证变量中将 KMIP KMS提供商命名为“my_kmip_provider”,如以下代码所示:

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:my_kmip_provider", kmsOptions);

注意:本教程中的其余步骤使用默认KMS提供商字符串 "kmip"

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);

您还可以通过传入一个字符串来为KMS提供商提供自定义名称,该字符串包括KMS提供商的名称,后跟冒号和自定义名称。 通过为KMS提供商提供唯一名称,您可以指定多个同一类型的KMS提供程序。

示例,您可以在KMS凭证变量中将 KMIP KMS提供商命名为“my_kmip_provider”,如以下代码所示:

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:my_kmip_provider", kmsProviderDetails);

注意:本教程中的其余步骤使用默认KMS提供商字符串 "kmip"

kmsProviders = {
kmip: {
endpoint: process.env.KMIP_KMS_ENDPOINT, // Your KMIP KMS endpoint
},
};

您还可以通过传入一个字符串来为KMS提供商提供自定义名称,该字符串包括KMS提供商的名称,后跟冒号和自定义名称。 通过为KMS提供商提供唯一名称,您可以指定多个同一类型的KMS提供程序。

示例,您可以在KMS凭证变量中将 KMIP KMS提供商命名为“my_kmip_provider”,如以下代码所示:

kmsProviders = {
"kmip:my_kmip_provider": {
endpoint: process.env.KMIP_KMS_ENDPOINT, // Your KMIP KMS endpoint
},
};

注意:本教程中的其余步骤使用默认KMS提供商字符串 "kmip"

$kmsProviders = [
'kmip' => [
'endpoint' => getenv('KMIP_ENDPOINT'), // Your KMIP endpoint
],
];

您还可以通过传入一个字符串来为KMS提供商提供自定义名称,该字符串包括KMS提供商的名称,后跟冒号和自定义名称。 通过为KMS提供商提供唯一名称,您可以指定多个同一类型的KMS提供程序。

示例,您可以在KMS凭证变量中将 KMIP KMS提供商命名为“my_kmip_provider”,如以下代码所示:

$kmsProviders = [
'kmip:my_kmip_provider' => [
'endpoint' => getenv('KMIP_ENDPOINT'), // Your KMIP endpoint
],
];

注意:本教程中的其余步骤使用默认KMS提供商字符串 'kmip'

kms_provider_credentials = {
"kmip": {
"endpoint": os.environ['KMIP_KMS_ENDPOINT'] # Your KMIP KMS endpoint
}
}

您还可以通过传入一个字符串来为KMS提供商提供自定义名称,该字符串包括KMS提供商的名称,后跟冒号和自定义名称。 通过为KMS提供商提供唯一名称,您可以指定多个同一类型的KMS提供程序。

示例,您可以在KMS凭证变量中将 KMIP KMS提供商命名为“my_kmip_provider”,如以下代码所示:

kms_provider_credentials = {
"kmip:my_kmip_provider": {
"endpoint": os.environ['KMIP_KMS_ENDPOINT'] # Your KMIP KMS endpoint
}
}

注意:本教程中的其余步骤使用默认KMS提供商字符串 "kmip"

kms_providers = vec![(
KmsProvider::kmip(),
doc! {
"endpoint": env::var("KMIP_KMS_ENDPOINT").expect("Set KMIP_KMS_ENDPOINT environment variable")
},
Some(get_kmip_tls_options()),
)];

您还可以为KMS提供商提供自定义名称,方法是将名称作为字符串传递给 with_name() 函数。 通过为KMS提供商提供唯一名称,您可以指定多个同一类型的KMS提供程序。

示例,您可以在KMS凭证变量中将 KMIP KMS提供商命名为“my_kmip_provider”,如以下代码所示:

kms_providers = vec![(
KmsProvider::kmip().with_name("my_kmip_provider"),
doc! {
"endpoint": env::var("KMIP_KMS_ENDPOINT").expect("Set KMIP_KMS_ENDPOINT environment variable")
},
Some(get_kmip_tls_options()),
)];

注意:本教程中的其余步骤使用默认KMS提供商字符串 "kmip"

3

创建一个空对象,如以下代码示例所示。 这会提示符合KMIP的提供商生成新的客户主密钥。

customerMasterKeyCredentials = {};
var customerMasterKeyCredentials = new BsonDocument();
cmkCredentials := map[string]string{}
BsonDocument customerMasterKeyCredentials = new BsonDocument();
customerMasterKeyCredentials = {};
$customerMasterKeyCredentials = [];
customer_master_key_credentials = {}
let kmip_master_key = KmipMasterKey::builder().build();
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);
opts := options.Client().
ApplyURI(uri).
SetAutoEncryptionOptions(autoEncryptionOptions)
encryptedClient, err := mongo.Connect(opts)
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,
});
$encryptedClient = new \MongoDB\Client($uri, [], [
'autoEncryption' => $autoEncryptionOptions,
]);
encrypted_client = MongoClient(
uri, auto_encryption_opts=auto_encryption_options)
let encrypted_client = encrypted_client_builder
.extra_options(Some(doc!{
"cryptSharedLibPath": env::var("SHARED_LIB_PATH").expect("Set SHARED_LIB_PATH environment variable to path to crypt_shared library")
}))
.key_vault_client(Client::with_uri_str(uri).await.unwrap())
.build()
.await
.unwrap();

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

后退

创建客户主密钥

在此页面上