Já ouviu falar de vazamento de dados? Ah, isso não é só coisa de filme de Hollywood não. Empresas perdem milhões de dólares por causa de vazamentos, e a reputação delas vai pro saco rapidinho. Pra evitar isso, proteger os dados é obrigatório. Um dos jeitos mais poderosos de fazer isso é usando criptografia.
Criptografia é o método de transformar dados em um "código secreto" que ninguém entende sem ter a chave pra decifrar. No PostgreSQL tem uma extensão massa chamada pgcrypto que facilita muito o processo de criptografar seus dados.
pgcrypto é uma extensão do PostgreSQL que traz ferramentas poderosas pra criptografar e descriptografar dados, trabalhar com hashes e gerar dados aleatórios.
Principais funções do pgcrypto:
- Criptografia simétrica (uma chave só) e assimétrica (par de chaves: privada e pública).
- Hash de dados pra verificação (tipo senhas).
- Geração de dados aleatórios, que dá pra usar pra criar tokens, chaves e senhas.
Olha só como ativar o pgcrypto no seu banco. Se você achava que magia era só pra galera de Hogwarts, deixa o PostgreSQL te surpreender.
-- Ativando a extensão pgcrypto
CREATE EXTENSION IF NOT EXISTS pgcrypto;
Criptografia simétrica: Codificando seus segredos
Funções pra criptografar e descriptografar:
pgp_sym_encrypt(data, key)— criptografa dados usando uma chave simétrica.pgp_sym_decrypt(data, key)— descriptografa dados que foram criptografados com a mesma chave.
Exemplo: criptografando um texto simples
Imagina que temos uma tabela users com a coluna email, e queremos criptografar os endereços de e-mail.
-- Criando a tabela users
CREATE TABLE users (
id SERIAL PRIMARY KEY,
email TEXT
);
-- Inserindo dados
INSERT INTO users (email)
VALUES ('user1@example.com'), ('user2@example.com');
-- Criptografando os dados
UPDATE users
SET email = pgp_sym_encrypt(email, 'supersecretkey');
-- Conferindo o resultado
SELECT * FROM users;
Resultado: agora a coluna email guarda um texto criptografado, que parece um monte de caracteres sem sentido.
Descriptografando os dados
Quando você quiser trazer os dados de volta pro formato original, usa a função pgp_sym_decrypt.
-- Descriptografando os dados
SELECT pgp_sym_decrypt(email::bytea, 'supersecretkey') AS original_email
FROM users;
Observação: não vacila na escolha da chave. Uma chave tipo "123456" é igual colocar senha na porta e deixar a porta aberta. Use chaves longas e difíceis.
Hash de dados: proteção de senhas turbinada
Guardar senhas em texto puro no banco é igual esconder diário embaixo do travesseiro em república. Não faz isso! Em vez disso, usa hash.
Função pra fazer hash: crypt(password, gen_salt('bf')) — cria um hash pra string password usando o algoritmo Blowfish.
-- Exemplo de hash de senha
SELECT crypt('minha_senha', gen_salt('bf'));
O resultado vai ser algo assim: $2a$10$Efgnd3tFs3tOH6r3RgW5/uLPhNTa43k5E2C5Ut0Ydo7RNHZjG.vi.
Pra conferir a senha, usa a mesma função:
-- Verificando a senha
SELECT crypt('minha_senha', '$2a$10$Efgnd3tFs3tOH6r3RgW5/uLPhNTa43k5E2C5Ut0Ydo7RNHZjG.vi')
= '$2a$10$Efgnd3tFs3tOH6r3RgW5/uLPhNTa43k5E2C5Ut0Ydo7RNHZjG.vi';
Resultado: true.
Dica: nunca guarde senhas em texto puro. Mesmo que você ache que seu banco tá super seguro, sempre use hash.
Criptografia assimétrica: Dois é melhor que um
Criptografia assimétrica usa dois tipos de chave:
- Chave pública (pra criptografar).
- Chave privada (pra descriptografar).
Exemplo: criptografando com chave pública
-- Criando um par de chaves (pra facilitar, guardando em variáveis)
DO $$
DECLARE
public_key TEXT;
private_key TEXT;
BEGIN
SELECT pgp_keygen_keys(1024, 'my_passphrase')
INTO public_key, private_key;
RAISE NOTICE 'Chave Pública: %', public_key;
RAISE NOTICE 'Chave Privada: %', private_key;
END $$;
Usando criptografia assimétrica
Sistemas modernos usam bastante criptografia assimétrica pra trocar dados, tipo em conexões SSL.
Gerando dados aleatórios
Pra criar tokens ou chaves aleatórias, usa a função gen_random_uuid ou gen_random_bytes.
Exemplo:
-- Gerando um UUID aleatório
SELECT gen_random_uuid();
-- Gerando um array de bytes aleatórios
SELECT gen_random_bytes(16);
Isso é útil pra criar identificadores únicos, tokens de acesso ou senhas aleatórias.
Cenários de uso do pgcrypto
- Criptografia de dados sensíveis:
- Números de cartão de crédito.
- Dados pessoais de clientes (tipo endereços, telefones).
- Prontuários médicos.
Hash de senhas: Garanta que nem o admin do banco consiga ver as senhas dos usuários.
Transmissão segura de dados: Usando criptografia assimétrica pra enviar informações criptografadas.
Geração de tokens: Criando tokens pra autenticação de usuários em API.
Erros comuns ao trabalhar com criptografia
Guardar chaves em lugares acessíveis. Nunca deixe as chaves de criptografia salvas em texto puro no banco. Use gerenciadores de segredos pra isso.
Usar chaves fracas. Se a chave for muito curta, alguém pode descobrir ela fácil.
Criptografar sem necessidade. Criptografia consome mais recurso do banco. Só use onde realmente precisa.
Esquecer qual chave usou. Se não tiver documentação, pode acabar não conseguindo mais descriptografar os dados.
Criptografia não é difícil, é só um passo lógico pra proteger seus dados. Coloca o pgcrypto nos seus projetos e deixa seu banco não só seguro, mas também alinhado com os padrões que o mundo moderno exige. O PostgreSQL te dá todas as ferramentas pra transformar seus dados numa fortaleza.
GO TO FULL VERSION