Nesta postagem, falaremos sobre os conceitos e principais funções da criptografia AEAD aplicada no BigQuery
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:
- 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.
2. Vá até o console do BigQuery e crie um novo conjunto de dados:
3. Insira um nome para o conjunto de dados e clique em criar:
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
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
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á:
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