| Por Gilberto Uchôa gilbertouchoa@yahoo.com.br Gilberto Uchôa trabalha na Hepta Informática desde 1993, sempre na área de desenvolvimento, atuando em projetos como gerente de projeto e arquiteto de soluções, e atuando nas áreas de consultoria e treinamento, ministrando os cursos oficiais das várias plataformas de desenvolvimento da Microsoft. |
|
|
|
|
| Protegendo Seus Segredos | |
|
|
|
DPAPI ? Data Protection API. É uma API disponibilizada pela Microsoft a partir do Windows 2000 para solucionar o problema da ?ponta do fio solta? no uso de criptografia pelas aplicações. Mas o que é ?a ponta do fio solta? em criptografia? Vamos dar uma revisada nos conceitos básicos de criptografia, para depois ver o que é este problema, e como DPAPI o soluciona.
A criptografia é uma técnica na qual uma informação é transformada de ? e para ? uma representação aparentemente sem sentido, com o objetivo de protegê-la de acesso não autorizado. As transformações são feitas mediante o fornecimento de chaves.

Fig.1. O esquema geral das transformações de criptografia.
O ?par? de transformações (transformação 1 e transformação 2 na Figura 1) é comumente chamado de algoritmo de criptografia. Os algoritmos de criptografia podem ser divididos em 2 grandes tipos: algoritmos de criptografia simétrica e assimétrica.
Algoritmos de criptografia assimétrica funcionam como o esquema da Figura 1. A característica principal deste tipo de algorítmo é que a chave que criptografa (a chave ?1? da figura) é diferente da chave que descriptografa (a chave ?2?). Além disto, estas chaves são geradas e funcionam em pares: o que uma chave criptografa, somente a chave correspondente consegue descriptografar. Os algorítimos de criptografia assimétrica são mais seguros, mas são muito mais lentos do que os de criptografia simétrica.
Algoritmos de criptografia simétrica são aqueles nos quais a chave de criptografia e a chave de descriptografia são a mesma, ou seja, a mesma chave é usada tanto para criptografar quanto para descriptografar os dados.

Fig.2. Na criptografia
simétrica só uma chave é usada.
Você não vai ?inventar? o seu algorítmo de criptografia, pois tal implementação exige profundos conhecimentos matemáticos para que se produza algo que realmente ofereça um nível aceitável de segurança. E além disto, exitem várias implementações de algoritmos de comprovada eficiencia em várias linguagens atuais, tais como as classes do namespace System.Security.Cryptography na biblioteca de classes do .NET Framework. Estas mesmas classes fornecem serviços para a geração de chaves para uso nos algorítimos de criptografia, que nada mais são do que array de bytes ?criptograficamente fortes?, ou seja, que tornam mais difícil descriptografar a informação se um eventual atacante não está de posse das chaves.
Apesar de a biblioteca de classes do .NET Framework tornar extremamente simples produzir um código que criptografa e descriptografa uma informação, resta ainda a questão conhecida em criptografia como key management ? o gerenciamento das chaves, ou como proteger as chaves de criptografia usadas no processo de proteção dos dados.
O ?problema da ponta do fio solta? é que o seu programa necessita ter acesso às chaves usadas para criptografar e descriptografar os dados. Estas chaves então tem que ser armazenadas em algum lugar: em arquivos, no registry, em um banco de dados. E ?alguém? sempre tem acesso a estes locais. Então devemos proteger a chave de acessos não autorizados. Obviamente eu não posso criptografar estas chaves, pois isto só transferiria o problema, sem solucioná-lo. Então o meu problema é:
A criptografia torna os dados seguros; mas quem protege a chave de criptografia?
Isto também pode ser reescrito da seguinte forma:
Uma
informação criptografada estará tão protegida quanto suas
chaves.
Para solucionar este problema, a Microsoft disponibilizou a API Data Protection. Ela contém somente dias funções: Encrypt() e Decript(), que obviamente servem para criptografar e descriptografar dados. A diferença no uso da criptografia com DPAPI é que não é necessário fornecer chaves para as operações de criptografia: o próprio sistema operacional se encarrega de gerar, proteger e gerenciar estas chaves.
O que DPAPI faz é gerar uma ?chave-mestra? (master key, de acordo com a terminologia da Microsoft), que é criptografada com uma chave gerada a partir da senha do usuário logado, e armazenada no diretório de perfil do usuário (C:\Documents and Settings\<nome do usuário>\...).

Fig.3. Geração da chave
mestra.
1. A senha do usuário é recuperada, e a partir ela é gerada uma chave de criptografia. Também é gerada a master key.
2. A master key é criptografada com a chave gerada a partir da senha do usuário, e armazenada no diretório de perfil do usuário (C:\Documents and Settings\<Nome do Usuário>\...)
Quando uma aplicação solicita a criptografação de dados, DPAPI gera uma ?chave de sessão? (session key) a partir da chave-mestra e de dados randômicos. Os dados são então criptografados com a chave de sessão, e o conjunto {dados criptografados, dados randômicos} é retornado para a aplicação como resultado da criptografia.

Fig.4. Como DPAPI criptografa dados.
1. A aplicação solicita o serviço de criptografia de dados de DPAPI, fornecendo os dados a criptografar e uma entropia, que é uma informação (sendo bem claro, um array de bytes qualquer) específica desta aplicação, que evita que outras aplicações rodando sob o mesmo usuário consigam descriptografar os dados. É responsabilidade da aplicação bloquear o acesso à informação de entropia por outras aplicações.
2. DPAPI descriptografa a master key, lida do diretório de perfil do usuário, que está criptografada com a senha do usuário.
3. Juntando a master key, a entropia, e dados randômicos, DPAPI gera uma chave de sessão, que será usada para criptografar os dados.
4. Os dados são então criptografados com a chave de sessão, e ao resultado desta criptografia são acrescentados os dado randômicos usados para gerar a chave de sessão.
5. O conjunto {dados criptografados, dados randômicos} é retornado para a aplicação como o resultado da operação de criptografia.
Quando a aplicação vai descriptografar os dados, fornece o conjunto {dados criptografados, dados randômicos}, e DPAPI regera a chave de sessão e descriptografa os dados.

Figura 5. Como DPAPI
descriptografa dados.
1. Uma informação previamente criptografada com DPAPI é fornecida ao método Decript(), juntamente com a entropia correspondente. Lembre-se que esta informação é na verdade o conjunto {dados criptografados, dados randômicos}, e os dados randômicos aí presentes e a entropia fornecida foram usados na geração da chave usada para criptografar os dados (a chave de sessão vista anteriormente).
2. A master key é lida do seu repositório no diretório de perfil do usuário, e descriptografada com a chave gerada a partir da senha do usuário.
3. DPAPI usa a master key, a entropia e os dados randômicos presentes na informação criptografada para regerar a mesma chave de sessão que foi usada para criptografar os dados.
4. De posse desta chave, DPAPI descriptografa os dados e os retorna para a aplicação.
Veja que em momento nenhum o programador tem que se preocupar com as chaves de criptografia e descriptografia; a própria DPAPI se encarrega disto.
DPAPI não é recomendada para a criptografia de grandes quantidades de informação, pois as suas operações, tanto a de criptografia quanto a de descriptografia, envolvem um processamento relativamente pesado: a geração da chave de criptografia da master key a partir da senha do usuário, a descriptografação da master key, a geração da chave de sessão e a operação de criptografia ou descriptografia dos dados.
Sendo assim, devemos usar um mecanismo ?normal? de criptografia para proteger informações tais como senhas que são gravadas em bancos de dados. DPAPI se aplica na proteção das chaves de criptografia usadas para proteger seus dados, ou outras informações que dão acesso a algum recurso:
§ Criptografar a chave de criptografia simétrica usada para proteger as senhas de seus usuários gravadas no BD;
§ Criptografar a string de conexão ao servidor de banco de dados;
§ Criptografar a chave de criptografia assimétrica privada do seu site, que é usada na leitura de informações sensíveis que os seus usuários enviaram para o site.
§ ?.
Finalmente, alguns detalhes que valem a pena ser destacados no uso de DPAPI:
§ DPAPI baseia a proteção da chave de criptografia na senha do usuário. Então, se você criptografou uma informação com DPAPI, qualquer aplicação rodando com a identidade do seu usuário pode descriptografar esta informação. A entropia secundária mostradas nas figuras 4 e 5 servem para evitar isto: uma aplicação fornece um valor específico para esta entropia, assim evitando que outras aplicações rodando sob o mesmo usuário possam descriptografar a informação. Só tem um problema: veja que agora a sua aplicação deve proteger a entropia de acessos não autorizados? lembra a velha pergunta do ovo e da galinha.
§ DPAPI tem um ?modo? especial de funcionamento (vamos chamá-lo de CRYPTPROTECT_LOCAL_ MACHINE, que é o nome da flag que ativa esta opção), que associa as operações de criptografia não com o usuário, mas com a máquina na qual a operação de criptografia foi feita. Neste caso, a descriptografia da informação é ainda menos restritiva: qualquer aplicação rodando na máquina pode descriptografar uma informação que foi criptografada com DPAPI nesta máquina, independente do usuário logado no momento. Isto parece ser um tanto vulnerável, mas pense em um site ASP.NET que quer usar DPAPI. Primeiro, ninguém conseguirá colocar um programa para rodar no servidor e depois fazer com que este programa envie informação para o atacante (se conseguirem, você tem problemas mais sérios com que se preocupar que suas informações criptografadas). E segundo, um site ASP.NET não tem um perfil de usuário carregado quando da sua execução, mesmo se você fizer impersonate, e setar uma identidade para o pool de aplicações no IIS 6, e etc. Usando o modo CRYPTPROTECT_LOCAL_MACHINE, DPAPI consegue ser usada por um site ASP.NET sem problemas.
§ No modo de funcionamento CRYPTPROTECT_LOCAL_MACHINE descrito no item anterior, deve ser lembrado que a informação criptografada em uma máquina não faz sentido em outra máquina. Isto deve ser lembrado caso você tenha um site ASP.NET que use DPAPI no modo CRYPTPROTECT_ LOCAL_MACHINE, e que vá funcionar em uma web farm, ou em um cluster. Neste caso, a informação deve ser criptografada em cada uma das máquinas para que a descriptografação possa ser realizada.
No próximo artigo desta série iremos ver um exemplo de uso de DPAPI para proteger uma string de conexão com o banco de dados que é usada por um site ASP.NET.
Windows Data
Protection
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnsecure/html/windataprotection-dpapi.asp
Mostra
o funcionamento de DPAPI com detalhes.
RSA CryptoFAQ
http://www.rsasecurity.com/rsalabs/node.asp?id=2152
Excelente
FAQ sobre criptografia da RSA Security, com conceitos sendo explicados para
mortais ?comuns? (você não tem que ter mestrado em Álgebra Avançada ? na maioria
dos momentos).