Build Brasil
Treinamentos FCamara
Criptografando sessões da Web.config

Olá pessoal,

Infelizmente é de conhecimentos de poucos que o arquivo web.config é inacessível.
Quando digo inacessível, quero dizer através da url.

Tente por curiosidade acessar o arquivo web.config de uma aplicação .net.
Vocês irão notar uma mesangem de erro parecida com a imagem abaixo.

01.gif" width="594" border="0" />

Mas algumas vezes esse arquivo pode cair nas mãos erradas.
Imagine se as configurações abaixo cair nas mãos erradas?
Pode ser incalculável o prejuízo.

<appSettings>
    <add key="PathXmlConfig" value="c:\config\"/>
    <add key="ChaveCriptografia" 
value="fgnjkuit7435jksd76435437843hf78902435h"/> </appSettings> <connectionStrings> <add name="ConexaoBanco" connectionString="Data Souce=192.168.0.7; Initial Catalog=Vendas; User ID=sa; Password=sa;"/> </connectionStrings>

Essas são informações que normalmente estão presentes no arquivo.
Para dar mais segurança aos nossos aplicativos, vamos criptografar a sessão “ConnectionStrings”.

.gif" rel="WLPP">02

Para criptografar a sessão vamos usar o comando “aspnet_regiis”.
Para mais detalhes, visite a sessão “Referência” ao final deste artigo.

O comando é bem simples.

aspnet_regiis.exe -pef [Sessão] [Pasta_Web_Config]

03

O comando vai fazer com que a sessão “connectionStrings” fique assim:

<connectionStrings 
configProtectionProvider="RsaProtectedConfigurationProvider"> <EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element" xmlns="http://www.w3.org/2001/04/xmlenc#"> <EncryptionMethod
Algorithm=http://www.w3.org/2001/04/xmlenc#tripledes-cbc /> <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#"> <EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#"> <EncryptionMethod
Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5"/> <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#"> <KeyName>Rsa Key</KeyName> </KeyInfo> <CipherData> <CipherValue>
CtnUf1Oeki4zi9VdhFooOxvU/eZ+…
</CipherValue> </CipherData> </EncryptedKey> </KeyInfo> <CipherData> <CipherValue>
kzh5uaOfXEsrz/U3yp4gAMX1NfOdeqs+mnq0…
</CipherValue> </CipherData> </EncryptedData> </connectionStrings>

Eu minimizei o conteúdo da tag “CipherValue”, por que o conteúdo é muito grande.

Para fazer o caminho de volta, vamos usar o mesmo comando, só que com o parâmetro “pdf”
no lugar de “pef”. O comando ficará assim:

aspnet_regiis.exe -pdf [Sessão] [Pasta_Web_Config]

04

E para demonstrar que esse comando funciona em qualquer sessão, vou usá-lo na sessão appSettings.

05

O resultado será o seguinte:

<appSettings configProtectionProvider="RsaProtectedConfigurationProvider">
    <EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element"
     xmlns="http://www.w3.org/2001/04/xmlenc#">
        <EncryptionMethod 
Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" /> <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#"> <EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#"> <EncryptionMethod
Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5"/> <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#"> <KeyName>Rsa Key</KeyName> </KeyInfo> <CipherData> <CipherValue>X4kpfxvqnVB4ET479PjsBT/Vk58xXL8…
</CipherValue> </CipherData> </EncryptedKey> </KeyInfo> <CipherData> <CipherValue>Fi5Z2wsBL6iaWNOePuK1cIoQocmZKN9AM8Mdba…
</CipherValue> </CipherData> </EncryptedData> </appSettings>

O código abaixo mostra aos céticos que mesmo criptografada a chave pode ser lida normalmente.
Não necessitando que o desenvolvedor descriptografe a sessão appSettings antes de ler.
O visual studio é responsável por fazer isso.

protected void Page_Load(object sender, EventArgs e) {
    Response.Write("Valor da chave <b>PathXmlConfig</b>:&nbsp;");
    Response.Write(ConfigurationManager.AppSettings["PathXmlConfig"]);
    Response.Write("<br />");
    Response.Write("Valor da chave <b>ChaveCriptografia</b>:&nbsp;");
    Response.Write(ConfigurationManager.AppSettings["ChaveCriptografia"]);
}

Podemos notar que o código tem a única e exclusica função de mostrar o conteúdo das chaves,
e não descriptografar. Esse código resulta na tela abaixo.

.gif" rel="WLPP">06

Até a próxima pessoal.

Conclusão

Podemos concluir que podemos criptografar qualquer sessão do web.config
com o comando aspnet_regiis. Mas tome muito cuidado. Use consciente o comando, por que quanto
mais complexa for a criptografia, mais lenta será a leitura das chaves.

Referência

MSDN - Comando aspnet_regiis

 

MSDN - Encrypting and Decrypting Configuration Sections


Posted 1 Jun 2009 21:46 by Marcos Sabino Filho
Copyright© Build Brasil 2004 - 2009 - Todos os Direitos Reservados
Powered by Community Server (Commercial Edition), by Telligent Systems