Mapping di nomi di algoritmi a classi di crittografia

Nota

Questo articolo è specifico per .NET Framework. Non si applica alle implementazioni più recenti di .NET, incluse .NET 6 e versioni successive.

Uno sviluppatore può creare un oggetto di crittografia usando Windows SDK in quattro modi:

  • Creare un oggetto usando l'operatore new.

  • Creare un oggetto che implementa un particolare algoritmo di crittografia chiamando il metodo Create sulla classe astratta per tale algoritmo.

  • Creare un oggetto che implementa un algoritmo di crittografia specifico chiamando il metodo CryptoConfig.CreateFromName.

  • Creare un oggetto che implementa una classe di algoritmi di crittografia (ad esempio una crittografia a blocchi simmetrici) chiamando il metodo Create sulla classe astratta per quel tipo di algoritmo, ad esempio SymmetricAlgorithm.

Si supponga, ad esempio, che uno sviluppatore voglia calcolare l'hash SHA1 di un set di byte. Lo spazio dei nomi System.Security.Cryptography contiene due implementazioni dell'algoritmo SHA1, un'implementazione puramente gestita e una che esegue il wrapping di CryptoAPI. Lo sviluppatore può scegliere di creare un'istanza di una particolare implementazione SHA1, ad esempio il SHA1Managed, chiamando l'operatore new. Se tuttavia la classe viene caricata da Common Language Runtime non è rilevante, purché la classe implementi l'algoritmo hash SHA1, lo sviluppatore può creare un oggetto chiamando il metodo SHA1.Create. Questo metodo chiama System.Security.Cryptography.CryptoConfig.CreateFromName("System.Security.Cryptography.SHA1"), che deve restituire un'implementazione dell'algoritmo hash SHA1.

Lo sviluppatore può anche chiamare System.Security.Cryptography.CryptoConfig.CreateFromName("SHA1") perché, per impostazione predefinita, la configurazione della crittografia include nomi brevi per gli algoritmi forniti in .NET Framework.

Se l'algoritmo hash usato non è rilevante, lo sviluppatore può chiamare il metodo HashAlgorithm.Create, che restituisce un oggetto che implementa una trasformazione hash.

Mapping dei nomi degli algoritmi nei file di configurazione

Per impostazione predefinita, il runtime restituisce un oggetto SHA1CryptoServiceProvider per tutti e quattro gli scenari. Tuttavia, un amministratore del computer può modificare il tipo di oggetto restituito dai metodi negli ultimi due scenari. A tale scopo, è necessario eseguire il mapping di un nome descrittivo dell'algoritmo alla classe da usare nel file di configurazione del computer (Machine.config).

L'esempio seguente mostra come configurare il runtime in modo che System.Security.Cryptography.SHA1.Create, System.Security.CryptoConfig.CreateFromName("SHA1") e System.Security.Cryptography.HashAlgorithm.Create restituiscano un oggetto 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>

È possibile specificare il nome dell'attributo nell'elemento <cryptoClass>. Nell'esempio precedente, all'attributo è stato assegnato il nome MySHA1Hash. Il valore dell'attributo nell'elemento <cryptoClass> è una stringa usata da Common Language Runtime per individuare la classe. È possibile usare qualsiasi stringa che soddisfi i requisiti specificati in Specifica dei nomi di tipo completi.

Molti nomi di algoritmi possono essere mappati alla stessa classe. L'elemento <nameEntry> esegue il mapping di una classe a un nome descrittivo di algoritmo. L'attributo name può essere una stringa usata quando si chiama il metodo System.Security.Cryptography.CryptoConfig.CreateFromName o il nome di una classe di crittografia astratta nello spazio dei nomi System.Security.Cryptography. Il valore dell'attributo class è il nome dell'attributo nell'elemento <cryptoClass>.

Nota

È possibile ottenere un algoritmo SHA1 chiamando SHA1.Create o il metodo Security.CryptoConfig.CreateFromName("SHA1"). Ogni metodo garantisce solo la restituzione di un oggetto che implementa l'algoritmo SHA1. Non è necessario eseguire il mapping di ogni nome descrittivo di un algoritmo alla stessa classe nel file di configurazione.

Per un elenco dei nomi predefiniti e delle classi a cui sono mappati, vedere CryptoConfig.

Vedi anche