Criptografia de campo e consultabilidade
Nesta página
Visão geral
Neste guia, você pode aprender sobre os seguintes tópicos sobre Queryable Encryption:
Como especificar campos para criptografia.
Como especificar se um campo criptografado pode ser consultado quando você cria uma collection.
Tipos de query e quais você pode usar em campos criptografados.
O que considerar ao decidir se deseja habilitar query em um campo criptografado.
Especifique campos para criptografia
A Queryable Encryption permite que você especifique quais campos deseja criptografar automaticamente em seu documento MongoDB.
Importante
Você pode especificar qualquer campo no documento para criptografia, exceto o campo _id
.
Para especificar campos para criptografia e consulta, defina um JSON schema que inclua as seguintes propriedades:
Nome da chave | Tipo | Obrigatório? |
---|---|---|
path | String | Obrigatório |
bsonType | String | Obrigatório |
keyId | Binário | Obrigatório |
queries | Objeto | Opcional, omita a menos que queira poder fazer uma query do campo. |
Exemplo
Este exemplo mostra como criar um JSON schema que especifica quais campos o recurso Queryable Encryption deve criptografar automaticamente.
Considere o seguinte documento que contenha informações de identificação pessoal (PII), informações de cartão de crédito e informações médicas confidenciais:
{ "firstName": "Jon", "lastName": "Snow", "patientId": 12345187, "address": "123 Cherry Ave", "medications": [ "Adderal", "Lipitor" ], "patientInfo": { "ssn": "921-12-1234", "billing": { "type": "visa", "number": "1234-1234-1234-1234" } } }
Para garantir que os PII e as informações médicas confidenciais permaneçam seguras, crie um JSON schema que configure o Queryable Encryption para criptografar automaticamente esses campos. O seguinte exemplo de JSON schema mostra como você pode especificar quais campos criptografar:
const encryptedFieldsObject = { fields: [ { path: "patientId", keyId: "<unique data encryption key>", bsonType: "int" }, { path: "patientInfo.ssn", keyId: "<unique data encryption key>", bsonType: "string" }, { path: "medications", keyId: "<unique data encryption key>", bsonType: "array" }, { path: "patientInfo.billing", keyId: "<unique data encryption key>", bsonType: "object" }, ] }
Observe que o campo keyId
requer uma chave de criptografia de dados (DEK) exclusiva que a Queryable Encryption usa para criptografar os campos. Para obter mais informações sobre DEKs, consulte Gerenciamento de chave de encriptação.
Especificar campos criptografados de query
Inclua a propriedade queries
nos campos que você deseja tornar consultáveis em seu JSON schema. Isso permite que um cliente autorizado emita query de leitura e escrita usando campo criptografados. Você pode omitir a propriedade queries
a menos que queira poder fazer uma query do campo.
Exemplo
O seguinte trecho de código mostra como adicionar a propriedade queries
ao JSON schema para tornar os campos patientId
e patientInfo.ssn
consultáveis..
const encryptedFieldsObject = { fields: [ { path: "patientId", keyId: "<unique data encryption key>", bsonType: "int", queries: { queryType: "equality" } }, { path: "patientInfo.ssn", keyId: "<unique data encryption key>", bsonType: "string", queries: { queryType: "equality" } }, { path: "medications", keyId: "<unique data encryption key>", bsonType: "array" }, { path: "patientInfo.billing", keyId: "<unique data encryption key>", bsonType: "object" }, ] }
Para mais informações sobre tipos de query, consulte Tipos de query.
Habilitar queryable encryption
Você pode ativar a Queryable Encryption em campos especificados em um JSON schema das seguintes maneiras:
Passe o JSON schema, representado pela constante
encryptedFieldsObject
, para o cliente que o aplicativo utiliza para criar a coleção como mostrado no seguinte trecho de código:
const client = new MongoClient(uri, { autoEncryption: { keyVaultNameSpace: "<your keyvault namespace>", kmsProviders: "<your kms provider>", extraOptions: { cryptSharedLibPath: "<path to FLE Shared Library>" }, encryptedFieldsMap: { "<databaseName.collectionName>": { encryptedFieldsObject } } } ... await client.db("<database name>").createCollection("<collection name>"); }
Observação
É importante habilitar a Queryable Encryption antes de criar a collection. A ativação da Queryable Encryption após a criação da collection não criptografa campo em documento que já estão nessa collection.
Para obter mais informações sobre as opções de configuração autoEncryption
, consulte a seção sobre MongoClient Options for Queryable Encryption.
Passe o objeto de campo criptografados para sua chamada para criar uma nova collection, conforme mostrado no seguinte trecho de código:
await encryptedDB.createCollection("<collection name>", { encryptedFields: encryptedFieldsObject });
Dica
Para obter o mais alto nível de segurança, especifique os campo criptografados ao criar a collection e ao criar um cliente para acessar a collection. Isso garante que, se a segurança do servidor for comprometida, as informações ainda serão criptografadas por meio do cliente.
Importante
O MongoDB recomenda criar explicitamente sua collection ao usar Queryable Encryption, em vez de criar implicitamente a collection por meio de uma operação de inserção. Quando você cria uma collection utilizando createCollection()
, a operação cria um índice no campo codificados. Sem um índice, a consulta de campos criptografados pode ser executada lentamente.
Tipos de query
A Queryable Encryption permite que você especifique em quais campos deseja habilitar a query, passando um tipo de query para a opção queries
em seu objeto de campos criptografados.
Atualmente, a Criptografia Consultável é compatível com os tipos de consulta none
ou equality
. A nova estrutura de criptografia introduzida como parte da Queryable Encryption no MongoDB 6.0 foi projetada para acomodar pesquisas criptografadas expressivas adicionais, como operadores de faixa e cadeia de caracteres.
Um tipo de query de none
indica que os dados serão criptografados, mas não se destina a ser consultável. As queries não podem ser executadas em dados criptografados com um tipo de query de none
. Os dados criptografados serão retornados se as queries forem executadas em:
campos não criptografados
campos com um tipo de query de
equality
na mesma coleção e descriptografados no cliente.
Importante
Tipos de query especificados nenhum
Se o tipo de query não for explicitamente especificado, o tipo de query será padronizado para none
e os dados não poderão ser query.
O tipo de query do equality
permite a você query campos criptografados utilizando as seguintes expressões:
Observação
As queries que comparam um campo codificado com null
ou com uma expressão regular resultarão em um erro, mesmo ao utilizar um operador de query suportado.
A Queryable Encryption usando o tipo de query equality
não suporta operações de leitura ou gravação em um campo quando a operação compara o campo criptografado a qualquer um dos seguintes tipos de BSON :
double
decimal128
object
array
javascriptWithScope
(Obsoleto)
Considerações ao ativar a query
Ao usar a Queryable Encryption, você pode escolher se deseja tornar um campo criptografado consultável. Se você não precisar executar operações de leitura ou gravar operações que exijam que você leia um campo criptografado, você pode optar por não habilitar a query nesse campo. Você ainda pode recuperar o documento inteiro consultando outros campos que podem ser consultados ou não criptografados.
Quando você torna os campos criptografados consultáveis, o Queryable Encryption cria um índice para cada campo criptografado, o que pode tornar as operações de gravação nesse campo mais demoradas. Quando uma operação de gravação atualiza um campo indexado, MongoDB também atualiza o índice relacionado.
Quando você habilita a query em um campo criptografado, sua coleção exige mais espaço de armazenamento. Estes nomes de collection, que começam com enxcol_.
, contêm metadados de criptografia importantes.
Aviso
Não modifique a collection que começa com enxcol_.
.