Página 2 de 5

Proteção de Banco de Dados MySQL

Enviado: 11 Jan 2023 22:54
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?

Proteção de Banco de Dados MySQL

Enviado: 12 Jan 2023 10:22
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...

Proteção de Banco de Dados MySQL

Enviado: 11 Fev 2023 23:57
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.

Proteção de Banco de Dados MySQL

Enviado: 15 Mar 2023 22:08
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.

Proteção de Banco de Dados MySQL

Enviado: 12 Jul 2023 23:52
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 é?

Proteção de Banco de Dados MySQL

Enviado: 13 Jul 2023 12:42
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.

Proteção de Banco de Dados MySQL

Enviado: 16 Jul 2023 01:31
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?

Proteção de Banco de Dados MySQL

Enviado: 16 Jul 2023 03:47
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.

Proteção de Banco de Dados MySQL

Enviado: 31 Jul 2023 10:49
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?

Proteção de Banco de Dados MySQL

Enviado: 31 Jul 2023 13:13
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.

Proteção de Banco de Dados MySQL

Enviado: 31 Jul 2023 21:12
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

Proteção de Banco de Dados MySQL

Enviado: 31 Jul 2023 21:57
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.

Proteção de Banco de Dados MySQL

Enviado: 03 Ago 2023 00:54
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?

Proteção de Banco de Dados MySQL

Enviado: 03 Ago 2023 13:49
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.

Proteção de Banco de Dados MySQL

Enviado: 03 Ago 2023 16:47
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.