Criptografia Reversível

510 views
Skip to first unread message

Gustavo Almeida

unread,
Jul 21, 2013, 10:33:35 PM7/21/13
to dotn...@googlegroups.com
Pessoal,

T� desenvolvendo um sistema WINDOWS FORM que se conectar� com um banco
MySQL.
O sistema ser� usado por v�rios clientes diferentes e, ent�o, terei que
armazenar em algum lugar o SERVIDOR, LOGIN e SENHA do banco de dados.

Atualmente uso um arquivo ".ini" com as configura��es, mas fica tudo l�
vis�vel (LOGIN e SENHA).
Nunca trabalhei com criptografia... Ainda mais nesse caso, que precisa
ser revers�vel...

Algu�m tem alguma dica pra me indicar???

Matheus Lima

unread,
Jul 21, 2013, 10:39:41 PM7/21/13
to dotn...@googlegroups.com
Esse link explica como obter o MD5 de uma String:


Em 21 de julho de 2013 23:37, Matheus Lima <matheus...@gmail.com> escreveu:
Trabalhe com MD5. Ao invés de guardar as senhas, armazene os hashs e quando for se conectar ao banco, calcule o MD5 da senha e compare com o MD5 salvo em banco.


Em 21 de julho de 2013 23:33, Gustavo Almeida <gus...@gmasoftwares.com.br> escreveu:

Pessoal,

Tô desenvolvendo um sistema WINDOWS FORM que se conectará com um banco MySQL.
O sistema será usado por vários clientes diferentes e, então, terei que armazenar em algum lugar o SERVIDOR, LOGIN e SENHA do banco de dados.

Atualmente uso um arquivo ".ini" com as configurações, mas fica tudo lá visível (LOGIN e SENHA).
Nunca trabalhei com criptografia... Ainda mais nesse caso, que precisa ser reversível...

Alguém tem alguma dica pra me indicar???

--
==============================
Comunidade de desenvolvedores Dot Net no Brasil

Facebook: www.facebook.com/grupodotnetbr

WebSite: www.dotnetbr.com

E-mail do Grupo: dotn...@googlegroups.com
==============================
--- You received this message because you are subscribed to the Google Groups "DotNet Brasil" group.
To unsubscribe from this group and stop receiving emails from it, send an email to dotnet_br+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.





--
Matheus Lima
Desenvolvedor de Software - ViaSoluti
Graduando em Engenharia de Teleinformática - UFC



--
Matheus Lima
Desenvolvedor de Software - ViaSoluti
Graduando em Engenharia de Teleinformática - UFC

Matheus Lima

unread,
Jul 21, 2013, 10:37:13 PM7/21/13
to dotn...@googlegroups.com

Gustavo Almeida

unread,
Jul 21, 2013, 11:51:08 PM7/21/13
to dotn...@googlegroups.com

Não sei se entendi, Matheus...

Se eu gravar apenas o HASHs MD5, como vou me conectar ao banco???

Tipo:

DADOS DO SERVIDOR MYSQL

Servidor: 200.200.200.200
Login: nome_do_usuario
Senha: senha_do_usuario_do_banco

Esses dados que eu preciso ter de forma criptografada. E tem que ser uma criptografia REVERSÍVEL, para que seja possível autenticar no banco!





Em 21/07/2013 23:39, Matheus Lima escreveu:
Esse link explica como obter o MD5 de uma String:
Em 21 de julho de 2013 23:37, Matheus Lima <matheus...@gmail.com> escreveu:
Trabalhe com MD5. Ao invés de guardar as senhas, armazene os hashs e quando for se conectar ao banco, calcule o MD5 da senha e compare com o MD5 salvo em banco.
Em 21 de julho de 2013 23:33, Gustavo Almeida <gus...@gmasoftwares.com.br> escreveu:
Pessoal,

Tô desenvolvendo um sistema WINDOWS FORM que se conectará com um banco MySQL.
O sistema será usado por vários clientes diferentes e, então, terei que armazenar em algum lugar o SERVIDOR, LOGIN e SENHA do banco de dados.

Atualmente uso um arquivo ".ini" com as configurações, mas fica tudo lá visível (LOGIN e SENHA).
Nunca trabalhei com criptografia... Ainda mais nesse caso, que precisa ser reversível...

Alguém tem alguma dica pra me indicar???

--
==============================
Comunidade de desenvolvedores Dot Net no Brasil

Facebook: www.facebook.com/grupodotnetbr

WebSite: www.dotnetbr.com

E-mail do Grupo: dotn...@googlegroups.com
==============================
--- You received this message because you are subscribed to the Google Groups "DotNet Brasil" group.
To unsubscribe from this group and stop receiving emails from it, send an email to dotnet_br+...@googlegroups.com.

For more options, visit https://groups.google.com/groups/opt_out.





--
Matheus Lima
Desenvolvedor de Software - ViaSoluti
Graduando em Engenharia de Teleinformática - UFC



--
Matheus Lima
Desenvolvedor de Software - ViaSoluti
Graduando em Engenharia de Teleinformática - UFC
--
==============================
Comunidade de desenvolvedores Dot Net no Brasil
 
Facebook: www.facebook.com/grupodotnetbr
 
WebSite: www.dotnetbr.com
 
E-mail do Grupo: dotn...@googlegroups.com
==============================
---
You received this message because you are subscribed to the Google Groups "DotNet Brasil" group.
To unsubscribe from this group and stop receiving emails from it, send an email to dotnet_br+...@googlegroups.com.

Gaspar Santos

unread,
Jul 22, 2013, 4:59:44 AM7/22/13
to dotn...@googlegroups.com

Usa algum aalgoritmo de criptografia simétrica. Onde tens uma chave para encriptar e desencriptar.

Daniel Franzini

unread,
Jul 22, 2013, 8:26:33 AM7/22/13
to dotn...@googlegroups.com
O que você entende por "Criptografia REVERSÍVEL"?

2013/7/22 Gustavo Almeida <gus...@gmasoftwares.com.br>



--
Daniel

"Let us change our traditional attitude to the construction of programs. Instead of imagining that our main task is to instruct a computer what to do, let us concentrate rather on explaining to human beings what we want a computer to do." (Donald Knuth)

"Yes, technogeeks can be funny, even if only to each other." (http://www.boogieonline.com/revolution/science/humor/)"

"Man is driven to create; I know I really love to create things. And while I'm not good at painting, drawing, or music, I can write software." (Yukihiro Matsumoto, a.k.a. ``Matz'')

Marcus Alexandre Silva

unread,
Jul 22, 2013, 9:09:21 AM7/22/13
to dotn...@googlegroups.com
MD5 não é o caso da maneira que ele quer, pois ele precisa armazenar credenciais locais, algo como os cookies de navegadores que armazenam identidade. 
Bom Gustavo, por sua aplicação hoje deixar tudo visível  em um INI não me parece que você quer uma segurança tão reforçada assim, creio que um RSACryptoServiceProvider resolve seu caso, já que o objetivo é não deixar as pessoas veem qual a senha. Não é a maneira mais segura mas resolve.
Um jeito bacana também é, ao invés de criptografar os dados usuário/senha do INI você criptografa o arquivo inteiro e armazena um 'prazo de validade' e um 'identificador do computador' em dois novos parâmetros. Assim, de tempos em tempos o arquivo se torna inválido para logar no seu sistema e sempre só funcionará para aquele computador especifico.

Matheus Lima

unread,
Jul 21, 2013, 11:55:28 PM7/21/13
to dotn...@googlegroups.com
Então usa uma criptografia RSA. Ela é reversível e tem classes pra trabalhar com ela em C#.

Gustavo Almeida

unread,
Jul 22, 2013, 10:35:41 AM7/22/13
to dotn...@googlegroups.com
Opa!
Valeu pela dica!

Luiz Carlos Faria

unread,
Jul 22, 2013, 10:37:45 AM7/22/13
to Grupo .NET Br

Gustavo,

MD5 é uma estratégia de criptografia unidirecional, portanto não pode ser revertido.

Você pode usar algum modelo de chave pública e privada, onde a privada é embarcada na aplicação, ou ainda poderia se basear no seu assembly. Somente o hash do seu executável garantiria a chave, enfim, assim você garante que somente seu executável conseguirá descriptografar a chave.

Gustavo Almeida

unread,
Jul 22, 2013, 10:38:27 AM7/22/13
to dotn...@googlegroups.com
Suponha que eu tenha:

Login -> 'gustavo'
Senha -> '123456'

Preciso de algoritmo que transforme 'gustavo' e '123456' em qualquer coisa que não seja "gustavo" e "123456", mas que depois seja possível eu fazer o caminho inverso, transformando as strings de volta em 'gustavo' e '123456'.

É isso!
"Man is driven to create; I know I really love to create things. And while I'm not good at painting, drawing, or music, I can write software." (Yukihiro Matsumoto, a.k.a. ``Matz'') --

Gustavo Almeida

unread,
Jul 22, 2013, 10:39:14 AM7/22/13
to dotn...@googlegroups.com
Valeu Marcus,

Vou dar uma olhada nisso! Acho que vai me atender, sim.

Abraço.

Renato Cantarino

unread,
Jul 22, 2013, 10:41:31 AM7/22/13
to dotn...@googlegroups.com
cara, gera essas fields croptografada e grava no ini.
Quando for o login, pega as values e descriptografa e passa para connection!

Att,
Renato Cantarino

Gustavo Almeida

unread,
Jul 22, 2013, 10:45:58 AM7/22/13
to dotn...@googlegroups.com
Então, Renato, é justamente isso que eu preciso.
A questão é que eu NUNCA fiz nada com criptografia, então por isso eu pedi conselhos aqui, pra ver o que vocês me sugerem!

Eu sei o que eu preciso fazer, só não tenho certeza sobre COMO fazer, entende??? rs rs rs...

Abraço!

Daniel Franzini

unread,
Jul 22, 2013, 10:50:29 AM7/22/13
to dotn...@googlegroups.com
Boa sugestão e é o tradicional.

Mas tem um problema: onde guardar a chave?



2013/7/22 Renato Cantarino <renato.c...@gmail.com>

Renato Cantarino

unread,
Jul 22, 2013, 10:51:23 AM7/22/13
to dotn...@googlegroups.com
ok....

geras as fields e grava no ini.







Renato Cantarino

unread,
Jul 22, 2013, 10:51:47 AM7/22/13
to dotn...@googlegroups.com
Daniel,

chave criptografado no INI.

Daniel Franzini

unread,
Jul 22, 2013, 10:53:43 AM7/22/13
to dotn...@googlegroups.com
Chave criptografada com qual outra chave?

Gustavo Almeida

unread,
Jul 22, 2013, 10:54:27 AM7/22/13
to dotn...@googlegroups.com
Valeu!

Vou dar uma olhada aqui!

Roger Luiz

unread,
Jul 22, 2013, 10:55:55 AM7/22/13
to dotn...@googlegroups.com
Alguém aqui sugeriu de usar o hash do arquivo executável como chave.

Renato Cantarino

unread,
Jul 22, 2013, 10:57:18 AM7/22/13
to dotn...@googlegroups.com
é o uma referencia.

tipo no ini o passWord dele estara, sei la,

<key name="chave">
<key value=" xingLingMiziFi">


no cs, chama o metodo foguete    para descript, ae descrip a pass, com esse retorno descript nome e senha.






Em 22 de julho de 2013 11:54, Gustavo Almeida <gus...@gmasoftwares.com.br> escreveu:



--

Att,
Renato Cantarino

Daniel Franzini

unread,
Jul 22, 2013, 11:04:32 AM7/22/13
to dotn...@googlegroups.com
Problema: se mudar o arquivo por conta de atualizacao troca a chave de tudo?

2013/7/22 Roger Luiz <rogi...@gmail.com>

Renato Cantarino

unread,
Jul 22, 2013, 11:06:43 AM7/22/13
to dotn...@googlegroups.com
qual arquivo?
o ini ou o cs com os metodos?

Gustavo Almeida

unread,
Jul 22, 2013, 11:28:07 AM7/22/13
to dotn...@googlegroups.com

Não vou usar o hash do arquivo como chave!
A chave pode ser embarcada no próprio executável.

Minha necessidade de segurança não é nada muito crítico!
É só mesmo pro NOME e SENHA não ficar estampado na cara de curiosos.

Valeu pelas dicas, pessoal!
Acho que com tudo que sugeriram, eu já consigo trilhar o caminho das pedras aqui!
"Man is driven to create; I know I really love to create things. And while I'm not good at painting, drawing, or music, I can write software." (Yukihiro Matsumoto, a.k.a. ``Matz'') --

Rodrigo Kumpera

unread,
Jul 22, 2013, 12:15:06 PM7/22/13
to dotn...@googlegroups.com
NÃO, NUNCA e JAMAIS.

MD5 NÃO é segura para absolutamente nada faz mais de uma década.
NUNCA use MD5 pois existem algorítmos de hashing que são realmente segundo.
JAMAIS sugira para alguém usar MD5, pois é uma ótima forma de garantir um sistema inseguro.






2013/7/21 Matheus Lima <matheus...@gmail.com>
To unsubscribe from this group and stop receiving emails from it, send an email to dotnet_br+...@googlegroups.com.

Matheus Lima

unread,
Jul 22, 2013, 12:21:37 PM7/22/13
to dotn...@googlegroups.com
É, tem toda razão Kumpera, havia me esquecido que o MD5 já foi quebrado. Se ele fosse usar um Hash mesmo (coisa que não serve pro problema), ele poderia usar algo mais seguro, como SHA-2. 

Renato Cantarino

unread,
Jul 22, 2013, 12:27:57 PM7/22/13
to dotn...@googlegroups.com
Ja pode ser nomeado MVP.

Att,
Renato Cantarino

Rafael Marques

unread,
Jul 22, 2013, 12:29:06 PM7/22/13
to dotn...@googlegroups.com
você pode utilizar um salt usando CSPRNG, etc. juntar com a senha que o usuário inseriu e gerar um hash utilizando SHA256, SHA512, etc... e o que vc vai salvar no banco é o hash e o salt


2013/7/22 Rodrigo Kumpera <kum...@gmail.com>

Marcus Alexandre Silva

unread,
Jul 22, 2013, 12:33:11 PM7/22/13
to dotn...@googlegroups.com
Meu Deus...  
Seguro nenhum sistema é, a menos que você coloque a maquina que ele esta armazenado desligada em um cofre. Até porque o SHA256 hoje é o MD5 amanhã...
Tudo depende de cenários, por exemplo: Para se quebrar uma MD5 com uma máquina com força bruta (a aplicação dele é windowsform) pode se demorar dias, ou meses.... Principalmente se o cara implementar algo de a cada x erros bloqueia o login...
Para cada cenário deve-se observar a melhor solução, MD5 aqui não é boa não é porque já foi quebrada, mas sim porque o cara precisa Criptografar/Descrcriptografar. MD5 serve para comparar em mão unica.


Em 22 de julho de 2013 13:15, Rodrigo Kumpera <kum...@gmail.com> escreveu:

Rafael Marques

unread,
Jul 22, 2013, 12:44:30 PM7/22/13
to dotn...@googlegroups.com
se vc não "saltear" o seu hash, com uma lookup table você pode facilmente quebrar hashes SHA256, MD5, whirlpool, etc...

a questão não é o SHA256 é o MD5 de manhã... a questão é tentar fazer alguma coisa descente... se vc seguir com este pensamento, você vai ficar estagnado no tempo achando que tudo tende a ser trocado... e no assunto em questão, se não é para tentar fazer algo seguro, pq fazer então?


2013/7/22 Marcus Alexandre Silva <inf.marcu...@gmail.com>



--

Rafael Marques

unread,
Jul 22, 2013, 12:45:10 PM7/22/13
to dotn...@googlegroups.com
só pra corrigir o descente ali: decente*


2013/7/22 Rafael Marques <rafaelo...@gmail.com>

daniel carli

unread,
Jul 22, 2013, 12:51:01 PM7/22/13
to dotn...@googlegroups.com
Caramba, gostei dessa:

"Seguro nenhum sistema é"
Daniel Carli

Marcus Alexandre Silva

unread,
Jul 22, 2013, 12:52:55 PM7/22/13
to dotn...@googlegroups.com
Rafael,

O ponto de vista que eu tento defender é que o conceito de segurança é relativo. Você não deve escrever segurança de nasa para aplicações que não precisam de segurança de nasa, principalmente no cenário que foi passado: O desenvolvedor não tem experiencia nenhuma com criptografia e se sua aplicação sobreviveu até ontem sem nenhum tipo de criptografia. No minimo eu deduzi que quanto mais simples o código, melhor.
Já trabalhei em sistemas que precisavam de segurança muito alta e já vi sistemas que somente o minimo é necessário. 
Somente peço para que pensem: Tudo depende....
Se for levar ao pé da segurança total a primeira coisa que ele precisaria era se livrar de um arquivo to tipo INI :)...
E só mais uma coisa: Agente escreve código para a real necessidade dos outros e não para a nossa necessidade de desenvolvedor....

Rafael Marques

unread,
Jul 22, 2013, 1:03:32 PM7/22/13
to dotn...@googlegroups.com
mas isso não é complicar... com uma classe com umas 50 linhas você cria métodos para criar o salt, gerar o hash, verificar se a senha informada bate com o hash + salt, ainda mandar um slow hash pra dificultar um pouquinho mais brute force / dicionário, etc.... 
isso não é nem de longe o sistema mais seguro do mundo, mas um mínimo para manter uma certa segurança

Marcus Alexandre Silva

unread,
Jul 22, 2013, 1:07:18 PM7/22/13
to dotn...@googlegroups.com
Tudo bem, escreve ai o teste de 4 linhas que consome este algorítimo de 50 linhas que irá resolver o caso dele :)

Rafael Marques

unread,
Jul 22, 2013, 1:11:06 PM7/22/13
to dotn...@googlegroups.com
        [Test]
        public void CanValidateHash()
        {
            string hash = service.CreateHash("1234");
            Assert.IsTrue(service.ValidatePassword("1234", hash));
        }

Marcus Alexandre Silva

unread,
Jul 22, 2013, 1:24:30 PM7/22/13
to dotn...@googlegroups.com
To achando que não consigo explicar mesmo... 

Gustavo Almeida

unread,
Jul 22, 2013, 1:25:44 PM7/22/13
to dotn...@googlegroups.com
Valeu, Marcus!

É por aí mesmo ;-)

Abraço e mais uma vez obrigado a todos que colaboraram.
Já consegui escolher aqui o caminho a trilhar!


2013/7/21 Matheus Lima <matheus...@gmail.com>



--

Marcus Alexandre Silva

unread,
Jul 22, 2013, 1:41:18 PM7/22/13
to dotn...@googlegroups.com
Vou tentar com uma outra abordagem: 
Da pra usar SALT com MD5, mas se eu precisasse de um SALT eu não ia usar MD5 porque a necessidade de segurança é bem maior... Provavelmente iria no mesmo caminho que você trilhou, que é bem mais seguro...

Rafael Marques

unread,
Jul 22, 2013, 1:46:28 PM7/22/13
to dotn...@googlegroups.com
Marcus, eu entendi o que você queria dizer... 
eu só estava tentando dizer que não é muito complicado adicionar um pouco mais de segurança...

Abraço ;)

Daniel Menezes

unread,
Jul 26, 2013, 8:51:50 AM7/26/13
to dotn...@googlegroups.com
Gustavo,

Consegui uma classe na Internet que faz o que você está precisando,
veja se ajuda:

Claro que mudei algumas coisas mas de resto mantive o que encontrei.


class Encryption
    {            
        const string senha = "z12468A#EaHdL"; //Utilizada para embaraçar a senha

        public string Criptagrafar(string cTexto)
        {
            return (Encrypt(cTexto));
        }

        public string Desriptagrafar(string cTexto)
        {
            return (Decrypt(cTexto));
        }

        private static string Encrypt(string Message)
        {
            byte[] Results;
            System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding();
            MD5CryptoServiceProvider HashProvider = new MD5CryptoServiceProvider();
            byte[] TDESKey = HashProvider.ComputeHash(UTF8.GetBytes(senha));
            TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider();
            TDESAlgorithm.Key = TDESKey;
            TDESAlgorithm.Mode = CipherMode.ECB;
            TDESAlgorithm.Padding = PaddingMode.PKCS7;
            byte[] DataToEncrypt = UTF8.GetBytes(Message);
            try
            {
                ICryptoTransform Encryptor = TDESAlgorithm.CreateEncryptor();
                Results = Encryptor.TransformFinalBlock(DataToEncrypt, 0, DataToEncrypt.Length);
            }
            finally
            {
                TDESAlgorithm.Clear();
                HashProvider.Clear();
            }
            return Convert.ToBase64String(Results);
        }

        private static string Decrypt(string Message)
        {
            byte[] Results;
            System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding();
            MD5CryptoServiceProvider HashProvider = new MD5CryptoServiceProvider();
            byte[] TDESKey = HashProvider.ComputeHash(UTF8.GetBytes(senha));
            TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider();
            TDESAlgorithm.Key = TDESKey;
            TDESAlgorithm.Mode = CipherMode.ECB;
            TDESAlgorithm.Padding = PaddingMode.PKCS7;
            byte[] DataToDecrypt = Convert.FromBase64String(Message);
            try
            {
                ICryptoTransform Decryptor = TDESAlgorithm.CreateDecryptor();
                Results = Decryptor.TransformFinalBlock(DataToDecrypt, 0, DataToDecrypt.Length);
            }
            finally
            {
                TDESAlgorithm.Clear();
                HashProvider.Clear();
            }
            return UTF8.GetString(Results);
        }
    }




Atenciosamente,


----------------------------------------------------------------------------------------------------------------------
ANTES DE REENCAMINHAR ESTA MENSAGEM:
1) Apague o meu e-mail e o meu nome.
2) Apague também os endereços dos amigos antes de reenviar.
3) Encaminhe como cópia oculta (Cco ou Bcc) aos seus destinatários.
Agindo sempre assim dificultaremos a disseminação de vírus, spams e outros perigos.

Reply all
Reply to author
Forward
0 new messages