CryptoConfig

Il primo posto dove le classi di criptografia "guardano" per "nomi" semplici o rilevare i nomi di mappatura è proprio la classe CryptoConfig. Questa classe espone tre metodi statici, ma quella che c'interessa a noi in questo momento è l'overload del metodo CreateFromName(). Questo metodo prende un nome semplice e crea una istanza della classe che è mappata a questo nome.

La mappatura funziona unicamente se l'oggetto che sta chiamando il metodo Create() è costruito sulla base dell'algoritmo che vogliamo. Per esempio, se vogliamo eseguire il seguente codice.

HashAlgorithm hash = SHA384.Create("SHA384");

Visto che la classe SHA384 è la base di SHA384Managed, la chiamata al metodo Call() verrà avviata con successo. Se invece proviamo a fare questo

HashAlgorithm hash = SHA1.Create("SHA384");

riceveremo una InvalidCastException. Questo accade perchè, SHA1 non è la classe base di SHA384Managed.

machine.config

E' possibile eseguire override delle mappature di default specificando elementi XML nel machine-wide configuration file, meglio conosciuto come machine.config. Questo è un file XML che contiene molte configurazioni relative al CLR, ma in questo caso siamo interessanti nel come è possibile eseguire ovveride di alcuni parametri se necessario.

Apriamo quindi il file machine.config e navighiamo fino all'elemento root <configuration>. Una volta trovato è possibile aggiungere questi elementi.

 <?xml version="1.0" encoding="UTF-8" ?>
 <configuration>
    <mscorlib>
       <cryptographySettings>
          <cryptoNameMapping>
             <cryptoClasses>
             <
/cryptoClasses>
          <
/cryptoNameMapping>
       <
/cryptographySettings>
10     <
/mscorlib>
11     
<!-- Altri elementi di configurazione vanno qui -->
12  
</configuration>

L'elemento <cryptoClasses> può contenere tutti gli elementi <cryptoClass> che abbiamo bisono di mappare. Una volta che abbiamo finito di definire questo elementi, possiamo referenziarli nell'elemento <nameEntry>, di fatto, possono, fare override alla "Class name mappings" specificata in CryptoConfig, o semplicemente aggiungere nuove mappature. 

L'esempio che segue dimostra il funzionamento di quanto fin qui spiegato. In particolare aggiungerò una mappatura che effettua ovveride del nome semplice "SHA1" e crea una nuova mappatura alla classe SHA512Managed con nome smplice di "UGIRulezSHA".

 

 <?xml version="1.0" encoding="UTF-8" ?>
 
 <configuration>
    <mscorlib>
       <cryptographySettings>
          <cryptoNameMapping>
             <cryptoClasses>
                <cryptoClass
                
sha1Override="System.Security.Cryptography.SHA1Managed,
10                 mscorlib, 
Version=1.0.3705.209,
11                 
Culture=neutral, PublicKey=b77a5c561934e089"/>
12                 <cryptoClass
13                 
newApress="System.Security.Cryptography.SHA512Managed,
14                 mscorlib, 
Version=1.0.3705.209,
15                 
Culture=neutral, PublicKey=b77a5c561934e089"/>
16              <
/cryptoClasses>
17              <nameEntry 
name="SHA1" class=''sha1Override"/>
18              <nameEntry 
name="UGIRulezSHA" class="newApress"/>
19           <
/cryptoNameMapping>
20        <
/cryptographySettings>
21     <
/mscorlib>
22     
<!-- altri elementi di configurazione vanno qui -->
23  
</configuration>

Come si può vedere, i due elementi <cryptoClass> contengono tutte le informazioni della classe per creare un oggetto di questo tipo. L'unico attributo dell'elemento è usato negli elementi <nameEntry> per riferirsi alla descrizione della classe. Se aggiungiamo questi elementi al file di configurazione (machine.config) il seguente codice ritornerà un oggetto di tipo SHA512Managed.

HashAlgorithm hash = (HashAlgorithm)CryptoConfig.CreateFromName("UGIRulezSHA");

Non dobbiamo usare CryptoConfig per avere nuove mappature. Ogni chiamata al metodo statico Create() proveniente da ogni classe di tipo Cryptograph viene risolta in una chiamata a CreateFromName(), quindi il codice che segue funziona come presupposto.

HashAlgorithm hash = HashAlgorithm.Create("UGIRulezSHA");

Se volete creare la vostra personale implementazione di un Algoritmo Hash, ora sapete come potete far ritornare il vostro oggetto tramite una chiamata Create() la quale ritornerà un risultato in pieno stile .NET.