Asignar nombres de algoritmo a clases de criptografía

Hay cuatro maneras de que desarrollador pueda crear un objeto de criptografía mediante Windows SDK:

  • Creación de un objeto mediante el operador new.

  • Cree un objeto que implemente un algoritmo de criptografía determinado llamando al método Create en la clase abstracta para ese algoritmo.

  • Cree un objeto que implemente un algoritmo de criptografía determinado mediante una llamada al método CryptoConfig.CreateFromName.

  • Cree un objeto que implemente una clase de algoritmos criptográficos (como un cifrado de bloque simétrico) llamando al método Create en la clase abstracta para ese tipo de algoritmo (como SymmetricAlgorithm).

Por ejemplo, supongamos que un desarrollador quiere calcular el hash SHA1 de un conjunto de bytes. El espacio de nombres System.Security.Cryptography contiene dos implementaciones del algoritmo SHA1, una implementación puramente administrada y otra que encapsula CryptoAPI. El desarrollador puede optar por crear una instancia de una implementación sha1 determinada (como SHA1Managed) llamando al nuevo operador. Sin embargo, si no importa qué clase se carga Common Language Runtime siempre que la clase implemente el algoritmo hash SHA1, el desarrollador puede crear un objeto llamando al método SHA1.Create. Este método llama a System.Security.Cryptography.CryptoConfig.CreateFromName("System.Security.Cryptography.SHA1"), que debe devolver una implementación del algoritmo hash SHA1.

El desarrollador también puede llamar a System.Security.Cryptography.CryptoConfig.CreateFromName("SHA1") porque, de forma predeterminada, la configuración de criptografía incluye nombres cortos para los algoritmos enviados en .NET Framework.

Si no importa qué algoritmo hash se usa, el desarrollador puede llamar al método HashAlgorithm.Create, que devuelve un objeto que implementa una transformación hash.

Asignar nombres de algoritmos en archivos de configuración

De forma predeterminada, el runtime devuelve un objeto SHA1CryptoServiceProvider para los cuatro escenarios. Sin embargo, un administrador de máquinas puede cambiar el tipo de objeto que devuelven los métodos de los dos últimos escenarios. Para ello, debe asignar un nombre de algoritmo descriptivo a la clase que desea usar en el archivo de configuración de la máquina (Machine.config).

En el ejemplo siguiente se muestra cómo configurar el runtime para que System.Security.Cryptography.SHA1.Create, System.Security.CryptoConfig.CreateFromName("SHA1") y System.Security.Cryptography.HashAlgorithm.Create devuelvan un objeto MySHA1HashClass.

<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>  

Puede especificar el nombre del atributo en el <elemento cryptoClass> (el ejemplo anterior denomina al atributo MySHA1Hash). El valor del atributo en el <elemento cryptoClass> es una cadena que Common Language Runtime usa para buscar la clase. Puede usar cualquier cadena que cumpla los requisitos especificados en Especificar nombres de tipo completos.

Muchos nombres de algoritmo pueden asignarse a la misma clase. El <elemento nameEntry> asigna una clase a un nombre de algoritmo descriptivo. El atributo name puede ser una cadena que se usa al llamar al método System.Security.Cryptography.CryptoConfig.CreateFromName o al nombre de una clase de criptografía abstracta en el System.Security.Cryptography espacio de nombres. El valor del atributo class es el nombre del atributo en el <elemento cryptoClass>.

Nota

Puede obtener un algoritmo SHA1 llamando al SHA1.Create o con el método Security.CryptoConfig.CreateFromName("SHA1"). Cada método garantiza que solo devuelve un objeto que implementa el algoritmo SHA1. No es necesario asignar cada nombre descriptivo de un algoritmo a la misma clase del archivo de configuración.

Para obtener una lista de nombres predeterminados y las clases a las que se asignan, vea CryptoConfig.

Consulte también