Menu Docs
Página inicial do Docs
/ / /
Manual da Biblioteca PHP
/

Criptografia em execução

Nesta página

  • Dependências
  • 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

Para começar a usar 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 .

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 cryptSharedLibRequired opção 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.

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.

Dica

Veja também:

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.

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

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.

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

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.

Observação

A criptografia automática em nível de campo do 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.

O MongoDB 4. O servidor 2+ suporta o uso da 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.

<?php
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());
}

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.

<?php
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());
}

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.

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

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.

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

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.

Observação

A Queryable Encryption automática 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 .

<?php
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]));

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:

<?php
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]));
← Decimal128
GridFS →