Crittografia

Archiviazione di una stringa di connessione crittografata nel Registro di sistema

In questa pagina
ObiettiviObiettivi
Ambito di applicazioneAmbito di applicazione
Utilizzo del moduloUtilizzo del modulo
RiepilogoRiepilogo
Conoscenze necessarieConoscenze necessarie
Memorizzazione di dati crittografati nel Registro di sistemaMemorizzazione di dati crittografati nel Registro di sistema
Creazione di un'applicazione Web ASP.NETCreazione di un'applicazione Web ASP.NET
Altre risorseAltre risorse

Obiettivi

Il modulo consente di:

Memorizzare nel Registro di sistema una stringa crittografata di connessione al database.

Leggere una stringa crittografata di connessione al database nel Registro di sistema e decrittografarla.

Ambito di applicazione

Le informazioni contenute in questo modulo sono valide per i seguenti prodotti e tecnologie:

Sistema operativo Microsoft Windows XP o Windows 2000 Server con Service Pack 3 e versioni successive

Microsoft .NET Framework versione 1.0 con Service Pack 2 e versioni successive

Microsoft Visual C#® .NET

Utilizzo del modulo

Per trarre il massimo vantaggio dal modulo:

È necessario aver acquisito esperienza nella programmazione con Visual C# .NET.

È necessario aver acquisito esperienza nell'utilizzo dell'ambiente di sviluppo Microsoft Visual Studio® .NET.

È necessario aver acquisito esperienza nello sviluppo di applicazioni Web mediante l'utilizzo di ASP.NET.

Creare la libreria di crittografia generica descritta in "Procedura - Creazione di una libreria di crittografia". Questa libreria fornisce la funzionalità utilizzata in questo modulo per crittografare e decrittografare la stringa di connessione al database.

Leggere "Archiviazione protetta delle stringhe di connessione al database" nel modulo 12 "Protezione dell'accesso ai dati". Vi sono incluse informazioni sulle tecniche di archiviazione in modalità protetta delle stringhe di connessione al database.

Riepilogo

La memorizzazione in modalità protetta delle stringhe di connessione al database è un problema comune che qualsiasi sviluppatore deve affrontare nello scrivere applicazioni che necessitano dell'accesso a un database. Il Registro di sistema costituisce una possibile soluzione di memorizzazione. Tuttavia, sebbene sia possibile proteggere singole chiavi del Registro di sistema con gli elenchi di controllo dell'accesso (ACL) di Microsoft® Windows®, per assicurare una maggiore protezione è consigliabile memorizzare le stringhe di connessione solo dopo averle crittografate.

In questo modulo viene descritto come memorizzare una stringa crittografata di connessione al database nel Registro di sistema e come recuperarla da un'applicazione Web ASP.NET. Viene utilizzata la libreria di crittografia generica creata in "Procedura - Creazione di una libreria di crittografia".

Conoscenze necessarie

Prima di utilizzare questo modulo, tenere presente quanto segue:

La stringa di connessione, il vettore di inizializzazione e la chiave utilizzati per la crittografia verranno memorizzati nel Registro di sistema come valori denominati sotto la seguente chiave di registro:

HKEY_LOCAL_MACHINE\Software\TestApplication 

Per consentire la decrittografia della stringa di connessione, è necessario memorizzare il vettore di inizializzazione e la chiave.

Memorizzazione di dati crittografati nel Registro di sistema

Questa procedura consente di creare un'applicazione per Windows che verrà utilizzata per crittografare una stringa di connessione di esempio e memorizzarla nel Registro di sistema.

Per memorizzare i dati crittografati nel Registro di sistema

1.

Avviare Visual Studio .NET e creare un nuovo progetto per Windows in Visual C# denominato EncryptionTestApp.

2.

Aggiungere un riferimento all'assembly nell'assembly Encryption.dll.
Per creare questo assembly, è necessario eseguire le operazioni descritte nella sezione "Procedura - Creazione di una libreria di crittografia" di questa guida.

3.

Aggiungere le seguenti istruzioni using all'inizio di Form1.cs, sotto le istruzioni using esistenti.

using Encryption; 
using System.Text; 
using Microsoft.Win32; 

4.

Aggiungere a Form1 i controlli elencati nella tabella 1 e disporli come illustrato nella figura 1.

Tabella 1: controlli di EncryptionTestApp

ControlloTestoID

Etichetta

Stringa di connessione:

 

Casella di testo

 

txtConnectionString

Etichetta

Chiave:

 

Casella di testo

 

txtKey

Etichetta

Vettore di inizializzazione:

 

Casella di testo

 

txtInitializationVector

Etichetta

Stringa crittografata:

 

Casella di testo

 

txtEncryptedString

Etichetta

Stringa decrittografata:

 

Casella di testo

 

txtDecryptedString

Pulsante

Crittografa

btnEncrypt

Pulsante

Decrittografa

btnDecrypt

Pulsante

Scrivi dati nel Registro

btnWriteRegistryData

Finestra di dialogo Applicazione di prova della crittografia

Figura 1
Finestra di dialogo Applicazione di prova della crittografia

5.

Impostare la proprietà Text di txtConnectionString su

"Server=local; database=pubs; uid=Bob; pwd=Password" 

6.

Impostare la proprietà Text di txtKey su

"0123456789012345" 

La lunghezza della chiave è 16 byte, in modo che venga supportata dall'algoritmo di crittografia Triple DES.

7.

Impostare la proprietà Text di Form1 su

"Encryption Test Harness" 

8.

Fare doppio clic sul pulsante Encrypt per creare un gestore eventi ButtonClick e aggiungere a quest'ultimo il seguente codice:

try 
{ 
  // Create the encryptor object, specifying 3DES as the 
  // encryption algorithm 
  Encryptor enc = new Encryptor(EncryptionAlgorithm.TripleDes); 
  // Get the connection string as a byte array 
  byte[] plainText = Encoding.ASCII.GetBytes(txtConnectionString.Text); 
  byte[] key = Encoding.ASCII.GetBytes(txtKey.Text); 
  // Perform the encryption 
  byte[] cipherText = enc.Encrypt(plainText, key); 
  // Store the intialization vector, as this will be required 
  // for decryption 
  txtInitializationVector.Text = Encoding.ASCII.GetString(enc.IV); 
  // Display the encrypted string 
  txtEncryptedString.Text = Convert.ToBase64String(cipherText); 
} 
catch(Exception ex) 
{ 
  MessageBox.Show("Exception encrypting: " + ex.Message,  
                  "Encryption Test  Harness"); 
} 

9.

Tornare a Form1 in modalità progettazione e fare doppio clic sul pulsante Decrittografa per creare un gestore eventi ButtonClick.

10.

Aggiungere il codice riportato di seguito al gestore eventi del pulsante Decrittografa .

try 
{ 
  // Set up the Decryptor object 
  Decryptor dec = new Decryptor(EncryptionAlgorithm.TripleDes); 
  // Set the Initialization Vector 
  dec.IV = Encoding.ASCII.GetBytes(txtInitializationVector.Text); 
  byte[] key = Encoding.ASCII.GetBytes(txtKey.Text); 
  // Perform the decryption 
  byte[] plainText =  dec.Decrypt(Convert.FromBase64String( 
                                  txtEncryptedString.Text), 
                                  key); 
  // Display the decrypted string. 
  txtDecryptedString.Text = Encoding.ASCII.GetString(plainText); 
} 
catch(Exception ex) 
{ 
  MessageBox.Show("Exception decrypting. " + ex.Message,  
                  "Encryption Test Harness"); 
} 

11.

Tornare a Form1 in modalità progettazione e fare doppio clic sul pulsante Scrivi dati nel Registro per creare un gestore eventi ButtonClick.

12.

Aggiungere al gestore eventi il seguente codice:

// Create registry key and named values 
RegistryKey rk = Registry.LocalMachine.OpenSubKey("Software",true); 
rk = rk.CreateSubKey("TestApplication"); 
// Write encrypted string, initialization vector and key to the registry 
rk.SetValue("connectionString",txtEncryptedString.Text); 
rk.SetValue("initVector",Convert.ToBase64String( 
              Encoding.ASCII.GetBytes(txtInitializationVector.Text))); 
rk.SetValue("key",Convert.ToBase64String(Encoding.ASCII.GetBytes( 
                                         txtKey.Text))); 
MessageBox.Show("The data has been successfully written to the registry"); 

13.

Eseguire l'applicazione, quindi scegliere Encrypt.
La stringa crittografata di connessione viene visualizzata nel campo Stringa crittografata.

14.

Scegliere Decrittografa.
La stringa originale viene visualizzata nel campo Stringa decrittografata.

15.

Scegliere Scrivi dati nel Registro.

16.

Nella finestra di messaggio scegliere OK.

17.

Eseguire regedit.exe e visualizzare il contenuto della seguente chiave:

HKLM\Software\TestApplication 

Verificare che siano presenti i valori codificati per i valori denominati connectionString, initVector e key.

18.

Chiudere regedit.exe e l'applicazione di prova.

Creazione di un'applicazione Web ASP.NET

Questa procedura consente di sviluppare una semplice applicazione Web ASP.NET che recupererà la stringa crittografata di connessione dal Registro di sistema e la decrittograferà.

Per creare un'applicazione ASP.NET

1.

Creare una nuova applicazione Web ASP.NET Visual C# denominata EncryptionWebApp.

2.

Aggiungere un riferimento all'assembly nell'assembly Encryption.dll.
Per creare questo assembly, è necessario eseguire le operazioni descritte nella sezione "Procedura - Creazione di una libreria di crittografia" di questa guida.

3.

Aprire Webform1.aspx.cs e aggiungere le istruzioni using riportate di seguito all'inizio del file, sotto le istruzioni using esistenti.

using Encryption; 
using System.Text; 
using Microsoft.Win32; 

4.

Aggiungere a WebForm1.aspx i controlli elencati nella tabella 2.

Tabella 2: controlli di WebForm1.aspx

ControlloTestoID

Etichetta

 

lblEncryptedString

Etichetta

 

lblDecryptedString

Pulsante

Ottieni stringa di connessione

btnGetConnectionString

5.

Fare doppio clic sul pulsante Ottieni stringa di connessione per creare un gestore eventi ButtonClick.

6.

Aggiungere al gestore eventi il seguente codice:

RegistryKey rk = Registry.LocalMachine.OpenSubKey( 
                                          @"Software\TestApplication",false); 
lblEncryptedString.Text = (string)rk.GetValue("connectionString"); 
string initVector = (string)rk.GetValue("initVector"); 
string strKey = (string)rk.GetValue("key"); 
Decryptor dec = new Decryptor(EncryptionAlgorithm.TripleDes ); 
dec.IV = Convert.FromBase64String(initVector); 
// Decrypt the string 
byte[] plainText = dec.Decrypt(Convert.FromBase64String( 
                               lblEncryptedString.Text),  
                               Convert.FromBase64String(strKey)); 
lblDecryptedString.Text = Encoding.ASCII.GetString(plainText); 

7.

Scegliere Genera soluzione dal menu Genera.

8.

In Esplora soluzioni fare clic con il pulsante destro del mouse su Webform1.aspx, quindi scegliere Visualizza nel browser.

9.

Scegliere Ottieni stringa di connessione.
Le stringhe di connessione crittografate e decrittografate vengono visualizzate nel modulo Web.

Altre risorse

Per ulteriori informazioni, vedere "Procedura - Creazione di una libreria di crittografia" in questa guida.


**
In questo articolo
**