Conceitos de criptografia AEAD no SQL padrão

Neste tópico, explicamos os conceitos que norteiam a criptografia AEAD no BigQuery. Para receber uma descrição das diferentes funções de criptografia AEAD, compatíveis com o BigQuery, consulte Funções de criptografia AEAD.

Finalidade da criptografia AEAD

O BigQuery mantém seus dados seguros usando a criptografia em repouso. O BigQuery também oferece suporte a chaves de criptografia gerenciadas pelo cliente (CMEKs) que permitem criptografar tabelas usando chaves de criptografia específicas. Em alguns casos, no entanto, talvez você queira criptografar valores individuais em uma tabela.

Por exemplo, você quer manter os dados de todos os seus clientes em uma tabela comum e criptografar os dados de cada cliente usando uma chave diferente. Seus dados estão espalhados por várias tabelas que você quer poder "excluir criptograficamente". Exclusão ou trituração criptográfica é o processo de excluir uma chave de criptografia para tornar ilegíveis quaisquer dados criptografados por essa chave.

É possível criar conjuntos de chaves com chaves para criptografia e descriptografia por meio das funções de criptografia AEAD, usar essas chaves para criptografar e descriptografar valores individuais em uma tabela e girar as chaves dentro de um conjunto de chaves.

Conjunto de chaves

Um conjunto de chaves é uma coleção de chaves criptográficas. Uma delas é a chave criptográfica primária e o restante, se houver, são chaves criptográficas secundárias. Cada chave codifica um algoritmo para criptografia ou descriptografia, o estado da chave (ativada, desativada ou destruída) e, no caso de chaves não destruídas, os próprios bytes de chave. A chave criptográfica primária determina como criptografar o texto simples de entrada. A chave criptográfica primária nunca pode estar desativada. As chaves criptográficas secundárias servem apenas para descriptografia e podem estar no estado ativada ou desativada. Um conjunto de chaves pode ser usado para descriptografar todos os dados que foram usados para criptografar.

A representação de um conjunto de chaves no BigQuery é como um buffer de protocolo google.crypto.tink.Keyset serializado em BYTES.

Exemplo

Veja a seguir um exemplo de conjunto de chaves AEAD, representado como uma string JSON com três chaves.

primary_key_id: 569259624
key {
  key_data {
    type_url: "type.googleapis.com/google.crypto.tink.AesGcmKey"
    value: ",&\264kh\377\306\217\371\233E<\0350A4\023B-pd\203\277\240\371\212^\210bf\347\256"
    key_material_type: SYMMETRIC
  }
  status: ENABLED
  key_id: 569259624
  output_prefix_type: TINK
}
key {
  key_data {
    type_url: "type.googleapis.com/google.crypto.tink.AesGcmKey"
    value: "\374\336+.\333\245k\364\010`\037\267!\376\233\\3\215\020\356B\236\240O\256U\021\266\217\277\217\271"
    key_material_type: SYMMETRIC
  }
  status: DISABLED
  key_id: 852264701
  output_prefix_type: TINK
}
key {
  status: DESTROYED
  key_id: 237910588
  output_prefix_type: TINK
}

No exemplo acima, a chave criptográfica primária, com o código 569259624, é a primeira que aparece na string JSON. Há duas chaves criptográficas secundárias: uma com o código 852264701 no estado desativada e outra com o código 237910588 no estado destruída. Quando uma função de criptografia AEAD usa esse conjunto de chaves para criptografia, o texto criptografado resultante codifica o código da chave criptográfica primária, 569259624.

Quando uma função AEAD usa esse conjunto de chaves para descriptografia, ela escolhe a chave apropriada com base no código de chave codificado no texto criptografado. No exemplo acima, a tentativa de descriptografar usando o código de chave 852264701 ou 237910588 geraria um erro, porque o código de chave 852264701 está desativado e o código 237910588 está destruído. Restaurar o código de chave 852264701 para o estado ativado o tornaria utilizável para descriptografia.

O tipo de chave determina o modo de criptografia a ser usado com essa chave.

Criptografar texto simples mais de uma vez usando o mesmo conjunto de chaves costuma retornar diferentes valores de texto criptografado devido a diferentes vetores de inicialização (IVs, na sigla em inglês), que são escolhidos por meio do gerador de número pseudo-aleatório fornecido pelo OpenSSL.

Padrão de criptografia avançada (AES)

As funções de criptografia AEAD usam o padrão de criptografia avançada (AES, na sigla em inglês). A criptografia AES usa texto simples como entrada junto com uma chave criptográfica e retorna uma sequência criptografada de bytes como saída. É possível descriptografar essa sequência de bytes posteriormente usando a mesma chave usada para criptografá-la. O AES usa um tamanho de bloco de 16 bytes, isto é, o texto simples é tratado como uma sequência de blocos de 16 bytes. O texto criptografado conterá um prefixo específico do Tink indicando a chave usada para realizar a criptografia. A criptografia AES é compatível com vários modos de criptografia em blocos.

Modos de criptografia em blocos

Dois modos de criptografia em blocos compatíveis com as funções de criptografia AEAD são GCM e CBC.

GCM

O Galois/Counter Mode (GCM) é um modo de criptografia AES. A função numera os blocos sequencialmente e, em seguida, combina o número do bloco com um vetor de inicialização (IV, na sigla em inglês). Um vetor de inicialização é um valor aleatório ou pseudo-aleatório que forma a base da ordem aleatória dos dados em texto simples. Em seguida, a função criptografa a combinação de número do bloco e IV usando AES. Em seguida, a função executa uma operação OR lógica exclusiva (XOR, na sigla em inglês) bit a bit no resultado da criptografia e o texto simples para produzir o texto criptografado. O modo GCM usa uma chave criptográfica de 128 ou 256 bits de comprimento.

Modo CBC

O CBC “encadeia” blocos fazendo XOR de cada bloco de texto simples com o bloco anterior de texto criptografado antes de criptografá-lo. O modo CBC usa uma chave criptográfica de 128, 192 ou 256 bits de comprimento. O CBC usa um vetor de inicialização de 16 bytes como bloco inicial e faz XOR desse bloco com o primeiro bloco de texto simples.

Dados extras

As funções de criptografia AEAD aceitam o uso de um argumento additional_data, também conhecido como dados associados (AD, na sigla em inglês) ou dados autenticados extras. Ao contrário do conjunto de chaves, esses dados extras não permitem a descriptografia do texto criptografado resultante por si só. Esses dados extras garantem a autenticidade e a integridade dos dados criptografados, mas não o sigilo deles.

Por exemplo, additional_data pode ser a saída de CAST(customer_id AS STRING) quando se criptografa dados para um cliente específico. Isso garante que, quando os dados forem descriptografados, terão sido criptografados previamente usando o customer_id esperado. O mesmo valor additional_data é necessário para descriptografia. Para mais informações, consulte a RFC 5116 (em inglês).

Descriptografia

A saída de AEAD.ENCRYPT é o texto criptografado BYTES. As funções AEAD.DECRYPT_STRING ou AEAD.DECRYPT_BYTES podem descriptografá-lo. Essas funções precisam usar um conjunto de chaves que tenha a chave usada para criptografia. Essa chave precisa estar no estado 'ENABLED'. Elas também precisam usar os mesmos additional_data usados na criptografia.

Quando o conjunto de chaves é usado para descriptografia, a chave apropriada é escolhida para descriptografia com base no código de chave codificado no texto criptografado.

A saída de AEAD.DECRYPT_STRING é um STRING de texto simples, enquanto a saída de AEAD.DECRYPT_BYTES é BYTES de texto simples. AEAD.DECRYPT_STRING pode descriptografar o texto criptografado que codifica um valor de STRING. AEAD.DECRYPT_BYTES pode descriptografar o texto criptografado que codifica um valor de BYTES. Usar uma dessas funções para descriptografar um texto criptografado que codifica o tipo de dados incorreto, como usar AEAD.DECRYPT_STRING para descriptografar o texto criptografado que codifica um valor de BYTES, causa comportamento indefinido e pode gerar erro.

Revezamento de chaves

A principal finalidade do revezamento de chaves de criptografia é reduzir a quantidade de dados criptografados com qualquer chave específica, para que uma chave possivelmente comprometida limite o acesso de um invasor aos dados.

O revezamento do conjunto de chaves envolve:

  1. Criação de uma nova chave criptográfica primária dentro de cada conjunto de chaves.
  2. Descriptografia e nova criptografia de todos os dados criptografados.

A primeira etapa é executada pela função KEYS.ROTATE_KEYSET com a adição de uma nova chave criptográfica primária a um conjunto de chaves e a transformação da antiga chave criptográfica primária em secundária.

Esta página foi útil? Conte sua opinião sobre:

Enviar comentários sobre…

Precisa de ajuda? Acesse nossa página de suporte.