[...]
Nei paragrafi precedenti abbiamo illustrato come sia possibile organizzare le classi e, complessivamente, le nostre applicazioni, in modo da ridurre i rischi di sicurezza legati alla violazione degli altri dati presenti sulla macchina. Oltre a quanto analizzato, è usuale avere dei dati che, anche in caso di accesso da parte di altri utenti, non siano direttamente leggibili dagli esseri umani, in quanto cifrati.
All'interno del .NET Framework sono disponibili molte classi per gestire dati riservati e rendere il loro immagazzinamento in memoria o il loro scambio più sicuro. Il concetto di crittografia si basa sul principio di modificare la rappresentazione dei dati in modo tale che non siano leggibili direttamente, che solo l'applicazione possa conoscerne il valore reale e che non sia possibile risalire al valore originale, se non in presenza di precise condizioni.
Come vedremo nei paragrafi successivi, molte delle operazioni di crittografia si basano sul principio di modificare i dati in funzione di un preciso valore, detto comunemente chiave, valore che, a sua volta, può avere un livello di sicurezza dettato dalla riproducibilità dello stesso e dalla difficoltà con la quale può essere conosciuto da altri utenti oltre al cifratore.
Windows Data Protection
Una delle soluzioni più immediate che abbiamo a disposizione nel Framework è rappresentata dalla classe ProtectedData del namespace System.Security.Cryptography, presente nell'assembly System.Security.dll. Tale classe implementa la cifratura, basandosi sul servizio di data protection (DPAPI) esposto dal sistema operativo stesso. Con i due metodi statici Protect e Unprotect possiamo cifrare e decifrare i nostri dati rappresentati sotto forma di array di byte e abbiamo la possibilità di definire un livello di decifrabilità nel contesto di sistema o al solo utente autenticato, grazie al parametro DataProtectionScope.
Nell'esempio 1 possiamo vedere come cifrare una semplice stringa; con DataProtectionScope.CurrentUser l'algoritmo usa come chiave la password dell'utente.
Dim data As String = "testo da cifrare"
Dim dataByte As Byte() = System.Text.Encoding.UTF8.GetBytes(data)
Dim entropy As Byte() = System.Text.Encoding.UTF8.GetBytes("chiave ulteriore sicurezza")
Dim dataCripted As Byte() = ProtectedData.Protect(dataByte, entropy, DataProtectionScope.CurrentUser)
string data = "testo da cifrare";
byte[] dataByte = Encoding.UTF8.GetBytes(this.data);
byte[] entropy = Encoding.UTF8.GetBytes("chiave ulteriore sicurezza");
byte[] dataCripted = ProtectedData.Protect(dataByte, entropy, DataProtectionScope.CurrentUser);
Come possiamo vedere nel codice, è possibile aggiungere un'ulteriore chiave da affiancare a quella derivata dal DataProtectionScope. Il livello di sicurezza di questa modalità si basa essenzialmente sulla complessità della password scelta dall'utente. L'utilità maggiore di questa classe risponde essenzialmente alle esigenze di una applicazione che memorizzi, anche su file system, delle informazioni alle quali solo l'utente può accedere in chiaro.