Criptografia em execução
Nesta página
- Dependencies
crypt_shared
mongocryptd
- Gerenciando chaves de criptografia
- Criando uma chave de criptografia
- Referenciando chaves de criptografia por um nome alternativo
- Criptografia no nível de campo do cliente
- Criptografia automática no nível do campo do lado do cliente
- Aplicação de criptografia em nível de campo no lado do servidor
- Fornecimento de regras de criptografia automática local
- Criptografia explícita
- Criptografia explícita com descriptografia automática
- Queryable Encryption
- Queryable Encryption automática
- Queryable Encryption explícita
Dependencies
Para começar a usar a criptografia em uso em seu projeto, a extensão precisará ser compilado com libmongocrypt (habilitado por padrão).
Além disso, crypt_shared
ou mongocryptd
são necessários para usar a criptografia automática do lado do cliente . Nenhum dos dois é necessário para a criptografia explícita .
crypt_shared
A Biblioteca compartilhada de criptografia automática (crypt_shared
) fornece a mesma funcionalidade que mongocryptd
, mas não exige que você inicie outro processo para executar a criptografia automática.
Por padrão, a extensão tenta carregar crypt_shared
do(s) caminho(s) do sistema e o usa automaticamente se encontrado. Para carregar crypt_shared
de outro local, use a opção de cryptSharedLibPath
driver de criptografia automática ao construir um cliente. Se a extensão não puder carregar crypt_shared
, ela tentará voltar a usar mongocryptd
por padrão. A opção cryptSharedLibRequired
pode ser usada para sempre exigir crypt_shared
e falhar se ela não puder ser carregada.
Para obter instruções de instalação detalhadas, consulte a documentação do MongoDB para a Biblioteca compartilhada de criptografia automática.
mongocryptd
O binário mongocryptd
é um requisito alternativo para a criptografia automática do lado do cliente e está incluído como componente no pacoteMongoDB Enterprise MongoDB Server. Para obter instruções de instalação detalhadas, consulte a documentação do MongoDB em mongocryptd.
mongocryptd
executa o seguinte:
Analisa as regras de criptografia automática especificadas na configuração do cliente. Se a opção de driver de criptografia automática
schemaMap
contiver sintaxe inválida,mongocryptd
retornará um erro.Usa as regras de criptografia automática especificadas para marcar campos em operações de leitura e gravação para criptografia.
Rejeita operações de leitura/gravação que podem retornar resultados inesperados ou incorretos quando aplicadas a um campo criptografado. Para operações suportadas e não suportadas, consulte Operações suportadas para criptografia automática.
Um cliente configurado com criptografia automática gerará automaticamente o processo mongocryptd
a partir do PATH
do aplicativo. Os aplicativos podem controlar o comportamento de desova por meio de várias opções de driver de criptografia automática.
mongocryptd
é responsável apenas por oferecer suporte à criptografia automática do lado do cliente e não executa nenhuma criptografia ou descriptografia.
Gerenciando chaves de criptografia
Dica
Veja também:
Criando uma chave de criptografia
Observação
Os exemplos a seguir usam uma chave mestre local. Embora isso seja adequado para desenvolvimento, um aplicativo de produção deve usar um provedor de nuvem compatível (por exemplo, Amazon Web Services KMS). A chave mestre é usada para criptografar chaves de dados armazenadas localmente e, portanto, é muito importante que você mantenha essa chave segura.
Para criar uma chave de criptografia, crie um MongoDB\Driver\ClientEncryption instância com opções de criptografia e use o método createDataKey() método. O método retornará o ID da chave que pode ser usado para fazer referência à chave posteriormente. Você também pode passar vários nomes alternativos para essa chave e fazer referência à chave por esses nomes em vez do ID da chave.
A criação de uma nova chave de criptografia de dados normalmente seria feita na implantação inicial, mas, dependendo do seu caso de uso, talvez você queira usar mais de uma chave de criptografia (por exemplo chaves de encriptação específicas do usuário) ou crie-as dinamicamente.
use MongoDB\BSON\Binary; use MongoDB\Client; use MongoDB\Driver\ClientEncryption; require __DIR__ . '/../../../vendor/autoload.php'; $uri = getenv('MONGODB_URI') ?: 'mongodb://127.0.0.1/'; // Generate a secure local key to use for this script $localKey = new Binary(random_bytes(96)); // Create a client with no encryption options $client = new Client($uri); /* Prepare the database for this script. Drop the key vault collection and * ensure it has a unique index for keyAltNames. This would typically be done * during application deployment. */ $client->selectCollection('encryption', '__keyVault')->drop(); $client->selectCollection('encryption', '__keyVault')->createIndex(['keyAltNames' => 1], [ 'unique' => true, 'partialFilterExpression' => ['keyAltNames' => ['$exists' => true]], ]); // Create a ClientEncryption object to manage data encryption keys $clientEncryption = $client->createClientEncryption([ 'keyVaultNamespace' => 'encryption.__keyVault', 'kmsProviders' => [ 'local' => ['key' => $localKey], ], ]); /* Create a data encryption key. To store the key ID for later use, you can use * serialize(), var_export(), etc. */ $keyId = $clientEncryption->createDataKey('local'); print_r($keyId); // Encrypt a value using the key that was just created $encryptedValue = $clientEncryption->encrypt('mySecret', [ 'algorithm' => ClientEncryption::AEAD_AES_256_CBC_HMAC_SHA_512_DETERMINISTIC, 'keyId' => $keyId, ]); print_r($encryptedValue);
Referenciando chaves de criptografia por um nome alternativo
Para fazer referência a chaves em seu aplicativo, você pode usar o atributo keyAltName
especificado ao criar a chave. O exemplo a seguir cria uma chave de criptografia com um nome alternativo, o que pode ser feito ao implantar o aplicativo. Em seguida, o script criptografa dados referenciando a chave por seu nome alternativo usando a opção keyAltName
em vez de keyId
.
Observação
Antes de adicionar um novo nome alternativo da chave, você deve criar um índice único e parcial no campo keyAltNames
. A criptografia do nível do campo no lado do cliente depende da singularidade imposta pelo servidor dos principais nomes alternativos.
use MongoDB\BSON\Binary; use MongoDB\Client; use MongoDB\Driver\ClientEncryption; use MongoDB\Driver\Exception\ServerException; require __DIR__ . '/../../../vendor/autoload.php'; $uri = getenv('MONGODB_URI') ?: 'mongodb://127.0.0.1/'; // Generate a secure local key to use for this script $localKey = new Binary(random_bytes(96)); // Create a client with no encryption options $client = new Client($uri); /* Prepare the database for this script. Drop the key vault collection and * ensure it has a unique index for keyAltNames. This would typically be done * during application deployment. */ $client->selectCollection('encryption', '__keyVault')->drop(); $client->selectCollection('encryption', '__keyVault')->createIndex(['keyAltNames' => 1], [ 'unique' => true, 'partialFilterExpression' => ['keyAltNames' => ['$exists' => true]], ]); // Create a ClientEncryption object to manage data encryption keys $clientEncryption = $client->createClientEncryption([ 'keyVaultNamespace' => 'encryption.__keyVault', 'kmsProviders' => [ 'local' => ['key' => $localKey], ], ]); // Create a data encryption key with an alternate name $clientEncryption->createDataKey('local', ['keyAltNames' => ['myDataKey']]); /* Attempt to create a second key with the same name to demonstrate that the * unique index is enforced. */ try { $clientEncryption->createDataKey('local', ['keyAltNames' => ['myDataKey']]); } catch (ServerException $e) { printf("Error creating key: %s\n", $e->getMessage()); } // Encrypt a value, using the "keyAltName" option instead of "keyId" $encryptedValue = $clientEncryption->encrypt('mySecret', [ 'algorithm' => ClientEncryption::AEAD_AES_256_CBC_HMAC_SHA_512_DETERMINISTIC, 'keyAltName' => 'myDataKey', ]); print_r($encryptedValue);
Criptografia no nível de campo do cliente
Introduzido no MongoDB 4.2, A criptografia no nível do campo do lado do cliente permite que um aplicativo criptografe campos de dados específicos, além dos recursos de criptografia pré-existentes do MongoDB, como Encryption at rest e TLS/SSL (Transport Encryption).
Com a criptografia em nível de campo, os aplicativos podem criptografar campos em documentos antes de transmitir dados pela rede para o servidor. A criptografia no nível do campo no lado do cliente oferece suporte a cargas de trabalho em que os aplicativos devem garantir que partes não autorizadas, incluindo administradores de servidor, não possam ler os dados criptografados.
Criptografia automática no nível do campo do lado do cliente
Observação
A criptografia automática no nível do campo no lado do cliente requer MongoDB 4.2+ Enterprise ou MongoDB 4.2+ Atlas cluster.
A criptografia automática em nível de campo do lado do cliente é ativada com a criação de um cliente e a especificação da autoEncryption
opção de driver . Os exemplos a seguir demonstram como configurar a criptografia automática em nível de campo do lado do cliente e usar um MongoDB\Driver\ClientEncryption objeto para criar uma nova chave de encriptação.
Aplicação de criptografia em nível de campo no lado do servidor
O servidor MongoDB 4.2+ suporta o uso de validação de esquema para impor a criptografia de campos específicos em uma coleção. Essa validação de esquema impedirá que um aplicativo insira valores não criptografados para quaisquer campos marcados com a palavra-chave de esquema "encrypt".
O exemplo a seguir define uma collection com criptografia automática usando um validador $jsonSchema
e a sintaxe do Encryption Schema. Os dados no campo encryptedField
são criptografados automaticamente na inserção e descriptografados ao ler no lado do cliente.
use MongoDB\BSON\Binary; use MongoDB\Client; use MongoDB\Driver\ClientEncryption; use MongoDB\Driver\Exception\ServerException; require __DIR__ . '/../../../vendor/autoload.php'; $uri = getenv('MONGODB_URI') ?: 'mongodb://127.0.0.1/'; /* Note: this script assumes that the test database is empty and that the key * vault collection exists and has a partial, unique index on keyAltNames (as * demonstrated in the encryption key management scripts). */ // Generate a secure local key to use for this script $localKey = new Binary(random_bytes(96)); // Create a client with no encryption options $client = new Client($uri); // Create a ClientEncryption object to manage data encryption keys $clientEncryption = $client->createClientEncryption([ 'keyVaultNamespace' => 'encryption.__keyVault', 'kmsProviders' => [ 'local' => ['key' => $localKey], ], ]); /* Create a data encryption key. Alternatively, this key ID could be read from a * configuration file. */ $keyId = $clientEncryption->createDataKey('local'); // Create another client with automatic encryption enabled $encryptedClient = new Client($uri, [], [ 'autoEncryption' => [ 'keyVaultNamespace' => 'encryption.__keyVault', 'kmsProviders' => ['local' => ['key' => $localKey]], ], ]); // Define a JSON schema for the encrypted collection $schema = [ 'bsonType' => 'object', 'properties' => [ 'encryptedField' => [ 'encrypt' => [ 'keyId' => [$keyId], 'bsonType' => 'string', 'algorithm' => ClientEncryption::AEAD_AES_256_CBC_HMAC_SHA_512_DETERMINISTIC, ], ], ], ]; /* Create a new collection for this script. Configure a server-side schema by * explicitly creating the collection with a "validator" option. */ $encryptedClient->selectDatabase('test')->createCollection('coll', ['validator' => ['$jsonSchema' => $schema]]); $encryptedCollection = $encryptedClient->selectCollection('test', 'coll'); /* Using the encrypted client, insert and find a document to demonstrate that * the encrypted field is automatically encrypted and decrypted. */ $encryptedCollection->insertOne(['_id' => 1, 'encryptedField' => 'mySecret']); print_r($encryptedCollection->findOne(['_id' => 1])); /* Using the client configured without encryption, find the same document and * observe that the field is not automatically decrypted. */ $unencryptedCollection = $client->selectCollection('test', 'coll'); print_r($unencryptedCollection->findOne(['_id' => 1])); /* Attempt to insert another document with an unencrypted field value to * demonstrate that the server-side schema is enforced. */ try { $unencryptedCollection->insertOne(['_id' => 2, 'encryptedField' => 'myOtherSecret']); } catch (ServerException $e) { printf("Error inserting document: %s\n", $e->getMessage()); }
Fornecimento de regras de criptografia automática local
O exemplo a seguir usa a opção de driver de criptografia automática schemaMap
para definir campos criptografados usando um subconjunto rigoroso da sintaxe do JSON schema.
Usar schemaMap
em conjunto com um esquema do lado do servidor fornece mais segurança do que confiar inteiramente em um esquema obtido do servidor. Ele protege contra um servidor malicioso anunciando um esquema falso, que pode induzir o cliente a enviar dados não criptografados que devem ser criptografados.
Observação
Somente a sintaxe do esquema de criptografia pode ser usada com a opção schemaMap
. Não especifique palavras-chave de validação de documentos nas regras de criptografia automática. Para definir regras de validação de documentos, configure a validação de esquema.
use MongoDB\BSON\Binary; use MongoDB\Client; use MongoDB\Driver\ClientEncryption; use MongoDB\Driver\Exception\ServerException; require __DIR__ . '/../../../vendor/autoload.php'; $uri = getenv('MONGODB_URI') ?: 'mongodb://127.0.0.1/'; /* Note: this script assumes that the test database is empty and that the key * vault collection exists and has a partial, unique index on keyAltNames (as * demonstrated in the encryption key management scripts). */ // Generate a secure local key to use for this script $localKey = new Binary(random_bytes(96)); // Create a client with no encryption options $client = new Client($uri); // Create a ClientEncryption object to manage data encryption keys $clientEncryption = $client->createClientEncryption([ 'keyVaultNamespace' => 'encryption.__keyVault', 'kmsProviders' => [ 'local' => ['key' => $localKey], ], ]); /* Create a data encryption key. Alternatively, this key ID could be read from a * configuration file. */ $keyId = $clientEncryption->createDataKey('local'); /* Define a JSON schema for the encrypted collection. Since this only utilizes * encryption schema syntax, it can be used for both the server-side and local * schema. */ $schema = [ 'bsonType' => 'object', 'properties' => [ 'encryptedField' => [ 'encrypt' => [ 'keyId' => [$keyId], 'bsonType' => 'string', 'algorithm' => ClientEncryption::AEAD_AES_256_CBC_HMAC_SHA_512_DETERMINISTIC, ], ], ], ]; /* Create another client with automatic encryption enabled. Configure a local * schema for the encrypted collection using the "schemaMap" option. */ $encryptedClient = new Client($uri, [], [ 'autoEncryption' => [ 'keyVaultNamespace' => 'encryption.__keyVault', 'kmsProviders' => ['local' => ['key' => $localKey]], 'schemaMap' => ['test.coll' => $schema], ], ]); /* Create a new collection for this script. Configure a server-side schema by * explicitly creating the collection with a "validator" option. * * Note: without a server-side schema, another client could potentially insert * unencrypted data into the collection. Therefore, a local schema should always * be used in conjunction with a server-side schema. */ $encryptedClient->selectDatabase('test')->createCollection('coll', ['validator' => ['$jsonSchema' => $schema]]); $encryptedCollection = $encryptedClient->selectCollection('test', 'coll'); /* Using the encrypted client, insert and find a document to demonstrate that * the encrypted field is automatically encrypted and decrypted. */ $encryptedCollection->insertOne(['_id' => 1, 'encryptedField' => 'mySecret']); print_r($encryptedCollection->findOne(['_id' => 1])); /* Using the client configured without encryption, find the same document and * observe that the field is not automatically decrypted. */ $unencryptedCollection = $client->selectCollection('test', 'coll'); print_r($unencryptedCollection->findOne(['_id' => 1])); /* Attempt to insert another document with an unencrypted field value to * demonstrate that the server-side schema is enforced. */ try { $unencryptedCollection->insertOne(['_id' => 2, 'encryptedField' => 'myOtherSecret']); } catch (ServerException $e) { printf("Error inserting document: %s\n", $e->getMessage()); }
Criptografia explícita
A criptografia explícita é um recurso MongoDB Community e não usa crypt_shared
ou mongocryptd
. A criptografia explícita é fornecida pelo MongoDB\Driver\ClientEncryption aula.
use MongoDB\BSON\Binary; use MongoDB\Client; use MongoDB\Driver\ClientEncryption; require __DIR__ . '/../../../vendor/autoload.php'; $uri = getenv('MONGODB_URI') ?: 'mongodb://127.0.0.1/'; /* Note: this script assumes that the test database is empty and that the key * vault collection exists and has a partial, unique index on keyAltNames (as * demonstrated in the encryption key management scripts). */ // Generate a secure local key to use for this script $localKey = new Binary(random_bytes(96)); // Create a client with no encryption options $client = new Client($uri); // Create a ClientEncryption object to manage data encryption keys $clientEncryption = $client->createClientEncryption([ 'keyVaultNamespace' => 'encryption.__keyVault', 'kmsProviders' => [ 'local' => ['key' => $localKey], ], ]); /* Create a data encryption key. Alternatively, this key ID could be read from a * configuration file. */ $keyId = $clientEncryption->createDataKey('local'); // Insert a document with a manually encrypted field $encryptedValue = $clientEncryption->encrypt('mySecret', [ 'algorithm' => ClientEncryption::AEAD_AES_256_CBC_HMAC_SHA_512_DETERMINISTIC, 'keyId' => $keyId, ]); $collection = $client->selectCollection('test', 'coll'); $collection->insertOne(['_id' => 1, 'encryptedField' => $encryptedValue]); /* Using the client configured without encryption, find the document and observe * that the field is not automatically decrypted. */ /** @var object{encryptedField: Binary} $document */ $document = $collection->findOne(); print_r($document); // Manually decrypt the field printf("Decrypted: %s\n", $clientEncryption->decrypt($document->encryptedField));
Criptografia explícita com descriptografia automática
Embora a criptografia automática exija MongoDB 4.2+ enterprise ou um MongoDB 4.2+ Atlas cluster, a descriptografia automática é suportada para todos os usuários. Para configurar a descriptografia automática sem a criptografia automática, defina a bypassAutoEncryption
opção do driver de criptografia automática ao construir um cliente.
use MongoDB\BSON\Binary; use MongoDB\Client; use MongoDB\Driver\ClientEncryption; require __DIR__ . '/../../../vendor/autoload.php'; $uri = getenv('MONGODB_URI') ?: 'mongodb://127.0.0.1/'; /* Note: this script assumes that the test database is empty and that the key * vault collection exists and has a partial, unique index on keyAltNames (as * demonstrated in the encryption key management scripts). */ // Generate a secure local key to use for this script $localKey = new Binary(random_bytes(96)); // Create a client with automatic encryption disabled $client = new Client($uri, [], [ 'autoEncryption' => [ 'keyVaultNamespace' => 'encryption.__keyVault', 'kmsProviders' => ['local' => ['key' => $localKey]], 'bypassAutoEncryption' => true, ], ]); // Create a ClientEncryption object to manage data encryption keys $clientEncryption = $client->createClientEncryption([ 'keyVaultNamespace' => 'encryption.__keyVault', 'kmsProviders' => [ 'local' => ['key' => $localKey], ], ]); /* Create a data encryption key. Alternatively, this key ID could be read from a * configuration file. */ $keyId = $clientEncryption->createDataKey('local'); // Insert a document with a manually encrypted field $encryptedValue = $clientEncryption->encrypt('mySecret', [ 'algorithm' => ClientEncryption::AEAD_AES_256_CBC_HMAC_SHA_512_DETERMINISTIC, 'keyId' => $keyId, ]); $collection = $client->selectCollection('test', 'coll'); $collection->insertOne(['_id' => 1, 'encryptedField' => $encryptedValue]); /* Using the client configured with encryption (but not automatic encryption), * find the document and observe that the field is automatically decrypted. */ $document = $collection->findOne(); print_r($document);
Queryable Encryption
Introduzido no MongoDB 7.0, A Queryable Encryption é outra forma de criptografia em uso. Os dados são criptografados no lado do cliente. A Queryable Encryption oferece suporte a campos criptografados indexados, que são processados posteriormente no lado do servidor.
Queryable Encryption automática
Observação
A Queryable Encryption requer MongoDB 7.0+ Enterprise ou MongoDB 7.0+ Atlas cluster.
A criptografia automática na Queryable Encryption utiliza crypt_shared
ou mongocryptd
para criptografar e descriptografar automaticamente os dados do lado do cliente. Os dados nos campos encryptedIndexed
e encryptedUnindexed
serão criptografados automaticamente na inserção e descriptografados ao fazer query no lado do cliente. Além disso, é possível fazer query no campo encryptedIndexed
.
use MongoDB\BSON\Binary; use MongoDB\Client; use MongoDB\Driver\ClientEncryption; require __DIR__ . '/../../../vendor/autoload.php'; $uri = getenv('MONGODB_URI') ?: 'mongodb://127.0.0.1/'; /* Note: this script assumes that the test database is empty and that the key * vault collection exists and has a partial, unique index on keyAltNames (as * demonstrated in the encryption key management scripts). */ // Generate a secure local key to use for this script $localKey = new Binary(random_bytes(96)); // Create a client with no encryption options $client = new Client($uri); // Create a ClientEncryption object to manage data encryption keys $clientEncryption = $client->createClientEncryption([ 'keyVaultNamespace' => 'encryption.__keyVault', 'kmsProviders' => ['local' => ['key' => $localKey]], ]); /* Create the data encryption keys for this script. Alternatively, the key IDs * could be read from a configuration file. */ $keyId1 = $clientEncryption->createDataKey('local'); $keyId2 = $clientEncryption->createDataKey('local'); /* Create another client with automatic encryption enabled. Configure the * encrypted collection using the "encryptedFields" option. */ $encryptedClient = new Client($uri, [], [ 'autoEncryption' => [ 'keyVaultNamespace' => 'encryption.__keyVault', 'kmsProviders' => ['local' => ['key' => $localKey]], 'encryptedFieldsMap' => [ 'test.coll' => [ 'fields' => [ [ 'path' => 'encryptedIndexed', 'bsonType' => 'string', 'keyId' => $keyId1, 'queries' => ['queryType' => ClientEncryption::QUERY_TYPE_EQUALITY], ], [ 'path' => 'encryptedUnindexed', 'bsonType' => 'string', 'keyId' => $keyId2, ], ], ], ], ], ]); /* Create the data collection for this script. The create and drop helpers will * infer encryptedFields from the client configuration and manage internal * encryption collections automatically. Alternatively, the "encryptedFields" * option can also be passed explicitly. */ $encryptedClient->selectDatabase('test')->createCollection('coll'); $encryptedCollection = $encryptedClient->selectCollection('test', 'coll'); /* Using the encrypted client, insert a document and find it by querying on the * encrypted field. Fields will be automatically encrypted and decrypted. */ $encryptedCollection->insertOne([ '_id' => 1, 'encryptedIndexed' => 'indexedValue', 'encryptedUnindexed' => 'unindexedValue', ]); print_r($encryptedCollection->findOne(['encryptedIndexed' => 'indexedValue'])); /* Using the client configured without encryption, find the same document and * observe that fields are not automatically decrypted. */ $unencryptedCollection = $client->selectCollection('test', 'coll'); print_r($unencryptedCollection->findOne(['_id' => 1]));
Queryable Encryption explícita
Observação
Queryable Encryption requer MongoDB 7.0+.
A criptografia explícita na Queryable Encryption é executada usando o MongoDB\Driver\ClientEncryption::encrypt() e descriptografar() métodos. Embora os valores devam ser explicitamente criptografados (por exemplo, inserções, critérios de query), a descriptografia automática para queries é possível configurando encryptedFields
na collection, conforme demonstrado no exemplo a seguir:
use MongoDB\BSON\Binary; use MongoDB\Client; use MongoDB\Driver\ClientEncryption; require __DIR__ . '/../../../vendor/autoload.php'; $uri = getenv('MONGODB_URI') ?: 'mongodb://127.0.0.1/'; /* Note: this script assumes that the test database is empty and that the key * vault collection exists and has a partial, unique index on keyAltNames (as * demonstrated in the encryption key management scripts). */ // Generate a secure local key to use for this script $localKey = new Binary(random_bytes(96)); // Create a client with no encryption options $client = new Client($uri); // Create a ClientEncryption object to manage data encryption keys $clientEncryption = $client->createClientEncryption([ 'keyVaultNamespace' => 'encryption.__keyVault', 'kmsProviders' => ['local' => ['key' => $localKey]], ]); /* Create the data encryption keys. Alternatively, the key IDs could be read * from a configuration file. */ $keyId1 = $clientEncryption->createDataKey('local'); $keyId2 = $clientEncryption->createDataKey('local'); // Create another client with automatic encryption disabled $encryptedClient = new Client($uri, [], [ 'autoEncryption' => [ 'keyVaultNamespace' => 'encryption.__keyVault', 'kmsProviders' => ['local' => ['key' => $localKey]], 'bypassQueryAnalysis' => true, ], ]); // Define encrypted fields for the collection $encryptedFields = [ 'fields' => [ [ 'path' => 'encryptedIndexed', 'bsonType' => 'string', 'keyId' => $keyId1, 'queries' => ['queryType' => ClientEncryption::QUERY_TYPE_EQUALITY], ], [ 'path' => 'encryptedUnindexed', 'bsonType' => 'string', 'keyId' => $keyId2, ], ], ]; /* Create the data collection for this script. Specify the "encryptedFields" * option to ensure that internal encryption collections are also created. The * "encryptedFields" option should also be specified when dropping the * collection to ensure that internal encryption collections are dropped. */ $encryptedClient->selectDatabase('test')->createCollection('coll', ['encryptedFields' => $encryptedFields]); $encryptedCollection = $encryptedClient->selectCollection('test', 'coll'); // Insert a document with manually encrypted fields $indexedInsertPayload = $clientEncryption->encrypt('indexedValue', [ 'algorithm' => ClientEncryption::ALGORITHM_INDEXED, 'contentionFactor' => 1, 'keyId' => $keyId1, ]); $unindexedInsertPayload = $clientEncryption->encrypt('unindexedValue', [ 'algorithm' => ClientEncryption::ALGORITHM_UNINDEXED, 'keyId' => $keyId2, ]); $encryptedCollection->insertOne([ '_id' => 1, 'encryptedIndexed' => $indexedInsertPayload, 'encryptedUnindexed' => $unindexedInsertPayload, ]); /* Encrypt the payload for an "equality" query using the same key that was used * to encrypt the corresponding insert payload. */ $indexedFindPayload = $clientEncryption->encrypt('indexedValue', [ 'algorithm' => ClientEncryption::ALGORITHM_INDEXED, 'queryType' => ClientEncryption::QUERY_TYPE_EQUALITY, 'contentionFactor' => 1, 'keyId' => $keyId1, ]); /* Using the client configured with encryption (but not automatic encryption), * find the document and observe that the fields are automatically decrypted. */ print_r($encryptedCollection->findOne(['encryptedIndexed' => $indexedFindPayload]));