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.
1 <?xml version="1.0" encoding="UTF-8" ?>
2 <configuration>
3 <mscorlib>
4 <cryptographySettings>
5 <cryptoNameMapping>
6 <cryptoClasses>
7 </cryptoClasses>
8 </cryptoNameMapping>
9 </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".
1 <?xml version="1.0" encoding="UTF-8" ?>
2
3 <configuration>
4 <mscorlib>
5 <cryptographySettings>
6 <cryptoNameMapping>
7 <cryptoClasses>
8 <cryptoClass
9 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.