Proteção de Banco de Dados MySQL

Fórum sobre Banco de Dados e RDDs para Clipper/[x]Harbour.

Moderador: Moderadores

cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Proteção de Banco de Dados MySQL

Mensagem por cjp »

Perguntei ao servidor, mas a resposta não ajuda:
O acesso ao banco pelo phpmyadmin ou outra ferramenta se da por http, desta forma não é criptografada.
No link postado pelo Vladimir (https://mariadb.com/kb/en/configuring-m ... mote-hosts) não achei nada falando sobre criptografia.

Eu não entendo nada sobre criptografia. Peço ajuda, por favor.

Reitero que o acesso foi feito usando um notebook do próprio técnico na rede. Ele não acessou o computador do usuário (até onde sei - pode eventualmente ter feito pela rede, mas fisicamente não acessou). No computador do usuário não tem arquivos com senhas ou qualquer coisa assim, a não ser o próprio .exe, que tem os dados da conexão, da forma que postei acima.

Ainda não entendi se a criptografia deveria estar: 1) no meu sistema; 2) no Maria DB; ou 3) no provedor. E como fazer essa criptografia? Alguém poderia me ajudar com isso, por favor?
Inacio de Carvalho Neto
Avatar do usuário
carlaoonline
Usuário Nível 3
Usuário Nível 3
Mensagens: 190
Registrado em: 24 Ago 2014 22:38
Localização: Porto Alegre-RS

Proteção de Banco de Dados MySQL

Mensagem por carlaoonline »

Bom dia!
cjp escreveu:Perguntei ao servidor, mas a resposta não ajuda:
Estou usando o Chat GPT da OpenAi, veja se a resposta ajuda:
ai.png
Pode perguntar qualquer coisa...
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Proteção de Banco de Dados MySQL

Mensagem por cjp »

Ainda não entendi se a criptografia deveria estar: 1) no meu sistema; 2) no Maria DB; ou 3) no provedor.
Fiz este teste no provedor, veja a resposta no anexo.
No computador do usuário não tem mysql instalado, então não tem my.cnf.
Agradeceria se pudessem me dar uma ajuda mais específica, por favor.
Inacio de Carvalho Neto
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Proteção de Banco de Dados MySQL

Mensagem por rochinha »

Amiguinhos,

cjp a criptografia existente no MySQL precisa ser acionada pelo seu sistema.

Ao passar um dado privado para algum campo em suas tabelas você usará, à exemplo do PHP, a função AES_Encrypt( "meu dado", "palavra senha especifica" ) e para recuperar AES_Decrypt( "meu dado", "palavra senha especifica" ).

A palavra senha especifica será conhecida somente por você e você pode criar palavras especificas para cada cliente para dificultar que com os dados de um cliente em mãos a pessoa mal intencionada use a palavra senha de outro cliente.

A função de proteção pode ser criada por você ou alguma que exista na linguagem que usa para criar seu sistema, pois ao encriptar um dado de um campo, mesmo que alguém possua o banco de dados e tiver acesso aos registros e mesmo sabendo qual função usar para recuperar o conteúdo ela terá de saber a palavra senha que você usou para proteger.

Portanto, quem protege os dados é o seu sistema pooisó ele saberá recuperar.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Proteção de Banco de Dados MySQL

Mensagem por cjp »

Desculpe a demora em responder.
Meu sistema está em Harbour.
Pesquisei sobre AES_Encrypt(), mas fiquei com algumas dúvidas.
Fiz um teste assim:

Código: Selecionar todos

INSERT INTO teste (teste) VALUES(UNHEX(MD5('abcdef')));
Vi que realmente inseriu na tabela um código irreconhecível (imagem anexa).
Imagino que, usando AES_Decrypt(), eu consiga recuperar o valor 'abcdef' da tabela. Até aí, parece que está tudo certo.
A dúvida é: a pessoa que conseguir acessar minha base de dados, também não poderá usar o AES_Decrypt() para obter os dados descriptogrados?
Não vi como usar senha nesse exemplo que pesquisei. Mas, mesmo que tenha como usar senha, vou ter que colocar a senha no sistema. A pessoa que acessar indevidamente meu sistema, também vai ter a senha, não é?
Anexos
tela.png
tela.png (6.48 KiB) Exibido 10899 vezes
Inacio de Carvalho Neto
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Proteção de Banco de Dados MySQL

Mensagem por rochinha »

Amiguinhos,

cjp
Não concebi o uso de MD5() para criptografar uma string mesmo porque não sei qual é a função que reverte string MD5(), mas se o seu sistema está em Harbour e não é conhecida nenhuma ferramenta de engenharia reversa não há porque temer sobre acesso a senha colocada no código a não ser que o código puro esteja nas mãos do cliente ou usuário.

Você poderia encriptar uma palavra e acrescentá-la ao seu código e desencriptá-la para encriptar novas frases.

Código: Selecionar todos

...
PalavraEncriptada := "hTYsk#69Jysky3jh6@3ukK"
...
NovaPalavraEncriptada := AES_Encript( "ForumPCToledo", AES_Decrypt( PalavraEncriptada ) )
A PalavraEncriptada você gera em um aplicativo seu, extra, e guarda para usá-la como padrão de encriptação em todos seus clientes e códigos.

As funções AES_Encript() e AES_Decrypt() são conhecidas no PHP mas se existir correspondência no Harbour faça uso delas.

No Harbour é possivel encontrar:

Código: Selecionar todos

...
HB_BlowFishEncrypt_CFB(<cBfKey>,<cText>[,<cInitSeed>])-><cCipher>|Nil
HB_BlowFishDecrypt_CFB(<cBfKey>,<cCipher>[,<cInitSeed>])-><cText>|Nil
...
HB_Crypt(<cString>,<cKey>)->cEncryptedString
HB_Decrypt(<cEncryptedString>,<cKey>)->cString
...
hb_MD5Encrypt(<cText>,<cPasswd>)-><cCipher>
hb_MD5Decrypt(<cCipher>,<cPasswd>])-><cText>
Você poderia muito bem usar:

Código: Selecionar todos

...
PalavraEncriptada := "hTYsk#69Jysky3jh6@3ukK"
...
NovaPalavraEncriptada := CJP_Encript( "ForumPCToledo", CJP_Decrypt( PalavraEncriptada ) )
...

FUNCTION CJP_Encrypt( cString, cKey )
    RETURN HB_Crypt( cString, cKey )

FUNCTION CJP_Decrypt( cEncryptedString, cKey )
    RETURN HB_Decrypt( cEncryptedString, cKey )
Espero que o esboço apresentado seja útil.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Proteção de Banco de Dados MySQL

Mensagem por cjp »

Esta última solução me pareceu muito boa.

Mas não tenho certeza se entendi bem o que fazer.

A ideia é salvar na base de dados de forma encriptada, usando esta solução que vc me passou. E, quando precisar dos dados, desencriptá-los no próprio sistema em Harbour. É isso? E como desencriptar?

Além disso, será que esta é a melhor forma de proteger meu banco de dados de acesso a terceiros? Porque isso certamente será bem trabalhoso (mudar todo meu sistema para encriptar e desencriptar demandará certamente muitos meses de trabalho). Além disso, isso inviabilizaria qualquer outra forma de uso dos dados, né? Por exemplo, se eu precisar acessar os dados pelo HeidiSQL (o que faço frequentemente), não conseguirei, certo?
Inacio de Carvalho Neto
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Proteção de Banco de Dados MySQL

Mensagem por rochinha »

Amiguinhos,

cjp
Desde os tempos do SIX Library temos boas opções para segurança de tabelas desde suas funções, incluindo escrita baixo nivel do header das tabelas, mas funcionava muito bem quando o trabalho acontecia centralizado em pc unico.

Quando imaginávamos estas proteções para uso em rede acabamos por encontrar problemas de travamentos em maquinas enquanto outras ainda estavam com tabelas abertas.

Depois passamos a usar semáforos e creio que muitos ainda tem estas características em funcionamento.

A encriptação por campos é a melhor saída, já que somente o conteúdo será manipulado e não os registros ou tabelas inteiras.

Voce criptografa o conteúdo do campo, salva e pronto e quando for visualizar os dados desfaz a criptografia.

Exemplo:

Você tem um tabela com o campo NOME e não quer que alguém abra e veja o nome salvo quando aberto pelo DBU por exemplo.

No momento de salvar, ou seja, durante uma inclusão de registro ou alteração, ao fazer o salvamento do dado bastará criptografar o mesmo, repassar para o campo e dar o commit.

Parapegar o conteúdo do campo para apresentar em uma lista, imprimir em um relatório ou visualizar num browser, deverá descriptografar o conteúdo do campo para uma variável e apresentá-la onde quiser.

Ao capturar o conteúdo do campo e descriptografá-lo para uma variável o dado estará legível enquanto que o conteúdo no campo ainda estará criptografado para que outra aplicação possa fazer o mesmo processo sem sofrer interferência por travamentos.

Se o dado da variável for alterado emtão basta criptografá-lo antes de repassar para o campo.

Código: Selecionar todos

        M->NOME := "ROCHINHA"
        ...
        dbSeek( M->NOME )
        if .not. found()
           dbAppend()
           ...
           CLIENTES->FANTASIA  := M->NOME
           CLIENTES->NOME      := Encripta( M->NOME, "M1NH@S3NH@ )
           ...
           dbCommit()
           dbRUnlock()
        else
           dbRlock()
           ...
           CLIENTES->FANTASIA  := M->NOME
           CLIENTES->NOME      := Encripta( M->NOME, "M1NH@S3NH@ )
           ...
           dbCommit()
           dbRUnlock()
        endif
Ao recuperar

Código: Selecionar todos

        ...
        M->NOME := DesEncripta( CLIENTES->NOME, "M1NH@S3NH@ )
        ...
Não é necessário travar o registro para descriptografar um conteúdo.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Proteção de Banco de Dados MySQL

Mensagem por cjp »

Entendi.
Fiz um teste com MySQL, mas dá erro na hora de colocar na tabela encriptado, talvez por causa dos caracteres estranhos. Veja:

Código: Selecionar todos

Palavra := "teste de encriptação do Rochinha"
?"insert into teste (teste) values ('"+hb_crypt(Palavra)+"')"
inkey(11)
?exqado("insert into teste (teste) values ('"+hb_crypt(Palavra)+"')",3)
?procline(0)
inkey(11)

IF ADOconecta( nProvAcoes, 3 )
   cProc=conexao:execute("SELECT teste from teste where id=3")
   ?hb_decrypt(cProc:Fields("teste"):Value)
   inkey(11)
   inkey(11)
   cProc:Close()
   conexao:close()
Endif
Só uma dúvida: uma pessoa que tenha acesso à encriptação do Harbour (já que a função de encriptação é do Harbour) não conseguiria desencriptar o campo?
Anexos
tela.png
tela.png (8.11 KiB) Exibido 10828 vezes
Inacio de Carvalho Neto
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Proteção de Banco de Dados MySQL

Mensagem por rochinha »

Amiguinhos,

cjp A codificação do banco de dados deve obedecer a um padrão que tenha todos os caracteres da lingua portuguesa. UTF-8 é o codepage mais adequado, não p único, para incrustrar uma tabela MySQL.
uma pessoa que tenha acesso à encriptação do Harbour ... não conseguiria desencriptar o campo?
Pense num arquivo ZIP. Qualquer um poderá abri-lo caso não tenha sido protegido por senha. Se abrí-lo no notepad poderá ver uma série de caracteres malucos. Assim se assemelha o conteúdo de uma
criptografia em texto.

Sem a senha adequada não será possível obter o conteúdo. Para se quebrar uma senha usando ferramentas de Brute-Force qualquer pessoa pode obter o conteúdo. Não existe proteção perfeita. Mas algo bom na proteção é que para quebrá-la o malandro terá de possuir uma máquina de processamento possante e dependendo do tamanho da senha e sua complecidade ele poderá levar semanas meses em processamento sem parar a quebra.

Use tranquilamente as funções de criptografia e segurança existentes e adote técnica de mudança da senha de proteção a cada x dias.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
ivanil
Usuário Nível 3
Usuário Nível 3
Mensagens: 166
Registrado em: 11 Set 2004 15:13
Localização: Florianópolis/SC

Proteção de Banco de Dados MySQL

Mensagem por ivanil »

Caro colega;

Você pegou carona num tópico e lendo as mensagens e os direcionamentos, as coisas podem ler a muita confusão.

Você cogita proteger alguns dados, apenas lembrando que o Banco de dados é propriedade do Cliente, tem que ficar disponível para auditoria, fiscalização, acesso de aplicativos de terceiros entre outros, ou seja, a característica de proteção de Banco de dados é algo muito mais profundo que tem a ver com a arquitetura de rede, mas não foi isso que perguntou...

Para gravar dados binários em qualquer banco de dados, use a classe TipEncoderBase64

Código: Selecionar todos

Function  test64(Texto,x)
   Local cPassword:="djfd dfkfjdkl vkfdjak fdsaj@!"
   Local :=TipEncoderBase64():New()
   x    :=IIF(x=Nil    ,.F.,x)
   Texto:=IIF(Texto=Nil,"" ,Texto)
   if x
      Texto:=o:Encode(hb_crypt(Texto,cPassword))
   else
      Texto:=hb_decrypt(o:Decode(Texto),cPassword)
      IIF(empty(Texto),Texto:="",NIL)
   endif
   Return Texto
Entao a alteração abaixo deve funcionar bem para você...

Código: Selecionar todos

Palavra := "teste de encriptação do Rochinha"
?"insert into teste (teste) values ('"+test64(Palavra,.T.)+"')"
inkey(11)
?exqado("insert into teste (teste) values ('"+test64(Palavra,.T.)+"')",3)
?procline(0)
inkey(11)

IF ADOconecta( nProvAcoes, 3 )
   cProc=conexao:execute("SELECT teste from teste where id=3")
   ?test64(cProc:Fields("teste"):Value,.F.)
   inkey(11)
   inkey(11)
   cProc:Close()
   conexao:close()
Endif
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Proteção de Banco de Dados MySQL

Mensagem por JoséQuintas »

CJP:
Essa base é acessada somente pelo harbour em ansi, ou também é acessada pelo php em utf-8?
Porque se for pelos dois, tem que funcionar nos dois.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Proteção de Banco de Dados MySQL

Mensagem por cjp »

Pense num arquivo ZIP. Qualquer um poderá abri-lo caso não tenha sido protegido por senha. Se abrí-lo no notepad poderá ver uma série de caracteres malucos. Assim se assemelha o conteúdo de uma
criptografia em texto.
Sem a senha adequada não será possível obter o conteúdo. Para se quebrar uma senha usando ferramentas de Brute-Force qualquer pessoa pode obter o conteúdo. Não existe proteção perfeita. Mas algo bom na proteção é que para quebrá-la o malandro terá de possuir uma máquina de processamento possante e dependendo do tamanho da senha e sua complecidade ele poderá levar semanas meses em processamento sem parar a quebra.
Use tranquilamente as funções de criptografia e segurança existentes e adote técnica de mudança da senha de proteção a cada x dias.
Entendi. E sim, este nível de segurança é bem satisfatório. Estava em dúvida porque não estava usando a senha, então achei que, sem senha, qualquer pessoa com o mínimo de conhecimento conseguiria decodificar. Mas agora ficou claro.
A codificação do banco de dados deve obedecer a um padrão que tenha todos os caracteres da lingua portuguesa. UTF-8 é o codepage mais adequado, não p único, para incrustrar uma tabela MySQL.
Não entendo muito disso, mas vejo que a tabela está com COLLATE='latin1_swedish_ci. Seria este o problema?
Recentemente eu consegui corrigir problemas de acentuação, com ajuda dos colegas aqui do grupo (em outro tópico), para uso tanto no Harbour quanto em PHP.
Você cogita proteger alguns dados, apenas lembrando que o Banco de dados é propriedade do Cliente, tem que ficar disponível para auditoria, fiscalização, acesso de aplicativos de terceiros entre outros, ou seja, a característica de proteção de Banco de dados é algo muito mais profundo que tem a ver com a arquitetura de rede, mas não foi isso que perguntou...
Neste caso não é problema, pois o cliente sou eu mesmo kkk
Entao a alteração abaixo deve funcionar bem para você...
Está dando erro em Texto:=o:Encode(hb_crypt(Texto,cPassword)). O que seria o o?
Essa base é acessada somente pelo harbour em ansi, ou também é acessada pelo php em utf-8?
Porque se for pelos dois, tem que funcionar nos dois.
Por enquanto estou apenas fazendo testes, mas sim, vai ser usada em harbour (OEM 850) e em php (utf-8).
É possível?
Inacio de Carvalho Neto
ivanil
Usuário Nível 3
Usuário Nível 3
Mensagens: 166
Registrado em: 11 Set 2004 15:13
Localização: Florianópolis/SC

Proteção de Banco de Dados MySQL

Mensagem por ivanil »

Local o:=TipEncoderBase64():New()

Mas se vc for usar estes dados no PHP, perceba que está função de criptografia e exclusiva do harbour; então não adianta.
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Proteção de Banco de Dados MySQL

Mensagem por rochinha »

Amiguinhos,
Mas se vc for usar estes dados no PHP, perceba que está função de criptografia e exclusiva do harbour; então não adianta.
Base64 é uma codificação padronizada. Como não funcionaria no PHP e no Harbour. Você chegou a enfrentar alguma discrepância? apresente o seu caso para termos uma idéia.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Responder