Este projeto é um proxy que busca facilitar a adesão de pequenos negócios que utilizem MySQL como tecnologia de banco de dados à LGPD (Lei Geral de Proteção de Dados). O projeto busca permitir a encriptação/decriptação da comunicação com o banco de dados de forma rápida e fácil por meio de uma arquitetura plug and play.
Você precisa de três dependências:
Em um terminal, inicie o MySQL Proxy passando como parâmetro o caminho absoluto do arquivo Lua:
mysql-proxy --proxy-lua-script="C:\...\privacy_shield\dist\main.lua
Em outro terminal, inicie um cliente MySQL na porta 4040:
mysql -u root -p -h 127.0.0.1 -P 4040
Agora qualquer operação realizada pelo cliente MySQL passará pelo MySQL Proxy.
No estado atual de desenvolvimento, o proxy ainda não encripta automaticamente o banco de dados e não armazena a configuração do banco de dados em um arquivo separado. Por enquanto, precisamos criar o nosso banco de dados com os tipos apropriados para os campos (utilizando o tipo VARBINARY):
CREATE TABLE pacientes (
nome VARBINARY(255) NOT NULL,
cpf VARBINARY(255) NOT NULL,
idade VARBINARY(255) NOT NULL,
data_nascimento VARBINARY(255) NOT NULL
);Por enquanto, também devemos armazenar a estrutura do banco de dados na váriavel DATABASE_CONFIGURATION em dist/main.lua.
local DATABASE_CONFIGURATION = {
name = "teste",
tables = {
{
name = "pacientes",
columns = {
{
name = "nome",
type = "VARCHAR(255)",
encrypt = true
},
{
name = "cpf",
type = "CHAR(11)",
encrypt = true
},
{
name = "idade",
type = "INT",
encrypt = true
},
{
name = "data_nascimento",
type = "DATE",
encrypt = true
}
}
}
}
}Seguindo o desenvolvimento do proxy, toda essa configuração será automatizada e facilitada por meio de uma interface gráfica.
Vamos inserir um novo paciente no banco de dados:
INSERT INTO pacientes (nome, cpf, idade, data_nascimento)
VALUES (
'Fulano de Tal',
'123.321.456-77',
18,
'2005-09-10'
);E então buscar esse paciente:
SELECT * FROM pacientes WHERE nome = 'Fulano de Tal';+-----------------+-----------------+-----------------+-----------------+
| nome | cpf | idade | data_nascimento |
+-----------------+-----------------+-----------------+-----------------+
| Fulano de Tal | 123.321.456 | 18 | 2005-09-10 |
+-----------------+-----------------+-----------------+-----------------+
Os dados foram retornados já decriptografados. O cliente não precisou alterar a sua query de forma alguma. No entanto, se olharmos os dados armazenados no banco de dados, perceberemos que eles estão criptografados:
+---------------------+---------------------+---------------------+---------------------+
| nome | cpf | idade | data_nascimento |
+---------------------+---------------------+---------------------+---------------------+
| FQ ◄ñ²·äþk@3Ôk█= | ƒ%*©ÿ.♥ͱ‼Æ:øÞ | 4█£Q↔Ôá█êƒa©⌂^ ø | ▬═Óp↕ä¡\ ÈÔLEÄé▀ |
+---------------------+---------------------+---------------------+---------------------+
O fluxo do programa acontece na seguinte sequência:
-
O programa lê um arquivo de configuração JSON que contêm informações sobre a estrutura do banco de dados e quais campos devem ser criptografados.
Essa etapa ainda não está implementada no código. Essa configuração está salva, por enquanto, na váriavel
DATABASE_CONFIGURATIONemmain.lua; -
O proxy intercepta pacotes enviados ao servidor MySQL;
-
O programa avalia se o pacote é uma query. Se não, o pacote é enviado ao servidor MySQL sem nenhuma modificação;
-
Em seguida, o programa extrai os dados da query, transformando-a em uma
tableLua para facilitar a sua modificação; -
Baseado na configuração do usuário e no tipo de query, o programa criptografa ou decriptografa os dados;
-
O programa reconstrói a query MySQL utilizando os dados criptografados/decriptografados;
-
O proxy envia o pacote contendo a query modificada para o servidor MySQL.
A estrutura do código é organizada de forma que cada comando MySQL possui o seu próprio arquivo, que deve (na maioria dos casos) conter as seguintes funções:
-
Uma função que recebe a query SQL e retorna uma table contendo os dados dessa query;
-
Uma função que encripta ou decripta os dados da query contidos nessa table;
-
Uma função que compila os dados já encriptados ou decriptados de volta para uma query SQL contendo essas mudanças;
-
Uma função que chama as três funções anteriores, embrulhando todo o processo em apenas uma função.
