Procédure : Stocker une chaîne de connexion cryptée dans le Registre

Dernière mise à jour le 31 août 2004

Sur cette page

Objectifs
S'applique à
Comment utiliser ce module
Résumé
Points à connaître
Stocker les données cryptées dans le Registre
Créer une application Web ASP.NET
Ressources supplémentaires

Objectifs

Ce module vous permet d'effectuer les opérations suivantes :

  • stocker une chaîne cryptée de connexion de base de données dans le Registre ;

  • lire une chaîne cryptée de connexion de base de données dans le Registre et la décrypter.

Haut de page

S'applique à

Ce module s'applique aux produits et technologies suivants :

  • Microsoft Windows XP ou Windows 2000 Server (avec le Service Pack 3) et systèmes d'exploitation ultérieurs

  • Microsoft .NET Framework version 1.0 (avec le Service Pack 2) et versions ultérieures

  • Microsoft Visual C#® .NET

Haut de page

Comment utiliser ce module

Pour tirer le meilleur parti possible de ce module :

  • Vous devez être familiarisé avec la programmation en Visual C# .NET.

  • Vous devez être familiarisé avec l'environnement de développement Microsoft Visual Studio® .NET.

  • Vous devez être familiarisé avec le développement d'applications Web à l'aide de ASP.NET.

  • Vous serez amené à créer la bibliothèque de cryptage générique décrite dans la section « Procédure : Créer une bibliothèque de cryptage ». Cette bibliothèque fournit les fonctionnalités utilisées dans ce module pour crypter et décrypter la chaîne de connexion de base de données.

  • Consultez la section « Stockage sécurisé des chaînes de connexion de base de données » dans le Module 12, « Sécurité de l'accès aux données ». Cette section contient des informations concernant les techniques de stockage sécurisé des chaînes de connexion de base de données.

Haut de page

Résumé

Le choix de l'emplacement à adopter pour stocker les chaînes de connexion de base de données pose régulièrement problème aux développeurs qui écrivent des applications permettant d'accéder à des bases de données. Le Registre est l'un des emplacements possibles. Cependant, bien que les différentes clés du Registre puissent être sécurisées à l'aide des listes de contrôle d'accès (ACL) Windows, vous devez, pour plus de sécurité, stocker les chaînes uniquement après les avoir cryptées.

Ce module décrit comment stocker dans le Registre une chaîne de connexion à une base de données sous forme cryptée et comment extraire cette chaîne à partir d'une application Web ASP.NET. Vous serez amené à utiliser la bibliothèque de cryptage générique créée dans la section « Procédure : Créer une bibliothèque de cryptage ».

Haut de page

Points à connaître

Avant d'utiliser ce module, vous devez tenir compte des points suivants :

  • La chaîne de connexion, le vecteur d'initialisation et la clé utilisés pour le cryptage seront stockés dans le Registre en tant que valeurs nommées sous la clé de Registre suivante :

    ```
    HKEY_LOCAL_MACHINE\Software\TestApplication
    ```
    
  • Le vecteur d'initialisation et la clé doivent être stockés afin de permettre le décryptage de la chaîne de connexion.

Haut de page

Stocker les données cryptées dans le Registre

Cette procédure permet de créer une application Windows qui sera utilisée pour crypter un exemple de chaîne de base de données et stocker celle-ci dans le Registre.

  • Pour stocker les données cryptées dans le Registre

    1. Démarrez Visual Studio .NET et créez un projet Visual C# Windows nommé EncryptionTestApp.

    2. Ajoutez une référence d'assembly à l'assembly Encryption.dll. Pour créer cet assembly, vous devez effectuer les opérations décrites dans la section « Procédure : Créer une bibliothèque de cryptage » dans ce guide.

    3. Ajoutez les instructions using suivantes en haut du fichier Form1.cs, sous les instructions using existantes.

      using Encryption;
      using System.Text;
      using Microsoft.Win32;
      
    4. Ajoutez à Form1 les contrôles mentionnés dans le tableau 1 et organisez-les comme illustré dans la figure 1.

      Tableau 1 : Contrôles EncryptionTestApp

    Contrôle Texte ID
    Étiquette Chaîne de connexion :
    Zone de texte
    txtConnectionString
    Étiquette Clé :
    Zone de texte
    txtKey
    Étiquette Vecteur d'initialisation :
    Zone de texte
    txtInitializationVector
    Étiquette Chaîne cryptée
    Zone de texte
    txtEncryptedString
    Étiquette Chaîne décryptée
    Zone de texte
    txtDecryptedString
    Bouton Crypter btnEncrypt
    Bouton Décrypter btnDecrypt
    Bouton Écrire les données dans le Registre btnWriteRegistryData

    Figure 1
    Boîte de dialogue Harnais de test de cryptage

    1. Définissez la propriété Text de txtConnectionString de la façon suivante :

      "Server=local; database=pubs; uid=Bernard; pwd=Password"   
      
    2. Définissez la propriété Text de txtKey de la façon suivante :

      "0123456789012345"   
      

      La longueur de la clé est de 16 octets pour correspondre à l'algorithme de cryptage Triple DES.

    3. Définissez la propriété Text de Form1 de la façon suivante :

      "Harnais de test de cryptage"   
      
    4. Double-cliquez sur le bouton Crypter pour créer un gestionnaire d'événements de clic de bouton et ajoutez le code suivant à ce gestionnaire.

      try
      {
        // Créer l'objet de cryptage, en indiquant 3DES comme
        // algorithme de cryptage.
        Encryptor enc = new Encryptor(EncryptionAlgorithm.TripleDes);
        // Extraire la chaîne de connexion sous la forme d'un tableau d'octets.
        byte[] plainText = Encoding.ASCII.GetBytes(txtConnectionString.Text);
        byte[] key = Encoding.ASCII.GetBytes(txtKey.Text);
      
        // Effectuer le cryptage.
        byte[] cipherText = enc.Encrypt(plainText, key);
        // Stocker le vecteur d'initialisation car celui-ci sera nécessaire
        // pour le décryptage.
        txtInitializationVector.Text = Encoding.ASCII.GetString(enc.IV);
      
        // Afficher la chaîne cryptée.
        txtEncryptedString.Text = Convert.ToBase64String(cipherText);
      }
      catch(Exception ex)
      {
        MessageBox.Show("Exception liée au cryptage : " + ex.Message, 
                        "Harnais de test de cryptage");
      }
      
    5. Revenez au formulaire Form1 en mode Concepteur et double-cliquez sur le bouton Décrypter pour créer un gestionnaire d'événements de clic de bouton.

    6. Ajoutez le code suivant au gestionnaire d'événements du bouton Décrypter.

      try
      {
        // Configurer l'objet Decryptor.
        Decryptor dec = new Decryptor(EncryptionAlgorithm.TripleDes);
      
        // Définir le vecteur d'initialisation.
        dec.IV = Encoding.ASCII.GetBytes(txtInitializationVector.Text);
      
        byte[] key = Encoding.ASCII.GetBytes(txtKey.Text);
        // Effectuer le décryptage.
        byte[] plainText =  dec.Decrypt(Convert.FromBase64String(
                                        txtEncryptedString.Text),
                                        key);
      
        // Afficher la chaîne décryptée.
        txtDecryptedString.Text = Encoding.ASCII.GetString(plainText);
      }
      catch(Exception ex)
      {
        MessageBox.Show("Exception liée au décryptage. " + ex.Message, 
                        "Harnais de test de cryptage");
      }
      
    7. Revenez au formulaire Form1 en mode Concepteur et double-cliquez sur le bouton Écrire les données dans le Registre pour créer un gestionnaire d'événements de clic de bouton.

    8. Ajoutez le code suivant au gestionnaire d'événements.

      // Créer une clé de Registre et des valeurs nommées.
      RegistryKey rk = Registry.LocalMachine.OpenSubKey("Software",true);
      rk = rk.CreateSubKey("TestApplication");
      
      // Écrire une chaîne cryptée, un vecteur d'initialisation et une clé dans le Registre.
      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("Les données ont été écrites dans le Registre.");
      
    9. Exécutez l'application et cliquez sur Crypter.
      La chaîne de connexion cryptée apparaît dans le champ Chaîne cryptée.

    10. Cliquez sur Décrypter.
      La chaîne d'origine apparaît dans le champ Chaîne décryptée.

    11. Cliquez sur Écrire les données dans le Registre.

    12. Dans la zone de message, cliquez sur OK.

    13. Exécutez regedit.exe et affichez le contenu de la clé suivante.

      HKLM\Software\TestApplication
      

      Vérifiez que les valeurs codées sont présentes pour les valeurs nommées connectionString, initVector et key.

    14. Fermez regedit et testez l'application de harnais de test.

Haut de page

Créer une application Web ASP.NET

Cette procédure permet de développer une application Web ASP.NET simple destinée à extraire la chaîne de connexion cryptée du Registre puis à la décrypter.

  • Pour créer une application ASP.NET

    1. Créez une application Web ASP.NET Visual C# nommée EncryptionWebApp.

    2. Ajoutez une référence d'assembly à l'assembly Encryption.dll.
      Pour créer cet assembly, vous devez effectuer les opérations décrites dans la section « Procédure : Créer une bibliothèque de cryptage » dans ce guide.

    3. Ouvrez Webform1.aspx.cs et ajoutez les instructions using suivantes en haut du fichier, sous les instructions using existantes.

      using Encryption;
      using System.Text;
      using Microsoft.Win32;
      
    4. Ajoutez à WebForm1.aspx les contrôles mentionnés dans le tableau 2.

      Tableau 2 : Contrôles WebForm1.aspx

    Contrôle Texte ID
    Étiquette
    lblEncryptedString
    Étiquette
    lblDecryptedString
    Bouton Obtenir la chaîne de connexion btnGetConnectionString
    1. Double-cliquez sur le bouton Obtenir la chaîne de connexion pour créer un gestionnaire d'événements de clic de bouton.

    2. Ajoutez le code suivant au gestionnaire d'événements.

      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);
      
      // Décrypter la chaîne.
      byte[] plainText = dec.Decrypt(Convert.FromBase64String(
                                     lblEncryptedString.Text), 
                                     Convert.FromBase64String(strKey));
      
      lblDecryptedString.Text = Encoding.ASCII.GetString(plainText);  
      
    3. Dans le menu Générer, choisissez Générer la solution.

    4. Cliquez avec le bouton droit sur Webform1.aspx dans l'Explorateur de solutions et cliquez sur Afficher dans le navigateur.

    5. Cliquez sur Obtenir la chaîne de connexion.
      Les chaînes de connexion cryptées et décryptées apparaissent sur le formulaire Web.

Haut de page

Ressources supplémentaires

Pour plus d'informations, consultez la section « Procédure : Créer une bibliothèque de cryptage » dans ce guide.

Haut de page