encryption
– Client-Side Field Level Encryption¶
Support for explicit client-side field level encryption.
- class pymongo.encryption.Algorithm(value)¶
An enum that defines the supported encryption algorithms.
- AEAD_AES_256_CBC_HMAC_SHA_512_Deterministic = 'AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic'¶
AEAD_AES_256_CBC_HMAC_SHA_512_Deterministic.
- AEAD_AES_256_CBC_HMAC_SHA_512_Random = 'AEAD_AES_256_CBC_HMAC_SHA_512-Random'¶
AEAD_AES_256_CBC_HMAC_SHA_512_Random.
- INDEXED = 'Indexed'¶
Indexed.
Note
Support for Queryable Encryption is in beta. Backwards-breaking changes may be made before the final release.
New in version 4.2.
- UNINDEXED = 'Unindexed'¶
Unindexed.
Note
Support for Queryable Encryption is in beta. Backwards-breaking changes may be made before the final release.
New in version 4.2.
- class pymongo.encryption.ClientEncryption(kms_providers: Mapping[str, Any], key_vault_namespace: str, key_vault_client: pymongo.mongo_client.MongoClient, codec_options: bson.codec_options.CodecOptions, kms_tls_options: Optional[Mapping[str, Any]] = None)¶
Explicit client-side field level encryption.
The ClientEncryption class encapsulates explicit operations on a key vault collection that cannot be done directly on a MongoClient. Similar to configuring auto encryption on a MongoClient, it is constructed with a MongoClient (to a MongoDB cluster containing the key vault collection), KMS provider configuration, and keyVaultNamespace. It provides an API for explicitly encrypting and decrypting values, and creating data keys. It does not provide an API to query keys from the key vault collection, as this can be done directly on the MongoClient.
See Explicit Encryption for an example.
- Parameters
kms_providers: Map of KMS provider options. The kms_providers map values differ by provider:
aws: Map with “accessKeyId” and “secretAccessKey” as strings. These are the AWS access key ID and AWS secret access key used to generate KMS messages. An optional “sessionToken” may be included to support temporary AWS credentials.
azure: Map with “tenantId”, “clientId”, and “clientSecret” as strings. Additionally, “identityPlatformEndpoint” may also be specified as a string (defaults to ‘login.microsoftonline.com’). These are the Azure Active Directory credentials used to generate Azure Key Vault messages.
gcp: Map with “email” as a string and “privateKey” as bytes or a base64 encoded string. Additionally, “endpoint” may also be specified as a string (defaults to ‘oauth2.googleapis.com’). These are the credentials used to generate Google Cloud KMS messages.
kmip: Map with “endpoint” as a host with required port. For example:
{"endpoint": "example.com:443"}
.local: Map with “key” as bytes (96 bytes in length) or a base64 encoded string which decodes to 96 bytes. “key” is the master key used to encrypt/decrypt data keys. This key should be generated and stored as securely as possible.
key_vault_namespace: The namespace for the key vault collection. The key vault collection contains all data keys used for encryption and decryption. Data keys are stored as documents in this MongoDB collection. Data keys are protected with encryption by a KMS provider.
key_vault_client: A MongoClient connected to a MongoDB cluster containing the key_vault_namespace collection.
codec_options: An instance of
CodecOptions
to use when encoding a value for encryption and decoding the decrypted BSON value. This should be the same CodecOptions instance configured on the MongoClient, Database, or Collection used to access application data.kms_tls_options (optional): A map of KMS provider names to TLS options to use when creating secure connections to KMS providers. Accepts the same TLS options as
pymongo.mongo_client.MongoClient
. For example, to override the system default CA file:kms_tls_options={'kmip': {'tlsCAFile': certifi.where()}}
Or to supply a client certificate:
kms_tls_options={'kmip': {'tlsCertificateKeyFile': 'client.pem'}}
Changed in version 4.0: Added the kms_tls_options parameter and the “kmip” KMS provider.
New in version 3.9.
- add_key_alt_name(id: bson.binary.Binary, key_alt_name: str) Any ¶
Add
key_alt_name
to the set of alternate names in the key document with UUIDkey_id
.- Parameters
id
: The UUID of a key a which must be aBinary
with subtype 4 (UUID_SUBTYPE
).key_alt_name
: The key alternate name to add.
- Returns
The previous version of the key document.
New in version 4.2.
- close() None ¶
Release resources.
Note that using this class in a with-statement will automatically call
close()
:with ClientEncryption(...) as client_encryption: encrypted = client_encryption.encrypt(value, ...) decrypted = client_encryption.decrypt(encrypted)
- create_data_key(kms_provider: str, master_key: Optional[Mapping[str, Any]] = None, key_alt_names: Optional[Sequence[str]] = None, key_material: Optional[bytes] = None) bson.binary.Binary ¶
Create and insert a new data key into the key vault collection.
- Parameters
kms_provider: The KMS provider to use. Supported values are “aws”, “azure”, “gcp”, “kmip”, and “local”.
master_key: Identifies a KMS-specific key used to encrypt the new data key. If the kmsProvider is “local” the master_key is not applicable and may be omitted.
If the kms_provider is “aws” it is required and has the following fields:
- `region` (string): Required. The AWS region, e.g. "us-east-1". - `key` (string): Required. The Amazon Resource Name (ARN) to the AWS customer. - `endpoint` (string): Optional. An alternate host to send KMS requests to. May include port number, e.g. "kms.us-east-1.amazonaws.com:443".
If the kms_provider is “azure” it is required and has the following fields:
- `keyVaultEndpoint` (string): Required. Host with optional port, e.g. "example.vault.azure.net". - `keyName` (string): Required. Key name in the key vault. - `keyVersion` (string): Optional. Version of the key to use.
If the kms_provider is “gcp” it is required and has the following fields:
- `projectId` (string): Required. The Google cloud project ID. - `location` (string): Required. The GCP location, e.g. "us-east1". - `keyRing` (string): Required. Name of the key ring that contains the key to use. - `keyName` (string): Required. Name of the key to use. - `keyVersion` (string): Optional. Version of the key to use. - `endpoint` (string): Optional. Host with optional port. Defaults to "cloudkms.googleapis.com".
If the kms_provider is “kmip” it is optional and has the following fields:
- `keyId` (string): Optional. `keyId` is the KMIP Unique Identifier to a 96 byte KMIP Secret Data managed object. If keyId is omitted, the driver creates a random 96 byte KMIP Secret Data managed object. - `endpoint` (string): Optional. Host with optional port, e.g. "example.vault.azure.net:".
key_alt_names (optional): An optional list of string alternate names used to reference a key. If a key is created with alternate names, then encryption may refer to the key by the unique alternate name instead of by
key_id
. The following example shows creating and referring to a data key by alternate name:client_encryption.create_data_key("local", keyAltNames=["name1"]) # reference the key with the alternate name client_encryption.encrypt("457-55-5462", keyAltName="name1", algorithm=Algorithm.AEAD_AES_256_CBC_HMAC_SHA_512_Random)
key_material (optional): Sets the custom key material to be used by the data key for encryption and decryption.
- Returns
The
_id
of the created data key document as aBinary
with subtypeUUID_SUBTYPE
.
Changed in version 4.2: Added the key_material parameter.
- decrypt(value: bson.binary.Binary) Any ¶
Decrypt an encrypted value.
- Parameters
value (Binary): The encrypted value, a
Binary
with subtype 6.
- Returns
The decrypted BSON value.
- delete_key(id: bson.binary.Binary) pymongo.results.DeleteResult ¶
Delete a key document in the key vault collection that has the given
key_id
.- Parameters
id (Binary): The UUID of a key a which must be a
Binary
with subtype 4 (UUID_SUBTYPE
).
- Returns
The delete result.
New in version 4.2.
- encrypt(value: Any, algorithm: str, key_id: Optional[bson.binary.Binary] = None, key_alt_name: Optional[str] = None, query_type: Optional[str] = None, contention_factor: Optional[int] = None) bson.binary.Binary ¶
Encrypt a BSON value with a given key and algorithm.
Note that exactly one of
key_id
orkey_alt_name
must be provided.- Parameters
value: The BSON value to encrypt.
algorithm (string): The encryption algorithm to use. See
Algorithm
for some valid options.key_id: Identifies a data key by
_id
which must be aBinary
with subtype 4 (UUID_SUBTYPE
).key_alt_name: Identifies a key vault document by ‘keyAltName’.
query_type (str): (BETA) The query type to execute. See
QueryType
for valid options.contention_factor (int): (BETA) The contention factor to use when the algorithm is
Algorithm.INDEXED
. An integer value must be given when theAlgorithm.INDEXED
algorithm is used.
Note
query_type and contention_factor are part of the Queryable Encryption beta. Backwards-breaking changes may be made before the final release.
- Returns
The encrypted value, a
Binary
with subtype 6.
Changed in version 4.2: Added the query_type and contention_factor parameters.
- get_key(id: bson.binary.Binary) Optional[bson.raw_bson.RawBSONDocument] ¶
Get a data key by id.
- Parameters
id (Binary): The UUID of a key a which must be a
Binary
with subtype 4 (UUID_SUBTYPE
).
- Returns
The key document.
New in version 4.2.
- get_key_by_alt_name(key_alt_name: str) Optional[bson.raw_bson.RawBSONDocument] ¶
Get a key document in the key vault collection that has the given
key_alt_name
.- Parameters
key_alt_name: (str): The key alternate name of the key to get.
- Returns
The key document.
New in version 4.2.
- get_keys() pymongo.cursor.Cursor[bson.raw_bson.RawBSONDocument] ¶
Get all of the data keys.
- Returns
An instance of
Cursor
over the data key documents.
New in version 4.2.
- remove_key_alt_name(id: bson.binary.Binary, key_alt_name: str) Optional[bson.raw_bson.RawBSONDocument] ¶
Remove
key_alt_name
from the set of keyAltNames in the key document with UUIDid
.Also removes the
keyAltNames
field from the key document if it would otherwise be empty.- Parameters
id
: The UUID of a key a which must be aBinary
with subtype 4 (UUID_SUBTYPE
).key_alt_name
: The key alternate name to remove.
- Returns
Returns the previous version of the key document.
New in version 4.2.
- rewrap_many_data_key(filter: Mapping[str, Any], provider: Optional[str] = None, master_key: Optional[Mapping[str, Any]] = None) pymongo.encryption.RewrapManyDataKeyResult ¶
Decrypts and encrypts all matching data keys in the key vault with a possibly new master_key value.
- Parameters
filter: A document used to filter the data keys.
provider: The new KMS provider to use to encrypt the data keys, or
None
to use the current KMS provider(s).master_key
: The master key fields corresponding to the new KMS provider whenprovider
is notNone
.
- Returns
New in version 4.2.
- class pymongo.encryption.QueryType(value)¶
(BETA) An enum that defines the supported values for explicit encryption query_type.
Note
Support for Queryable Encryption is in beta. Backwards-breaking changes may be made before the final release.
New in version 4.2.
- EQUALITY = 'equality'¶
Used to encrypt a value for an equality query.
- class pymongo.encryption.RewrapManyDataKeyResult(bulk_write_result: Optional[pymongo.results.BulkWriteResult] = None)¶
Result object returned by a
rewrap_many_data_key()
operation.New in version 4.2.
- property bulk_write_result: Optional[pymongo.results.BulkWriteResult]¶
The result of the bulk write operation used to update the key vault collection with one or more rewrapped data keys. If
rewrap_many_data_key()
does not find any matching keys to rewrap, no bulk write operation will be executed and this field will beNone
.