CriptConnectionString

Olá pessoal, hoje eu vou mostrar como utilizar um framework publicado no NuGet.org chamado CriptConnectionString. Ele é responsável por deixar a sua conexão do banco de dados de forma criptografada dentro do arquivo de configuração. Resolvi compartilhar ele pelo Nuget.org e assim poder ajudar a todos que deseja um pouco mais de segurança junto a sua conexão com o banco de dados.

A sua conexão vai ficar mais ou menos assim dentro do arquivo de configuração: +xsKDWPqQHIB3wWzJ8fqv2e6YJPEF4FDp4bCY+2T9Q5qOTm5FHbBq1FB9FVmsFxUsL0t86FGbP0eHlaMd....

Vamos ver o passo a passo de como colocar ela assim.

Passo 1:

Importe o framework dentro do NuGet.org para a sua aplicação. Figura 1.

Figura 1 - Manage NuGet packages

Image

Clique com o botão direito em cima do projeto e escolha a opção manage nuget package.

A figura 2 mostra como buscar pelo framework para instalar.

Figura 2 - Procurando no NuGet

Image

Basta colocar o nome do framework CriptConnectionString que vai encontrar a versão 1.0.1. Clique no botão Install e veja instalado no projeto.

A figura 3 mostra ele instalado no projeto.

Image

Depois de instalado, vamos utilizar o CriptConnectionString.

Dentro do arquivo de configuração App.config por exemplo, coloque a sua conexão decriptografada. Code 1.1.

Code 1.1 - Arquivo de configuração

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<connectionStrings>
    <add name="MyConnection" connectionString="Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;" />
</connectionStrings>
<appSettings>
    <add key="publicKey" value="d41d8cd98f00b204e9800998ecf8427e" />
</appSettings>
</configuration>

O code 1.1 mostra a conexão e uma chave pública. Essa conexão está aberta e todos podem ver o usuário, senha, base de dados e servidor.

Lembre-se que esse é um aplicativo do tipo console application, então é necessário primeiro criptografar a string e depois usar ela. Aqui eu vou fazer os dois modos para ver que funciona sem problema. O framework tem uma chave pública e privada se quiser, no momento vamos utilizar apenas a chave pública para criptografar.

Dentro da classe principal da console application, vamos ver como ficou o código. Veja o code 1.2.

using System;

namespace UsingCriptConnectionString
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            var publicKey = System.Configuration.ConfigurationManager.AppSettings["publicKey"].ToString();
            var decryptConnection = System.Configuration.ConfigurationManager.ConnectionStrings["MyConnection"].ToString();

                //encrypt
            Encrypt(publicKey, decryptConnection);
        }

        private static void Encrypt(string publicKey, string connection)
        {
            CriptConnectionString.Cripto cripto = new CriptConnectionString.Cripto();
            Console.WriteLine(cripto.Encrypt(connection, publicKey, null));
        }
    }
}

O primeiro passo é pegar a chave pública através do ConfigurationManager, depois pegar a string de conexão do data base e chamar o método Encrypt passando os dados. Dentro do método Encrypt é criado uma instância de CriptConnectionString.Cript() e é chamado o método Encrypt passando a conexão e a chave pública.

Vamos ver o resultado disso na figura 4.

Figura 4 - Resultado da criptografia

Image

Esse valor impresso na figura 4 é o que você deve usar na sua configuração como connection string e no momento de usar a conexão na sua aplicação, basta usar outro método para decriptografar em memória. Ao retirar a criptografia, basta mandar para o drive e tudo vai funcionar, mas o arquivo de configuração vai continuar criptografado e com uma certa segurança.

Passo 2

Vamos utilizar a decriptografia da string de conexão em tempo de execução. Vamos alterar um pouco a console application para usar os dois métodos, para criptografar e decriptografar. Veja o code 1.3.

Code 1.3 - Arquivo de configuração com duas strings.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <connectionStrings>
    <add name="MyConnection" connectionString="Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;" />
    <add name="MyCriptConnection" connectionString="+xsKDWPqQHIB3wWzJ8fqv2e6YJPEF4FDp4bCY+2T9Q5qOTm5FHbBq1FB9FVmsFxUsL0t86FGbP0eHlaMdT9bgh1e7+pIvagSsN/ELlUMp+1ECw+/c2mJi/RBhOvZOS4j" />
  </connectionStrings>
  <appSettings>
    <add key="publicKey" value="d41d8cd98f00b204e9800998ecf8427e" />
  </appSettings>
</configuration>

O code 1.4 mostra chamando os dois métodos, veja como:

Code 1.4 - Encript e Decript no console

using System;

namespace UsingCriptConnectionString
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            var publicKey = System.Configuration.ConfigurationManager.AppSettings["publicKey"].ToString();
            var decryptConnection = System.Configuration.ConfigurationManager.ConnectionStrings["MyConnection"].ToString();
            var cryptConnection = System.Configuration.ConfigurationManager.ConnectionStrings["MyCriptConnection"].ToString();

            //encrypt
            Encrypt(publicKey, decryptConnection);

            //decrypt
            Decrypt(publicKey, cryptConnection);
        }

        private static void Encrypt(string publicKey, string connection)
        {
            CriptConnectionString.Cripto cripto = new CriptConnectionString.Cripto();
            Console.WriteLine(cripto.Encrypt(connection, publicKey, null));
        }

        private static void Decrypt(string publicKey, string cryptConnection)
        {
            CriptConnectionString.Cripto cripto = new CriptConnectionString.Cripto();
            Console.WriteLine(cripto.Decrypt(cryptConnection, publicKey, null));
        }
    }
}

O code 1.4 faz o encript e o decript da string de conexão e mostra no console, usando a mesma chave pública configurada no arquivo de configuração.

É aconselhável utilizar isso as suas aplicação para manter mais seguro a sua conexão com o banco de dados, só não se esqueça e chamar o método de decript quando for passar os dados para o drive de conexão como o SQL Server.

Figura 5 - Resultado final

Image

Espero que tenha gostado e qualquer dúvida pode entrar em contato pelo meu site https://www.mauriciojunior.org.


Autor: Mauricio Junior
Revista ecode10 Magazine