Compartilhar via


Mapeando nomes de algoritmo para classes de criptografia

Observação

Este artigo é específico para aplicativos .NET Framework. Não se aplica a implementações mais recentes do .NET, incluindo o .NET 6 e versões posteriores.

Há quatro maneiras de um desenvolvedor criar um objeto de criptografia usando o SDK do Windows:

  • Crie um objeto usando o novo operador.

  • Crie um objeto que implemente um algoritmo de criptografia específico chamando o método Create na classe abstrata para esse algoritmo.

  • Crie um objeto que implemente um algoritmo de criptografia específico chamando o CryptoConfig.CreateFromName método.

  • Crie um objeto que implemente uma classe de algoritmos criptográficos (como uma criptografia de bloco simétrico) chamando o método Create na classe abstrata para esse tipo de algoritmo (como SymmetricAlgorithm).

Por exemplo, suponha que um desenvolvedor queira calcular o hash SHA1 de um conjunto de bytes. O System.Security.Cryptography namespace contém duas implementações do algoritmo SHA1, uma implementação puramente gerenciada e outra que encapsula CryptoAPI. O desenvolvedor pode optar por instanciar uma implementação SHA1 específica (como a SHA1Managed) chamando o novo operador. No entanto, se não importa qual classe o common language runtime carrega desde que a classe implemente o algoritmo de hash SHA1, o desenvolvedor poderá criar um objeto chamando o SHA1.Create método. Esse método chama System.Security.Cryptography.CryptoConfig.CreateFromName("System.Security.Cryptography.SHA1"), que deve retornar uma implementação do algoritmo de hash SHA1.

O desenvolvedor também pode chamar System.Security.Cryptography.CryptoConfig.CreateFromName("SHA1") porque, por padrão, a configuração de criptografia inclui nomes curtos para os algoritmos enviados no .NET Framework.

Se não importa qual algoritmo de hash é usado, o desenvolvedor pode chamar o HashAlgorithm.Create método, que retorna um objeto que implementa uma transformação de hash.

Mapeando nomes de algoritmo em arquivos de configuração

Por padrão, o runtime retorna um SHA1CryptoServiceProvider objeto para todos os quatro cenários. No entanto, um administrador de computador pode alterar o tipo de objeto que os métodos nos dois últimos cenários retornam. Para fazer isso, você deve mapear um nome de algoritmo amigável para a classe que deseja usar no arquivo de configuração do computador (Machine.config).

O exemplo a seguir mostra como configurar o runtime para que System.Security.Cryptography.SHA1.Create, System.Security.CryptoConfig.CreateFromName("SHA1") e System.Security.Cryptography.HashAlgorithm.Create retornem um MySHA1HashClass objeto.

<configuration>
   <!-- Other configuration settings. -->
   <mscorlib>
      <cryptographySettings>
         <cryptoNameMapping>
            <cryptoClasses>
               <cryptoClass MySHA1Hash="MySHA1HashClass, MyAssembly
                  Culture='en', PublicKeyToken=a5d015c7d5a0b012,
                  Version=1.0.0.0"/>
            </cryptoClasses>
            <nameEntry name="SHA1" class="MySHA1Hash"/>
            <nameEntry name="System.Security.Cryptography.SHA1"
                       class="MySHA1Hash"/>
            <nameEntry name="System.Security.Cryptography.HashAlgorithm"
                       class="MySHA1Hash"/>
         </cryptoNameMapping>
      </cryptographySettings>
   </mscorlib>
</configuration>

Você pode especificar o nome do atributo no <elemento cryptoClass> (o exemplo anterior nomeia o atributoMySHA1Hash). O valor do atributo no <elemento cryptoClass> é uma cadeia de caracteres que o common language runtime usa para localizar a classe. Você pode usar qualquer cadeia de caracteres que atenda aos requisitos especificados na especificação de nomes de tipo totalmente qualificados.

Muitos nomes de algoritmo podem ser mapeados para a mesma classe. O <elemento nameEntry> mapeia uma classe para um nome de algoritmo amigável. O atributo de nome pode ser uma cadeia de caracteres usada ao chamar o método System.Security.Cryptography.CryptoConfig.CreateFromName ou o nome de uma classe de criptografia abstrata no System.Security.Cryptography namespace. O valor do atributo de classe é o nome do atributo no elemento <cryptoClass>.

Observação

Você pode obter um algoritmo SHA1 chamando o SHA1.Create método Security.CryptoConfig.CreateFromName("SHA1" ). Cada método garante apenas que ele retorna um objeto que implementa o algoritmo SHA1. Você não precisa mapear cada nome amigável de um algoritmo para a mesma classe no arquivo de configuração.

Para obter uma lista de nomes padrão e as classes para as quais eles mapeiam, consulte CryptoConfig.

Confira também