Como fazer encriptação de campos sensíveis em ETL: passo a passo
Proteger campos sensíveis (ex.: NIF, email, cartão) durante um pipeline ETL evita exposição e cumpre requisitos legais. Este tutorial mostra como fazer encriptação de campos sensíveis em ETL com um exemplo prático em Python, para que os dados fiquem seguros antes de serem carregados numa base de dados.
Pré-requisitos
- Python 3.8+ instalado
- Biblioteca cryptography instalada (pip install cryptography)
- Um ficheiro CSV de amostra com campos sensíveis
- Conhecimentos básicos de Python e ETL (leitura, transformação, escrita)
Passo 1: Porquê encriptar no ETL
Encriptar no ETL protege dados em repouso e reduz o risco de fuga caso a base de dados ou o armazenamento sejam comprometidos. É diferente de mascaramento (onde o valor perde utilidade): a encriptação permite recuperar o valor com a chave correta, pelo que é útil para cenários que necessitam de reversibilidade controlada.
Passo 2: Escolher o método de encriptação
Usaremos encriptação simétrica com Fernet da biblioteca cryptography — é simples, segura para muitos casos e fornece encriptação + assinatura (integridade). Evita inventar algoritmos; segue o padrão.
Passo 3: Preparar chave e utilitários
Criar uma chave segura, guardá‑la de forma segura (ex.: Azure Key Vault, Secrets Manager). Para este exemplo geramos localmente e mostramos funções mínimas para encriptar/desencriptar.
from cryptography.fernet import Fernet
# Gerar chave (fazer uma vez e guardar com segurança)
key = Fernet.generate_key()
fernet = Fernet(key)
print(key.decode()) # guarda esta chave com segurança
# Funções utilitárias
def encrypt_value(value: str) -> str:
if value is None:
return None
return fernet.encrypt(value.encode()).decode()
def decrypt_value(token: str) -> str:
if token is None:
return None
return fernet.decrypt(token.encode()).decode()
Passo 4: Ler os dados e identificar campos a encriptar
Lê o ficheiro CSV e define quais as colunas sensíveis. Neste exemplo encriptamos 'email' e 'nif'.
import csv
input_file = 'clientes.csv'
output_file = 'clientes_encriptado.csv'
sensitive_cols = ['email', 'nif']
with open(input_file, newline='', encoding='utf-8') as infile:
reader = csv.DictReader(infile)
rows = list(reader)
Passo 5: Aplicar encriptação durante a transformação
Itera as linhas e substitui os valores sensíveis pelo token encriptado. Mantém outras colunas intactas. Evita encriptar valores vazios.
transformed = []
for row in rows:
new_row = row.copy()
for col in sensitive_cols:
val = row.get(col)
if val and val.strip() != '':
new_row[col] = encrypt_value(val)
else:
new_row[col] = ''
transformed.append(new_row)
Passo 6: Gravar os dados encriptados
Escreve o CSV de saída com os valores encriptados. Este ficheiro pode ser carregado numa base de dados; só quem tiver a chave pode desencriptar.
with open(output_file, 'w', newline='', encoding='utf-8') as outfile:
writer = csv.DictWriter(outfile, fieldnames=transformed[0].keys())
writer.writeheader()
for r in transformed:
writer.writerow(r)
print('Ficheiro escrito:', output_file)
Passo 7: Como desencriptar quando necessário
Para operações legítimas que necessitem do valor original (ex.: envio de email autorizado), usar a função de desencriptação com controlo de acesso e registo. Nunca incorpores a chave no código em produção.
# Exemplo de desencriptação pontual
sample_encrypted = transformed[0]['email']
original = decrypt_value(sample_encrypted)
print('Original:', original)
Verificar o resultado
Confirma que no ficheiro de saída os campos sensíveis estão reconhecivelmente encriptados (cadeias longas com / e caracteres base64). Verifica também que o processo de desencriptação recupera exatamente o valor original e que outros campos permanecem iguais.
Conclusão
Encriptar campos sensíveis no ETL é uma medida prática para reduzir risco e cumprir políticas de proteção de dados. Próximo passo: integrar a gestão de chaves com um serviço seguro (ex.: Azure Key Vault) e aplicar encriptação a fluxos incrementais. Dica: já validaste onde vais guardar a chave e quem tem acesso?