Pergunta

Então, estou tentando armazenar a chave simétrica usando o DPAPI. Tudo está bem e ótimo, mas o que fazer com a entropia? Esta pergunta respondeu aqui Realmente não fornece informações suficientes. Parece uma ladeira escorregadia - eu poderia usar a loja de máquinas para armazenar a entropia, mas então o que impede que alguém faça isso também? Nota: Estou armazenando a chave atual usando o escopo do usuário.

Então, minha pergunta é - qual é a melhor maneira de armazenar a entropia usando DPAPI?

Foi útil?

Solução

Qualquer coisa que você armazena localmente pode ser comprometida. Mas há etapas que você pode tomar para tornar mais difícil. Há um documento sobre Manuseio de senhas que você pode considerar olhar. Você considera sua chave de entropia uma senha específica para o seu aplicativo.

Eu vou me referir à sua entropia como seu Chave, pois é funcionalmente uma chave adicional.

O que você não quer fazer é armazenar sua chave localmente em um formato não criptografado. Em vez disso, você deseja criptografar sua chave ou derivá-la de outra fonte ingiosa. Obviamente, se você criar a chave, você precisará armazenar a chave usada para criptografá -la - mas muitas vezes essa única camada de indireção é suficiente para desencorajar a maioria dos desafiantes.

Essa seria a vantagem de derivar sua chave. Você pode derivá -lo como um hash de outras partes constantes (precisa ser algo que não mude com as revisões do seu aplicativo). Um truque ao derivar um hash é combinar o hash com algum outro valor constante (como um GUID ou um grande número aleatório) para que alguém não possa simplesmente combinar um algoritmo de hash conhecido e obter sua chave. Essa é uma alternativa muito melhor para criar seu próprio algoritmo de hash (o que você nunca deve fazer, a menos que tenha um doutorado em matemática).

Em algum momento, você precisará de algum tipo de codificação dura -chave em seu aplicativo. Essa chave é combinada com alguns outros dados em um hash para criar sua chave de entropia ou usada para descriptografar a chave de entropia. Na verdade, você pode ter a principal alteração com uma nova revisão do seu aplicativo, desde que mantenha a chave antiga para descriptografar a chave existente. Em seguida, você pode criptografar com a nova chave ou método.

Se você deseja a melhor segurança, poderá armazenar a chave de entropia do computador. Isso exigiria uma conexão com a Internet e um certificado SSL, mas eles nunca são persistidos em qualquer lugar localmente para ser descoberto. Para fazer isso, você pode configurar um sistema de resposta de desafio mais robusto, para que a autenticação de solicitação seja diferente a cada vez, e a chave é entregue pela criptografia SSL para que não possa ser interceptada. Uma vez que a chave é usada, ela é descartada. É claro que esse tipo de derrota o objetivo de muitos cenários em que você está usando o DPAPI para armazenamento seguro local.

Faça o que fizer, lembre -se de que será comprometido - isso sempre acontece quando alguém tem acesso total à máquina local e aos dados armazenados nela. A solução para isso é continuar lançando atualizações que alterem o método suficiente para que a crack antiga não funcione mais. Isso tornará a distribuição de uma rachadura menos valiosa, pois será difícil encontrar uma para a versão certa.

Outras dicas

Primeiro, deixe -me abordar a pergunta original da postagem. Tudo se resume ao fato de que a entropia deve ser armazenada sob a autoridade do usuário e/ou a autoridade do aplicativo, se for usado para armazenamento persistido. Suponho que você possa usar uma chave armazenada com o aplicativo para criptografar as informações na loja persistida, mas novamente um aplicativo malicioso seria capaz de acessar essa chave de criptografia. Portanto, não sinto que exista um meio de proteger contra o cenário que você menciona nos comentários. No entanto, dado o que você disse é o uso pretendido da entropia, não sinto que isso ajude a resolver seu problema.

Parece que o problema real está estabelecendo um canal seguro de comunicação entre o aplicativo cliente e o servidor. No seu design, você está trocando chaves que serão usadas para criptografar a comunicação. Eu acho que tentar usar o código personalizado para resolver esse problema levará a vulnerabilidades de segurança adicionais.

Dado tudo isso, sugiro criar um serviço WCF (Windows Communication Foundation) usado para recuperar informações confidenciais. Obviamente, poderia ser usado para recuperar todas as informações, mas a menor quantidade de alteração seria limitar o serviço a informações confidenciais.

Com o WCF, você pode configurar o cliente e o servidor para usar um canal seguro. O WCF tem muitas opções para estabelecer um canal seguro de comunicação com o servidor.

<wsHttpBinding>
    <binding>
        <security mode="Transport">
            <transport clientCredentialType="Windows" />
        </security>
    </binding>
</wsHttpBinding>

Depois de ter um canal seguro, muitos dos outros problemas são mais simples, como acesso aos dados do CC. Se esses dados forem enviados em um canal seguro, ele se tornará um problema de autorização em vez da segurança do canal.

Ver Como: criar uma sessão segura para mais.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top