Usando DPAPI/ProtectedData em um ambiente de farm da Web com o repositório de usuários

Eu queria saber se alguém tinha usado com sucesso DPAPI com um repositório de usuários em um ambiente de web farm?

Como nosso aplicativo é um aplicativo ASP.NET 1.1 a 2.0 recentemente convertido, estamos usando um wrapper personalizado que chama diretamente os métodos CryptUnprotect . Mas isso deve ser o mesmo que o método ProtectedData </​​code> disponível na estrutura 2.0.

Como estamos operando em um ambiente de farm da web, não podemos garantir que a máquina que fez a criptografia será a única a descriptografá-la. (Também porque falhas de máquina não devem destruir nossos dados criptografados).

Então, o que temos é um componente de manutenção que é executado em um serviço sob uma conta de usuário específica em cada uma de nossas caixas da web. Este usuário é configurado para ter um perfil móvel, conforme a recomendação.

O problema que temos é que a informação criptografada em uma máquina não pode ser descriptografada em outra, isso falha com o erro win32:

'Chave inválida para uso no estado especificado'.

Eu suspeito que isso é porque eu cometi um erro por ter o serviço de criptografia em execução como o usuário em várias máquinas, mantendo assim o usuário logado em mais de uma máquina ao mesmo tempo.

Se esse é o problema, como os outros usam o DPAPI com o repositório de usuários em um ambiente de farm da Web?

3
Oi, você conseguiu a resposta para isso? Eu estou tendo o mesmo problema.
adicionado o autor user6535, fonte

3 Respostas

Em um ambiente de farm da Web, em vez de usar DPAPI para criptografar/descriptografar seus dados diretamente, você deve usá-los para criptografar a chave usada mais tarde para descriptografar seus dados protegidos.

Você "instalaria" a chave em cada servidor como parte do processo de implantação. O script de instalação precisaria ser executado sob a identidade do AppPool e poderia armazenar a chave criptografada em um arquivo app.config ou no registro.

Os dados criptografados em si podem ser armazenados em um repositório/banco de dados central, para que possam ser acessados ​​por todos os servidores no farm. Para descriptografar os dados, o aplicativo da Web recuperaria a chave criptografada de onde estava instalada, usaria DPAPI para descriptografá-la e, em seguida, usaria o resultado para descriptografar dados provenientes do repositório central.

A desvantagem é que a chave de texto não criptografado pode existir no disco local por um curto período de tempo durante o processo de instalação inicial, onde pode estar exposto à equipe de operações. Você pode adicionar uma camada extra de criptografia, como o web.config machineKey, se isso for uma preocupação.

8
adicionado
Isso é lamentável, porque uma das vantagens da DPAPI é que ela expira automaticamente a chave mestra a cada três meses, mas é capaz de descriptografar dados previamente criptografados. msdn.microsoft.com/pt-br/library/ms995355.aspx Citação: "Esta expiração impede que um invasor comprometa uma única MasterKey e acesse todos os dados protegidos de um usuário." Usando sua própria chave, se ela estiver comprometida, todos os seus dados serão expostos.
adicionado o autor ToddK, fonte
Isso é um pouco obsoleto, mas acredito que você ainda será capaz de "ver" a chave, mesmo se contida no web.config e criptografada usando aspnet_regiis . Sua abordagem é o que a maioria das pessoas está procurando, pois não há mecanismo semelhante pronto para uso no ASP.NET ou no BCL.
adicionado o autor CodeMonkeyKing, fonte

Eu só vi isso. Existe uma maneira de fazer isso funcionar, ou seja, certificar-se de que os computadores no farm estejam em um domínio e usar uma conta de domínio para criptografar e descriptografar os dados (por exemplo, executar o aplicativo na conta de domínio).

Você não pode usar o DPAPI da maneira desejada com contas locais porque o material de chave não é trocado entre os servidores.

espero que ajude!

2
adicionado

The Microsoft poster is wrong. http://support.microsoft.com/default.aspx?scid=kb;en-us;309408#6

"Para que o DPAPI funcione corretamente quando ele usa perfis móveis, o usuário do domínio só deve estar conectado a um único computador no domínio. Se o usuário quiser fazer logon em um computador diferente que esteja no domínio, o usuário deverá fazer logoff o primeiro computador antes de o usuário efetuar logon no segundo computador. Se o usuário fizer logon em vários computadores ao mesmo tempo, é provável que a DPAPI não possa descriptografar dados criptografados existentes corretamente. "

Parece que a DPAPI não funcionará em uma configuração de farm. Eu acho que esta é uma supervisão bastante grande por parte da Microsoft e torna a DPAPI quase inútil para a maioria dos aplicativos corporativos.

1
adicionado