Criptografia AEAD no BigQuery

Nesta postagem, falaremos sobre os conceitos e principais funções da criptografia AEAD aplicada no BigQuery

Image for post

O que é BigQuery?

É um data warehouse totalmente gerenciado que permite realizar análises em um grande conjunto de dados, no patamar de petabytes.

Suporta consultas no formato ANSI SQL e criação de modelos de Machine Learning (ML) em uma sintaxe semelhante ao SQL.

O que é criptografia?

É um conjunto de técnicas que permitem tornar um texto ininteligível, geralmente é usada para impedir alguém de ler uma mensagem/informação especifica.

Por que utilizar criptografia em dados do BigQuery?

Muitos dizem que os dados se tornaram o novo petróleo, para proteger informações tão preciosas a criptografia pode ser uma aliada importante, ainda mais quando falamos de anonimização de dados.

A criptografia(Encryption) é geralmente a abordagem mais complexa de data masking, pois é preciso um algoritmo e que uma “chave” seja aplicada para exibir os dados. Essa chave deve ser divulgada somente para quem deve ter acesso a esses dados, pois qualquer pessoa com a chave pode acessa-los.

O BigQuery permite usar a criptografia em repouso(quando o dado está armazenado em algum lugar e não está em movimento) e criptografar tabelas usando chaves de criptografia gerenciadas pelo cliente (CMEKs). Para alguns cenários de anonimização pode ser necessário criptografar somente um campo e não a tabela inteira, para esses casos podemos usar as funções de criptografia AEAD.

Essas funções utilizam o tipo padrão de criptografia avançada (AES), que ao usar um campo de texto como entrada e uma chave criptográfica é retornada uma sequência de bytes como saída, usando a mesma chave é possível retornar o dado ao estado anterior(descriptografar).

OBS: A chave/Conjunto de chaves tem que estar como “ENABLED” para ser utilizada.

Principais funções AEAD

  • KEYS.NEW_KEYSET

Gera uma chave nova que pode ser utilizada em conjunto com outras funções.

Sintaxe:

KEYS.NEW_KEYSET(key_type)

Exemplo:

SELECT 1 Cd_cliente, KEYS.NEW_KEYSET('AEAD_AES_GCM_256') AS Chave

Retorno:

Image for post
  • AEAD.ENCRYPT

Usada para criptografar um campo especifico.

Sintaxe:

AEAD.ENCRYPT(keyset, plaintext, additional_data)
  • AEAD.DECRYPT_STRING

Usada para descriptografar um campo especifico em formato de texto.

Sintaxe:

AEAD.DECRYPT_STRING(keyset, ciphertext, additional_data)
  • AEAD.DECRYPT_BYTES

Usada para descriptografar um campo especifico em formato em BYTES.

Sintaxe:

AEAD.DECRYPT_STRING(keyset, ciphertext, additional_data)

Passo a Passo

1. O primeiro passo a fazer é o login em sua conta do GCP, para este tutorial você vai precisar de uma conta que possua um projeto.

Image for post

2. Vá até o console do BigQuery e crie um novo conjunto de dados:

Image for post

3. Insira um nome para o conjunto de dados e clique em criar:

Image for post

4. Crie a tabela “chaves_do_cliente”, nela haverá uma chave única por cliente:

create table dataset_teste.chaves_do_cliente as
SELECT cliente_id, KEYS.NEW_KEYSET('AEAD_AES_GCM_256') AS keyset
FROM (
SELECT 1 AS cliente_id UNION ALL
SELECT 2 as cliente_id UNION ALL
SELECT 3 as cliente_id UNION ALL
SELECT 4 as cliente_id UNION ALL
SELECT 5 as cliente_id
) AS Cliente_Ids;

5. Crie a tabela “email_cliente”, nela haverá um email único por cliente:

create table dataset_teste.email_cliente as
SELECT cliente_id, email
FROM (
SELECT 1 AS cliente_id, 'Joao@email.com' as email UNION ALL
SELECT 2 AS cliente_id, 'Ana@email.com' as email UNION ALL
SELECT 3 AS cliente_id, 'Maria@email.com' as email UNION ALL
SELECT 4 AS cliente_id, 'Pedro@email.com' as email UNION ALL
SELECT 5 AS cliente_id, 'Lohan@email.com' as email
) AS email_cliente;

6. Crie a tabela “email_encrypted”, nela vamos criptografar o email da tabela anterior utilizando a chave usada no passo 4:

create table dataset_teste.email_encrypted as
select cliente_id,
AEAD.ENCRYPT((SELECT keyset from dataset_teste.chaves_do_cliente keys
where keys.cliente_id = cliente.cliente_id),email,cast(cliente.cliente_id as STRING)) as email
from dataset_teste.email_cliente cliente

7. Faça um select na tabela e verifique como ficou o campo email após a criptografia:

select * from  dataset_teste.email_encrypted cliente 
Image for post

8. Use a função DECRYPT_STRING para descriptografar o campo email:

select cliente_id,
AEAD.DECRYPT_STRING((SELECT keyset from dataset_teste.chaves_do_cliente keys
where keys.cliente_id = cliente.cliente_id),email,cast(cliente.cliente_id as STRING)) email
from dataset_teste.email_encrypted cliente
Image for post

Observação: Se a chave de criptografia for deletada da tabela, a função DECRYPT não funcionará.

delete dataset_teste.chaves_do_cliente where cliente_id = 1

No cenário em que a chave foi deletada, após repetir o código do passo 8 o resultado será:

Image for post

Referências

  • Conceitos de criptografia AEAD no SQL padrão

https://cloud.google.com/bigquery/docs/reference/standard-sql/aead-encryption-concepts

  • Funções de criptografia AEAD no SQL padrão

https://cloud.google.com/bigquery/docs/reference/standard-sql/aead_encryption_functions

  • BigQuery Encryption Functions — Part I: Data deletion/retention with Crypto Shredding

https://medium.com/google-cloud/bigquery-encryption-functions-part-i-data-deletion-retention-with-crypto-shredding-7085ecf6e53f