Serviços de criptografia
Redes públicas como a Internet não fornecem um meio de comunicação segura entre entidades. A comunicação por tais redes é suscetível de ser lida ou modificada, por terceiros não autorizados. Criptografia ajuda a proteger os dados sejam visualizados, fornece maneiras para detectar se os dados foram modificados e ajuda a fornecer um meio seguro de comunicação sobre canais de outra forma não seguras. Por exemplo, os dados podem ser criptografados usando um algoritmo criptográfico, transmitidos em um estado criptografado e mais tarde descriptografados pelo parceiro pretendido. Se outra pessoa interceptar os dados criptografados, será difícil decifrar.
No.NET Framework, as classes de System.Security.Cryptography namespace gerenciar muitos detalhes de criptografia para você. Alguns são invólucros para a API de criptografia não gerenciada do Microsoft (CryptoAPI), enquanto outros são puramente gerenciadas implementações. Você não precisa ser um especialista em criptografia para usar essas classes. Quando você cria uma nova instância de classe do algorítmo de criptografia, são geradas chaves automaticamente para facilidade de uso, e as propriedades préviamente estabelecidas são tão seguras quanto possível.
Esta visão geral fornece um resumo dos métodos de criptografia e práticas suportadas pelo.NET Framework, incluindo manifestos, Suite B e suporte de próxima geração (CNG Cryptography) introduzidos no ClickOnce a .NET Framework versão 3.5.
Esta visão geral contém as seções a seguir:
Primitivos criptográficos
Criptografia de chave secreta
Criptografia de chave pública
Assinaturas digitais
Valores de hash
Geração de números aleatórios
Manifestos do ClickOnce
Suporte ao Conjunto B
Classes do criptografia próxima geração (CNG)
Tópicos relacionados
Para obter informações adicionais sobre criptografia e sobre ferramentas que permitem adicionar segurança criptográfica para seus aplicativos, componentes e serviços da Microsoft, consulte o Win32 e COM desenvolvimento, a seção de segurança desta documentação.
Primitivos criptográficos
Em uma situação típica, onde a criptografia é usada, as duas partes (Alice e Bob) se comunicar através de um canal inseguro. Alice e Bob deseja garantir que sua comunicação permaneça incompreensível por qualquer pessoa que pode estar escutando. Além disso, como Alice e Bob está em locais remotos, Alice deve certificar-se de que as informações que ele recebe de Bob não foi modificadas por qualquer pessoa durante a transmissão. Além disso, ela deve certificar-se de que as informações realmente provenientes de Bob e não de alguém que está representando o Bob.
A criptografia é usada para atingir os seguintes objetivos:
Confidencialidade: Para ajudar a proteger os dados ou a identidade de um usuário contra leitura.
Integridade de dados: Para ajudar a proteger os dados sejam alterados.
Autenticação: Para garantir que os dados se origina de uma pessoa específica.
Não-repúdio: Para impedir que uma pessoa específica negar que enviou uma mensagem.
Para atingir esses objetivos, você pode usar uma combinação de algoritmos e práticas, conhecidas como primitivos criptográficos para criar um esquema de criptografia. A tabela a seguir lista os primitivos criptográficos e seus usos.
Criptografia primitivo |
Uso |
---|---|
Criptografia de chave secreta (criptografia simétrica) |
Executa uma transformação nos dados para mantê-lo contra leitura por terceiros. Esse tipo de criptografia usa uma única compartilhada, a chave secreta para criptografar e descriptografar dados. |
Criptografia de chave pública (criptografia assimétrica) |
Executa uma transformação nos dados para mantê-lo contra leitura por terceiros. Este tipo de criptografia usa um par de chaves publica/privada para criptografar e descriptografar os dados. |
A assinatura criptográfica |
Ajuda a verificar a origem dos dados de um terceiro, criando uma assinatura digital exclusiva desse terceiro. Esse processo também usa funções de hash. |
Hashes criptográficos |
Mapeia os dados de qualquer comprimento em uma seqüência de bytes de comprimento fixo. Os hashes são estatisticamente exclusivos; uma seqüência de dois bytes diferente não será de hash para o mesmo valor. |
Voltar ao topo
Criptografia de chave secreta
Algoritmos de criptografia de chave secreta usam uma única chave secreta para criptografar e descriptografar dados. Você deve proteger a chave de acesso por agentes não autorizados, pois qualquer pessoa que tenha a chave pode ser usada para descriptografar os dados ou para criptografar a seus próprios dados, alegando que ela se originou de você.
A criptografia de chave secreta também é conhecida como criptografia simétrica porque a mesma chave é usada para criptografia e descriptografia. Algoritmos de criptografia de chave secreta são muito rápidos (em comparação com algoritmos de chave pública) e são adequados para executar transformações de criptografia em grandes fluxos de dados. Algoritmos de criptografia assimétrica como, por exemplo, RSA são limitados matematicamente na quantidade de dados pode criptografar. Os algoritmos de criptografia simétrica geralmente não têm esses problemas.
Um tipo de chamada de uma codificação de bloco do algoritmo de chave secreta é usado para criptografar um bloco de dados ao mesmo tempo. Bloco ciphers como o Data Encryption Standard (DES), TripleDES, e criptografia (AES) criptograficamente transformar um bloco de entrada de n bytes em um bloco de saída de bytes criptografados. Se você desejar criptografar ou descriptografar uma seqüência de bytes, você precisará fazer isso bloco por bloco. Porque n é pequeno (8 bytes para o DES e o TripleDES; 16 bytes [padrão], 24 bytes ou 32 bytes para AES), os valores de dados maiores que n precisa ser criptografado de um bloco de cada vez. Os valores de dados menores que n precisa ser expandido para n para ser processado.
Uma forma simple de codificação de bloco é chamada de modo de codebook eletrônico (ECB). Modo ECB não é considerado seguro, porque ele não usa um vetor de inicialização para inicializar o primeiro bloco de texto sem formatação. Para uma determinada chave secreta k, uma codificação de bloco simples que não usa um vetor de inicialização criptografará o mesmo bloco de entrada de texto sem formatação no mesmo bloco de saída de texto codificado. Portanto, se você tiver blocos duplicados no seu fluxo de entrada de texto sem formatação, você terá de blocos duplicados no seu fluxo de texto cifrado de saída. Esses blocos de saída duplicado alertas usuários não autorizados para a criptografia fraca usado os algoritmos que já foram empregados e os modos possíveis de ataque. O modo de codificação ECB, por fim, descoberta de teclas e, portanto, está bastante vulnerável para análise.
As classes de codificação de bloco são fornecidas na biblioteca de classes base usam um padrão de encadeamento de modo chamado cipher block encadeamento (CBC), embora você possa alterar esse padrão se desejar.
Codificações de CBC superam os problemas associados a ECB codificações usando um vetor de inicialização (IV) para criptografar o primeiro bloco de texto sem formatação. Cada bloco subseqüente de texto sem formatação é submetido a um OR exclusivo (XOR) operação com o bloco de texto cifrado anterior antes que ele está criptografado. Cada bloco de texto cifrado depende, portanto, todos os blocos anteriores. Quando este sistema é cabeçalhos de mensagens de usado, é comum que podem ser conhecidos por um usuário não autorizado não pode ser usado para fazer engenharia reversa de uma chave.
Uma maneira de se comprometer dados criptografados com uma cifra CBC é realizar uma pesquisa completa de todas as chaves possíveis. Dependendo do tamanho da chave que é usado para realizar a criptografia, esse tipo de pesquisa é muito demorado, usando o mesmo para os computadores mais rápidos e, portanto, é inviável. Chaves maiores são mais difíceis de decifrar. Embora a criptografia não impossibilitar, teoricamente, um adversário recuperar dados criptografados, ela aumentar o custo de fazer isso. Se a demora de três meses para realizar uma pesquisa exaustiva para recuperar dados que seja significativos apenas para alguns dias, o método de pesquisa exaustiva é impraticável.
A desvantagem de criptografia de chave secreta é que ela presume duas partes concordaram com uma chave e IV e comunicadas seus valores. O IV não é considerado um segredo e pode ser transmitido em texto sem formatação com a mensagem. No entanto, a chave deve ser mantida em segredo de usuários não autorizados. Devido a esses problemas de criptografia de chave secreta é freqüentemente usada em conjunto com a criptografia de chave pública em particular, comunicar-se os valores da chave e IV.
Supondo que Alice e Bob está duas partes que desejam se comunicar através de um canal inseguro, eles podem usar a criptografia de chave secreta da seguinte maneira: Alice e Bob concorda usar um algoritmo específico (AES, por exemplo) com uma chave particular e IV. Alice compõe uma mensagem e cria um fluxo de rede (talvez um nomeado pipe ou rede email) na qual deseja enviar a mensagem. Em seguida, ela criptografa o texto usando a chave e IV e envia a mensagem criptografada e IV para Roberto através da intranet. Bob recebe o texto criptografado e descriptografa usando o IV e acordado anteriormente a chave. Se a transmissão é interceptada, o interceptador não pode recuperar a mensagem original, porque ele não sabe a chave. Nesse cenário, somente a chave deve permanecer secreta. Em um cenário do mundo real, Alice ou Bob gera uma chave secreta e usa a criptografia de chave pública (assimétrica) para transferir a chave secreta de (simétrica) para a outra. Para obter mais informações sobre a criptografia de chave pública, consulte a próxima seção.
O .NET Framework fornece as seguintes classes que implementam algoritmos de criptografia de chave secreta:
AesManaged(introduzido no .NET Framework versão 3.5).
HMACSHA1(Isso é tecnicamente um algoritmo de chave secreta porque representa o código de autenticação de mensagem que é calculado usando uma função de hash criptográfico, combinada com uma chave secreta. Consulte Os valores de Hash, posteriormente neste tópico.)
Voltar ao topo
Criptografia de chave pública
Criptografia de chave pública usa uma chave privada que deve ser mantida em segredo de usuários não autorizados e uma chave pública que pode se tornar pública a qualquer pessoa. A chave pública e a chave privada são matematicamente vinculadas. os dados criptografados com a chave pública podem ser descriptografados somente com a chave particular e os dados que estão assinados com a chave particular podem ser verificados apenas com a chave pública. A chave pública pode ser disponibilizada para qualquer pessoa; ele é usado para criptografar os dados sejam enviados para extinção do responsável da chave particular. Os algoritmos de criptografia de chave pública também são conhecidos como algoritmos assimétricos porque uma chave é necessária para criptografar dados, e outra chave é necessária para descriptografar dados. Uma regra básica de criptografia proíbe a reutilização da chave, e ambas as chaves devem ser exclusivas para cada sessão de comunicação. No entanto, na prática, as chaves assimétricas são geralmente vida longa.
Duas partes (Alice e Bob) podem usar criptografia de chave pública da seguinte maneira: Primeiro, Alice gera um par de chaves pública/particular. Se Bob queira enviar uma mensagem criptografada de Alice, ele pede sua chave pública. Alice envia Bob sua chave pública em uma rede não segura e Bob usa essa chave para criptografar uma mensagem. Bob envia a mensagem criptografada para Alice e ela descriptografa usando sua chave particular. Se Bob recebido a chave de Alice através de um canal inseguro, como, por exemplo, uma rede pública, Bob é aberto a um ataque man-in-the-middle. Portanto, Bob deve verificar com Alice que ele tem uma cópia correta de sua chave pública.
Durante a transmissão de chave pública de Alice, um agente não autorizado pode interceptar a chave. Além disso, o mesmo agente pode interceptar a mensagem criptografada de Bob. No entanto, o agente não pode descriptografar a mensagem com a chave pública. A mensagem pode ser descriptografada somente com a chave particular de Alice, que não foi transmitida. Alice não usa sua chave particular para criptografar uma mensagem de resposta para Bob, porque qualquer pessoa com a chave pública pode descriptografar a mensagem. Se Ana Maria enviar uma mensagem para Roberto, ela pede a sua chave pública de Bob e criptografa sua mensagem usando a chave pública. Bob descriptografa a mensagem usando sua chave particular associada.
Nesse cenário, Alice e Bob usa criptografia de chave pública (assimétrica) para transferir uma chave secreta de (simétrica) e usar a criptografia de chave secreta para o restante da sua sessão.
A lista a seguir oferece uma comparação entre os algoritmos de criptografia de chave pública e a chave secreta:
Os algoritmos de criptografia de chave pública usam um tamanho de buffer fixo, enquanto os algoritmos de criptografia de chave secreta usam um buffer de comprimento variável.
Algoritmos de chave pública não podem ser usado para dados de cadeia juntos em fluxos da mesma forma algoritmos de chave secreta, porque apenas pequenas quantidades de dados podem ser criptografadas. Portanto, operações assimétricas não usam o mesmo modelo de fluxo como operações simétricas.
Criptografia de chave pública tem um keyspace muito maior (intervalo de valores possíveis para a chave) que a criptografia de chave secreta. Portanto, a criptografia de chave pública é menos suscetível a ataques de exaustivas que tenta todas as chaves possíveis.
As chaves públicas são fáceis de distribuir porque não terão que ser protegida, desde que existe de alguma forma para verificar a identidade do remetente.
Alguns algoritmos de chave pública (como, por exemplo, RSA e DSA, mas não de Diffie-Hellman) podem ser usados para criar assinaturas digitais para verificar a identidade do remetente de dados.
Algoritmos de chave pública são muito lentos em comparação com algoritmos de chave secreta e não são projetados para criptografar grandes quantidades de dados. Os algoritmos de chave pública são úteis apenas para transferir pequenas quantidades de dados. Normalmente, a criptografia de chave pública é usada para criptografar uma chave e IV a ser usado por um algoritmo de chave secreta. Após a chave e IV são transferidas, a criptografia de chave secreta é usada para o restante da sessão.
O .NET Framework fornece as seguintes classes que implementam algoritmos de criptografia de chave pública:
ECDiffieHellman(classe base)
ECDiffieHellmanCngPublicKey(classe base)
ECDiffieHellmanKeyDerivationFunction(classe base)
RSA permite que a criptografia e assinatura, mas DSA pode ser usado apenas para assinar e Diffie-Hellman pode ser usado somente para a geração de chave. Em geral, os algoritmos de chave pública são mais limitados em seus usos que algoritmos de chave particular.
Voltar ao topo
Assinaturas digitais
Algoritmos de chave pública também podem ser usados para formar as assinaturas digitais. Assinaturas digitais para autenticar a identidade do remetente (se você confia que a chave pública do remetente) e ajudar a proteger a integridade dos dados. Usando uma chave pública gerada pela Alice, o destinatário dos dados de Alice pode verificar que Alice enviou comparando a assinatura digital para dados de Alice e a chave pública de Alice.
Para usar a criptografia de chave pública para assinar digitalmente uma mensagem, Alice primeiro aplica um algoritmo de hash na mensagem para criar um digest de mensagem. O message digest é uma representação exclusiva e compacta dos dados. Alice criptografa a síntese da mensagem com sua chave particular para criar sua assinatura pessoal. Ao receber a mensagem e a assinatura, Bob descriptografa a assinatura usando a chave pública de Alice para recuperar o message digest e hashes a mensagem usando o mesmo algoritmo de hash usada de Alice. Se o message digest que Bob computa exatamente igual a síntese da mensagem recebida de Alice, Bob é garantido se a mensagem é proveniente de ao detentor da chave particular e que os dados não foram modificados. Se Bob confia que Alice é ao detentor da chave particular, ele sabe que a mensagem veio de Alice.
Observação
Uma assinatura pode ser verificada por qualquer pessoa, porque a chave pública do remetente é conhecimento comum e geralmente é incluído no formato de assinatura digital.Este método não mantém o sigilo de mensagem; para a mensagem ser secreta, ele também deve ser criptografado.
O .NET Framework fornece as seguintes classes que implementam algoritmos de assinatura digital:
ECDsa(classe base)
Voltar ao topo
Valores de hash
Algoritmos de hash mapeiam os valores binários de um comprimento arbitrário para menores valores binários de comprimento fixo, conhecido como valores de hash. Um valor de hash é uma representação numérica de uma folha de dados. Se o hash de um parágrafo de texto sem formatação e alterar mesmo uma letra do parágrafo, um hash subseqüente produzirá um valor diferente. Se o hash criptograficamente forte, seu valor será alterado significativamente. Por exemplo, se um único bit de uma mensagem for alterado, uma função de hash forte pode produzir uma saída diferente em 50%. Muitos valores de entrada podem hash para o mesmo valor de saída. No entanto, é impraticável para localizar duas entradas distintas que hash para o mesmo valor.
Duas partes (Alice e Bob) poderiam usar uma função de hash para garantir a integridade da mensagem. Eles selecionaria um algoritmo de hash para assinar as suas mensagens. Alice gravar uma mensagem e, em seguida, criar um hash da mensagem usando o algoritmo selecionado. Eles seriam execute um dos seguintes métodos:
Alice envia a mensagem de texto sem formatação e a mensagem de hash (assinatura digital) para Roberto. Bob recebe a mensagem de hashes e compara seu valor de hash para o valor de hash que recebeu de Alice. Se os valores de hash forem idênticos, a mensagem não foi alterada. Se os valores não forem idênticos, a mensagem foi alterada depois de Alice escreveu.
Infelizmente, esse método não estabelece a autenticidade do remetente. Qualquer pessoa pode representar Alice e enviar uma mensagem para Roberto. Eles podem usar o mesmo algoritmo de hash para assinar a mensagem e tudo o que pode determinar o Bob é a mensagem corresponde a sua assinatura. Esta é uma forma de um ataque man-in-the-middle. Consulte Exemplo da comunicação segura, criptografia Próximo Generation (CNG) para obter mais informações.
Alice envia a mensagem de texto sem formatação para Bob através de um canal público seguro. Ele envia a mensagem de hash para Roberto por um canal seguro de particular. Bob recebe a mensagem de texto sem formatação, hashes-lo e compara o hash, o hash trocadas em particular. Se houver correspondência, Bob sabe duas coisas:
A mensagem não foi alterada.
O remetente da mensagem (Alice) é autêntico.
Para esse sistema funcionar, Alice deve ocultar seu valor original do hash de todas as partes, exceto de Bob.
Alice envia a mensagem de texto sem formatação para Bob através de um canal público seguro e coloca a mensagem com hash em seu site podem ser exibido publicamente.
Esse método impede que a mensagem de violação, impedindo que qualquer pessoa modificando o valor de hash. Embora a mensagem e seu hash podem ser lido por qualquer pessoa, o valor de hash pode ser alterado somente pela Alice. Um invasor que deseja representar Alice exigiria o acesso ao site de Alice.
Nenhum dos métodos anteriores irá impedir que alguém ler mensagens de Alice, porque elas são transmitidas em texto sem formatação. Normalmente, a segurança total requer criptografia e assinaturas digitais (assinatura de mensagens).
O .NET Framework fornece as seguintes classes que implementam algoritmos de hash:
Variantes do HMAC de todos os algoritmos Secure Hash Algorithm (SHA), Message Digest 5 (MD5) e RIPEMD-160.
Implementações de CryptoServiceProvider (invólucros de código gerenciado) de todos os algoritmos SHA.
Implementações de próxima geração (CNG) de criptografia de todos os algoritmos MD5 e SHA.
Observação
Falhas de design de MD5 foram descobertas em 1996 e SHA-1 foi recomendado em vez disso.Em 2004, as falhas adicionais foram descobertas e o algoritmo MD5 não é mais considerado seguro.O algoritmo SHA-1 também foi encontrado para ser seguro e SHA-2 em vez disso, agora é recomendado.
Voltar ao topo
Geração de números aleatórios
Geração de números aleatórios é parte integrante de muitas operações criptográficas. Por exemplo, chaves de criptografia necessário para que seja possível aleatório que é inviável para reproduzi-los. Criptografia geradores de números aleatórios devem gerar a saída é impraticável para prever com uma probabilidade de que é melhor do que a metade. Portanto, qualquer método de prever o próximo bit de saída não deve executar melhor do que a adivinhação aleatório. As classes de .NET Framework usar geradores de números aleatórios para gerar chaves criptográficas.
O RNGCryptoServiceProvider classe é uma implementação de um aleatório algoritmo de gerador número.
Voltar ao topo
Manifestos do ClickOnce
No .NET Framework 3.5, as seguintes classes de criptografia permitem que você obtenha e verificar as informações sobre assinaturas de manifesto para aplicativos que são implantados usando a tecnologia de ClickOnce:
A classe ManifestSignatureInformation obtém informações sobre uma assinatura de manifesto quando você suas sobrecargas de método VerifySignature.
Você pode usar a enumeração ManifestKinds para especificar quais manifestos verificar. O resultado da verificação é um dos valores de enumeração SignatureVerificationResult.
O ManifestSignatureInformationCollection classe fornece uma coleção somente leitura de ManifestSignatureInformation objetos do assinaturas verificados.
Além disso, as classes a seguir fornecem informações específicas de assinatura:
StrongNameSignatureInformationmantém as informações de assinatura de nome forte para um manifesto.
AuthenticodeSignatureInformationrepresenta as informações de assinatura Authenticode para um manifesto.
TimestampInformationcontém informações sobre o carimbo de hora em uma assinatura Authenticode.
TrustStatusFornece uma maneira simples de verificar se uma assinatura Authenticode é confiável.
Voltar ao topo
Suporte ao Conjunto B
O .NET Framework 3.5 oferece suporte ao conjunto de algoritmos criptográficos do Conjunto B publicado pela National Security Agency (NSA). Para obter mais informações sobre o Suite B, consulte o NSA Suite B criptografia Fact Sheet.
Os seguintes algoritmos estão incluídos:
Avançado algoritmo de criptografia AES (padrão) com tamanhos de chave de 128, 192 e 256 bits para criptografia.
Proteja os algoritmos de Hash SHA-1, SHA-256, SHA-384 e SHA-512 para hash. (Os três últimos são geralmente agrupados e chamados de SHA-2).
Elíptica curva algoritmo ECDSA (Assinatura Digital), usando curvas de 256 bits e 384 bits 521 bits moduli prime para entrar. A documentação da NSA especificamente define essas curvas e chama P-256, P-384 e P-521. Esse algoritmo é fornecido pela classe ECDsaCng. Ele permite que você entrar com uma chave particular e verificar a assinatura com uma chave pública.
Algoritmo de Diffie-Hellman (dos EUA) da curva elíptica, usando curvas de 256 bits e 384 bits 521 bits moduli prime para a troca de chaves e um acordo secreto. Esse algoritmo é fornecido pela classe ECDiffieHellmanCng.
Invólucros de código gerenciado para o Federal Information Processing Standard (FIPS) certified implementações das implementações AES, SHA-256, SHA-384 e SHA-512 estão disponíveis no novo AesCryptoServiceProvider, SHA256CryptoServiceProvider, SHA384CryptoServiceProvider, e SHA512CryptoServiceProvider classes.
Voltar ao topo
Classes do criptografia próxima geração (CNG)
As classes de criptografia próxima geração (CNG) fornecem um invólucro gerenciado as funções nativas da CNG. (A CNG é o substituto do CryptoAPI). Essas classes têm "cng" como parte de seus nomes. É fundamental para as classes de invólucro CNG a CngKey classe de contêiner de chave, que abstrai o armazenamento e o uso de chaves da CNG. Essa classe permite que você armazene um par de chaves ou um público com segurança de chave e consultá-lo usando um nome de cadeia de caracteres simples. O elíptica baseado em curva ECDsaCng a classe de assinatura e a ECDiffieHellmanCng pode usar a classe de criptografia CngKey objetos.
A classe CngKey é usada para uma variedade de operações adicionais, incluindo abrir, criar, excluir e exportar chaves. Ele também fornece acesso para o identificador de chave subjacente para usar ao chamar funções nativas diretamente.
O .NET Framework 3.5 também inclui uma variedade de suporte às classes CNG, como o seguinte:
CngProvidermantém um provedor de armazenamento de chave.
CngAlgorithmmantém um algoritmo CNG.
CngPropertymantém as propriedades de chave usadas com freqüência.
Voltar ao topo
Tópicos relacionados
Título |
Descrição |
---|---|
Descreve como a criptografia é implementada na biblioteca de classe base. |
|
Descreve como executar tarefas específicas de criptografia usando a biblioteca de classe base. |
|
Demonstra Passo a passo: Criando um aplicativo de criptografia |
Demonstra as tarefas básicas de criptografia e descriptografia. |
Descreve como mapear nomes de algoritmo para criptografia classes e mapeie os identificadores de objeto para um algoritmo criptográfico. |
Voltar ao topo