anúncios

quinta-feira, 19 de junho de 2025

Encriptação de Dados Sensíveis no MySQL

Quando lidamos com dados sensíveis, como CPF, telefone ou informações bancárias de usuários, a segurança da informação torna-se um dos pilares mais importantes de um sistema. Uma prática fundamental é armazenar esses dados de forma encriptada no banco de dados.

Exemplo prático: Encriptação de CPF no MySQL

Considere a seguinte estrutura de tabela:


CREATE TABLE clientes (
    id INT PRIMARY KEY AUTO_INCREMENT,
    nome VARCHAR(100),
    cpf VARBINARY(255)
);

Como funciona a encriptação com AES_ENCRYPT

O MySQL oferece a função AES_ENCRYPT(valor, chave) para encriptar dados. Aqui:

  • valor:
  • é o dado sensível que queremos proteger (por exemplo, o CPF).

  • chave:
  • é uma senha secreta utilizada no processo de encriptação e decriptação. Importante: A chave nunca deve ser armazenada dentro da própria base de dados. O ideal é mantê-la em um arquivo de configuração da aplicação ou em um gerenciador de segredos (Vault, AWS Secrets Manager, etc).

  • Recomendações sobre a chave:
  • A chave de encriptação deve ter pelo menos 16 bytes para evitar warnings e garantir maior segurança.

Exemplo de inserção de dados encriptados:


INSERT INTO clientes (nome, cpf) 
      VALUES ('Bjorn', 
             AES_ENCRYPT('123.456.789-00', 
             'chave_secreta_16b'));

Como realizar a decriptação dos dados:

Para visualizar os dados de forma legível, usamos a função AES_DECRYPT(coluna, chave):


SELECT nome, 
       CONVERT(AES_DECRYPT(cpf, 'chave_secreta_16b') 
       USING utf8) AS cpf 
FROM clientes;

Dica:

É recomendado sempre usar o CONVERT(... USING utf8) para transformar o resultado binário em texto legível.

Considerações importantes

Consistência nos dados:

Tentar decriptar dados que não foram previamente encriptados com AES causará erros ou retornará valores nulos. Garanta que todos os dados sensíveis sejam sempre armazenados de forma encriptada.

Conformidade com a LGPD:

A prática de encriptar dados sensíveis está totalmente alinhada com a LGPD (Lei Geral de Proteção de Dados).

Em caso de um eventual vazamento de dados, as informações estarão ilegíveis para qualquer atacante que não possua a chave de encriptação.

Boas práticas de segurança:

Infelizmente, ainda vemos notícias frequentes de vazamentos de bases de dados de órgãos públicos e grandes empresas. Muitas vezes, os dados estavam armazenados de forma simples e sem criptografia.

Uma política mínima de encriptação já evitaria que tais informações pudessem ser lidas por terceiros não autorizados.

Compatibilidade com MariaDB

As funções AES_ENCRYPT() e AES_DECRYPT() também são suportadas pelo MariaDB, garantindo boa compatibilidade com as versões do MySQL até a 5.7.

Porém, vale uma atenção especial para quem trabalha com MySQL 8.x ou superior, pois algumas mudanças foram introduzidas no modo de criptografia padrão (exemplo: modo de padding e modo de operação AES).

Recomendações ao usar entre MySQL e MariaDB:

Teste a criptografia e decriptação em ambos os ambientes.

Utilize sempre chaves com no mínimo 16 bytes.

Valide se o modo de operação AES é o mesmo entre as versões.

Evite migrações diretas de bases encriptadas entre MySQL 8.x e MariaDB sem testes prévios.

Considerações finais

A segurança de dados não deve ser tratada como um recurso opcional. Encriptar informações sensíveis no banco de dados é uma obrigação para qualquer sistema que armazene dados pessoais.

Com poucas alterações na modelagem e nas queries SQL, já é possível implementar uma camada extra de proteção.

Se você ainda não aplica encriptação de dados sensíveis no seu banco de dados no SGBD MySQL ou MariaDB, o momento de começar é agora.

Feito!

Nenhum comentário:

Postar um comentário