Criptografia de String de Conexão no Web.Config
Visual Studio.NET 2005
Olá pessoal, meu nome é Mauricio Junior. Vou mostrar como trabalhar com criptografia da string de conexão dentro do web.config. Dessa forma, qualquer pessoa, lamer, larva, hacker, cracker, phreaker ou guruque invadir o servidor e tentar abrir o banco de dados verificando em seu arquivo de configuração web.config; não conseguirá ver qual o banco de dados, senha e usuário. Com isso a segurança do seu sistema fica bem mais confiável e prático.
Se ainda não sabe qual a diferença entre eles. Disponibilizei nas referências abaixo.
Lamer: é o principiante que se acha o máximo. Acabou de ganhar um micro e já quer invadir os computadores do Pentágono. Normalmente são odiados pelos Hacker verdadeiros. |
Referência: 1.1
Larva: Está se tornando um verdadeiro Hacker. Já consegue desenvolver suas próprias técnicas para invadir sistemas. |
Referência: 1.2
Hacker: Tem conhecimentos reais de programação e de sistemas operacionais, principalmente o Unix e o Linux, que são os mais usados pelos servidores da Internet. Conhece quase todas as falhas de segurança dos sistemas e procura achar novas. Desenvolve suas próprias técnicas e programas de invação, e despreza as receitas de bolo. Tenta invadir apenas para o conhecimento, geralmente não faz nada com os dados que conseguiu pegar. |
Referência: 1.3
Cracker: É o Hacker do mal, que invade sistemas, rouba dados e arquivos, números de cartão de crédito, faz espionagem industrial e destrói dados. |
Referência: 1.4
Phreaker: Hacker com bons conhecimentos de telefonia que consegue inclusive fazer chamados internacionais sem pagar, o que lhe permite desenvolver seus ataques a partir de um servidor de outro país. |
Referência: 1.5
Guru: O mestre dos Hackers. |
Referência: 1.6
Depois de toda essa definição e conhecendo o inimigo, irei mostrar como evitar pelo menos uma invasão usando o arquivo de configuração de uma aplicação totalmente aberto, que é o Web.Config e App.Config.
Bom, antes de tudo segue mais uma frase criptografada para conhecimento e possibilidade de ganhar prêmios se for descriptografada.
Ftuvep nvjup f nf nboef f-nbjm dpn p ujuvmp: eftdsiruphsbgfj.
Voltando ao artigo, criei uma class libary para desenvolver um framework, porém não é necessário criar, só coloque os métodos em uma classe segura e legal. Utilizo com class libary e adiciono como referência do projeto, dessa forma fica também seguro o código porque só vai a DLL em si.
Criei uma classe chamada Criptografia.cs. (Referência 1.7)
Referência: 1.7
O primeiro método que irei criar é o que pega os valores do arquivo de configuração e descriptografa. (Referência 1.8)
/// <summary> /// Método que descriptografa dados /// Pega do App.config ou Web.Config automaticamente /// </summary> /// <returns></returns> public string DecryptConnectionString() { Byte[] b = Convert.FromBase64String(ConfigurationSettings.AppSettings["ConnectionString"]); string decryptedConnectionString = System.Text.ASCIIEncoding.ASCII.GetString(b); return decryptedConnectionString; } |
Referência: 1.8
Explicação:
Não tem muito que explicar no método, mesmo assim tentarei clarear se tiver alguma coisa obscura. A primeira linha, pego o que está no arquivo de configuração, converto para FromBase64String deixando a mesma em uma variável do tipo byte. A segunda linha de código, pego a string do codigo ASCII passando o valor armazenado na variável anterior e depois só retorno o valor descriptografado.
Uma dica é: no meu arquivo de configuração está criptografada, no ato de usar ou conectar no banco de dados, use o método para descriptografar, ou seja, antes do Open().
Criptografando ConnectionString
Fiz um outro método que é responsável para criptografar a string de conexão. (Referência 1.9)
/// <summary> /// Método para encriptografar string de conexao. /// Pega a conexao passada /// </summary> /// <param name="connectionString"></param> /// <returns></returns> public string EncryptConnectionString(string connectionString) { Byte[] b = System.Text.ASCIIEncoding.ASCII.GetBytes(connectionString); string encryptedConnectionString = Convert.ToBase64String(b); return encryptedConnectionString; } |
Referência: 1.9
Explicação:
A assinatura do método é um pouco diferente do anterior, agora existe um parâmetro de entrada do tipo string. Depois, converto a string passada para o codigo ASCII, armazenando na variável (b) do tipo byte. Converti para ToBase64 a variável byte, armazenei em uma string e retornei o valor para quem chamou.
Arquivo de Configuração
Criei uma aplicação WindowForm, toda aplicação desse tipo é automaticamente usado um arquivo de configuração chamado App.Config. (Referência 2.0)
<?xml version="1.0" encoding="utf-8" ?> <configuration> <appSettings> <add key="ConnectionString" value="UGFzc3dvcmQ9MTIzOyBQZXJzaXN0IFNlY3VyaXR5IEluZm89VHJ1ZTsgVXNlciBJZD1zYTsgSW5pdGlhbCBDYXRhbG9nPUJER0VDT1JFOyBEYXRhIFNvdXJjZT1zdGYtbHVpcw=="/> </appSettings> </configuration> |
Referência: 2.0
Layout da tela (Referência 2.1)
Referência: 2.1
Dados da tela.
Label Id = Label1 ----------------------------------------------------------------------------------------- TextBox Id = textBox2 MultLine = True ------------------------------------------------------------------------------------------ Label Id = Label2 ------------------------------------------------------------------------------------------ TextBox Id = textBox1 MultLine = True ----------------------------------------------------------------------------------------- Button Id = button1 Text = button1 |
Referência: 2.2
Cliquei duas vezes no botão, logo em seguida inclui o seguinte código. (Referência 2.3)
private void button1_Click(object sender, EventArgs e) { string con = (string) ConfigurationSettings.AppSettings["ConnectionString"]; Cript.Dados.Criptografia cript = new Cript.Dados.Criptografia(); label1.Text = "Descriptografado: " + cript.DecryptConnectionString(); label2.Text = "Criptografada: " + con; textBox1.Text = label1.Text; textBox2.Text = label2.Text; } |
Referência: 2.3
Explicação:
Primeiramente peguei a string de conexão usando o configurationsettings. Deve ser importado antes a linha: using System.Configuration;
Instanciei o a classe de criptografia criada anteriormente, armazenando a string descriptografada no label1 e a armazenada no label2.
Resultado final da aplicação criada. (Referência 2.4)
Referência: 2.4
Bom, esse é o resultado final de todo trabalho.
Fico por aqui, qualquer dúvida pode entrar em contato.
Mauricio Junior
Sign up to our newsletter
Receive our latest updates about programming languages, software, database, books, ebooks, classes, jobs and more.