Translate this page now :



»Programação
»Programação.NET
»Banco de Dados
»Webdesign
»Office
» Certificações Microsoft 4
»Treinamentos4
»Programação 4
»Webdesign«
»Office & User Tips«
»Grupos de Usuários
»Células Acadêmicas«
intcontpiada : 118
Cachorrada na Net
Você já está cadastrado e participa do grupo de usuários de sua cidade ? Se não, comente o porque.
 
 
Faça um pequeno teste com 10 questões de VB
.:.
Teste seus conhecimentos em Visual Basic, SQL Server e ASP 3.0 com nossas provas on-line
.:.
Aprimore seus conhecimentos em programação com nosso treinamento on-line de lógica de programação
.:.
Veja nosso calendário de treinamentos
Gostou da Página?
Então

para um amigo!
 





Por Dennes Torres
dennes@bufaloinfo.com.br
Dennes Torres possui as certificações MCAD, MCSD,MCSE, MCDBA e MCT. Atualmente atua Como diretor da Búfalo Informática, líder do grupo de usuários DevASPNet no Rio de Janeiro e membro da liderança dos grupos getWindows e devSQL, também do Rio de Janeiro, podendo sempre ser encontrado na lista de discussão do grupo DevASPNet (devaspnet-subscribe@yahoogrupos.com.br) bem como nas reuniões do grupo. Mantém dois blogs em http://cidadaocarioca.blogspot.com

Criptografando o web.config no .NET 2.0

Pesquisa personalizada
Pesquisar Dicas:






Os arquivos de configuração do .NET 2 possuem agora a possibilidade de criptografar quase todas as chaves dos arquivos de configuração.

O uso da criptografia funciona de forma totalmente transparente para a aplicação, que continuará lendo ou escrevendo nas chaves sem nem ao menos perceber que as chaves que estão sendo manipuladas encontram-se criptografadas.

Algumas chaves dos arquivos de configuração, porém, não podem ser criptografadas. São elas :

A criptografia pode ser feita com uso da ferramenta de prompt aspnet_regiis. Veja como fica a instrução para criptografar a chave connectionStrings dentro de um web.config :

aspnet_regiis -pef "connectionStrings" "C:\Projects\CestaCompras"

Observe que apontamos diretamente o diretorio em que se encontra o site e, também, o web.config deste site.

Veja o resultado dentro do web.config :

<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>cBaeS9TFrvcmIEOYkzbkZ/pBSFtttBX+CO6/VQyTF6FPBKUG7J2QbfcjvTuPFSzyZMd5hGQSiV2QeT1kgEDSTmHK0wVet3uaDRegUpsM3xk5tkQIq6VtmgMjiR7QFT4GbDHesvpkPzwdq5QPguyYOtxnI5n8B/KaK38WyAtrqac=</CipherValue>
</CipherData>
</EncryptedKey>
</KeyInfo>
<CipherData>
<CipherValue>Bd9mBN03jCF3SmSfx8exYZQmtZMw4au/MLePbq1ZIIwFDbdWFWmdTPd23BAnBHb37tBVq9n0o8e/hHksZ/ttPWETaVn8GamEAP8vrmyS3y8rpVvEKgViWwyeZyF5Id2TuaMTFxEt1mBm7cHZ3XRdG40XbXbyaSTXHNRZs4D0DpKfsC+XFA2Ylb9b4C+zMAd4sRY4U+HRa5oGWLEUDkYRFdyhEzls4LymlLOLHItMe/XNKAWVUUYwwBIA5BBYQuOrjCT6bhBfFWl+kSAWbKWh/bN8Kv61eywWKJhO0wzEs0/jwoKp04yTFAvFvAAJgwOYTrgKx2DSzdxk+ay/7F1J2ZReK5amYS7/1FipDSUcyx4GA5YQaQ4erd+dwYlNTK1ga0GzXEqi11hxPc1y1EVL67VVIVOUNVKHvH8n9AQ6Y6sTJP7W9+/CbDXMt2beoDV4IvnhXqQkU+cjgGDuLhHOw0AEtxjCK5QdmuDs6eae1GQ=</CipherValue>
</CipherData>
</EncryptedData>
</connectionStrings>

O fato deste trecho do web.config estar criptografado não muda em nada a execução da aplicação. A aplicação continua podendo ser executada normalmente, sem notar que parte das informações que utiliza estão criptografadas. O ASP.NET se encarrega de descriptografar a string ao entrega-la para a aplicação.

Vamos a alguns detalhes a mais sobre a criptografia :

Vamos ver então algumas variações na forma de criptografia.

Utilização de uma entropia

Conforme explicado no artigo acima, sobre DPAPI, entropia é uma informação personalizada fornecida pela aplicação e que será utilizada pelo DPAPI na formação da chave de criptografia. A entropia garante que uma outra aplicação, na mesma máquina que a nossa, não conseguirá descriptografar nossos dados, pois as entropias das aplicações serão diferentes.

Para definir uma entropia para nossa aplicação precisaremos redefinir o provider de criptografia e utilizar o novo provider para criptografar os dados.

Precisaremos adicionar a configuração do novo provider no web.config, veja como fica :

<configProtectedData>
<providers>
<add useMachineProtection="true" keyEntropy="CodigoMinhaApp" name="MyUserDataProtectionConfigurationProvider"
type="System.Configuration.DpapiProtectedConfigurationProvider, System.Configuration, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b03f5f7f11d50a3a" />
</providers>
</configProtectedData>

Tendo feito essa configuração no web.config, utilizamos a seguinte instrução para criptografar :

aspnet_regiis -pef "connectionStrings" "C:\Projects\CestaCompras" -prov "MyUserDataProtectionConfigurationProvider"

Desta forma apesar das outras aplicações utilizarem a mesma chave de criptografia que a nossa, a entropia será diferente e portanto não poderão descriptografar os dados gerados por essa aplicação.

Mas a entropia está aberta dentro do web.config, desta forma ela poderia ser capturada. Não temos como criptografar a entropia. O passo seguinte de segurança é fazer com que a aplicação utilize a segurança DPAPI isolada por usuário e não a segurança de máquina.

Proteção de dados por usuário

Assim como fizemos no exemplo anterior, configuraremos um provider personalizado, só que agora iremos alterar o parâmetro useMachineProtection para false.

<configProtectedData>
<providers>
<add useMachineProtection="false" keyEntropy="CodigoMinhaApp" name="MyUserDataProtectionConfigurationProvider"
type="System.Configuration.DpapiProtectedConfigurationProvider, System.Configuration, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b03f5f7f11d50a3a" />
</providers>
</configProtectedData>

A criptografia das configurações é feita de forma identica. O que muda é que a aplicação precisará estar rodando com a mesma identidade de usuário que nós utilizarmos para criptografar. Então é bem possível que tenhamos que definir um usuário utilizando o runAS. A execução do CMD precisa ser no seguinte formato :

Runas /profile /user:domain\user cmd

Depois deveremos garantir que a aplicação esteja utilizando este mesmo usuário durante sua execução.

Criptografia com provedores

Se estivermos utilizando um provedor de hospedagem, nada disso vai funcionar. Simples : Não conseguiremos executar nada disso diretamente no servidor do provedor.

A solução é simples : Criar uma página web temporária para fazer a criptografia. Veja um exemplo de código para isso :

   69 Imports System.Web.Configuration

   70 Partial Class _Default

   71 Inherits System.Web.UI.Page

   72 

   73 Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click

   74 

   75 

   76     Dim config As System.Configuration.Configuration = _

   77       WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath)

   78 

   79 

   80     config.ConnectionStrings.SectionInformation.ProtectSection("DataProtectionConfigurationProvider")

   81 

   82 

   83 

   84     config.Save()

   85 End Sub

   86 End Class

Descriptografia

Para descriptografar os dados, basta alterar o parâmetro utilizado na instrução de prompt :

aspnet_regiis -pdf "connectionStrings" C:\Projects\MachineDPAPI

Já em código basta utilizar o método UnprotectSession

 



Envie seus comentários sobre este artigo

Nome :

E-mail :

Comentários :


Avise-me quando houverem novos comentários nesta página

Veja abaixo os comentários já enviados :

Nome : luiz fernando E-Mail : luizfg56@gmail.com
Dennes,gostei muito deste artigo, me ajudou a fazer um trabalho na faculade, estudo na faculade bennett metodista, onde assisti algumas palestras suas, gostaria que vc me explicasse se não for tomar seu tempo, alguns topicos de segurança da informação

1- o que são algoritmos fortes
2 - o que é uso inseguro de algoritmos fortes
3- o que são informações sensiveis em sistema de armazenamento
4- uso de algoritmos caseiros

obrigado pela atenção
abços
Nome : Wilson E-Mail : braun0527@gmail.com
Olá Dennes,
poderia me sugerir alguma correção quanto ao meu método de criptografia?
Abaixo o meu comando para encriptação com sucesso e o erro ao publicar:
C:\Windows\Microsoft.NET\Framework\v4.0.30319>aspnet_regiis -pef "connectionStri
ngs" "aspnet_regiis -pef "connectionstrings" "C:\Users\Bra\Documents\Visual
Studio 2010\Projects\VIG\VIGI\bin\DEPLOY_2108"
-prov "DataProtectionConfigurationProvider"
Encrypting configuration section...
Succeeded!
Erro ao acessar a página web:
Parser Error Message: Failed to decrypt using provider 'DataProtectionConfigurationProvider'.
Error message from the provider
Source File: d:\web\localuser\vigsaocupa\www\web.config Line: 20
Nome : 1 E-Mail : 1
-1'
Nome : -1' E-Mail : 1
1
Nome : 1 E-Mail : -1'
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
-1'
Nome : -1' E-Mail : 1
1
Nome : 1 E-Mail : -1'
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1