www.bewise.fr

Recherche

Cryptage d’informations d’un fichier Web.Config en VB.NET

Par Frédéric Colin, posté le 19/03/2004

Profil : Développeur | Niveau : Intermédiaire (200)

Tags : VB.Net | Partager : Partager sur Delicious Partager sur Facebook Partager sur Twitter

1 Introduction

L'objectif de cet article est de fournir un exemple de cryptage des informations sensibles contenues dans le fichier de configuration d'un site Web (appSettings du fichier Web.Config).

L'exemple a été conçu sur la base du Framework 1.1 sur une machine Windows 2003 Server édition standard US.

2 L'exemple par le code

2.1 Architecture de l'exemple

Il s'agit d'un simple site Web avec un formulaire Web « WebForm1 » et une classe « Util » qui se charge du cryptage/décryptage au travers de membres partagés.

clip_image001 Le point de vue de l'arborescence du site :

clip_image003

clip_image001[1] Le point de vue du formulaire Web :

Voici l'interface de l'application qui permet de crypter/décrypter des chaînes de caractères et qui liste les informations cryptées contenues dans la collection « appSettings » du fichier Web.Config.

clip_image005

clip_image001[2] Le point de vue du fichier de configuration

   1:  <appSettings>
   2:      <add key="ConnectionString" value="ezjfn/cJj1wCNiAvVrbvr2i6pgwKZzLHNIJterNIxNeAY964c3KGgjllEhbdCms1fP4iGrfGu+EcBWhjdDHW/Q==" />
   3:      <add key="clé 1" value="lu/0UqSuS+pgvaY1XmaNSTdiSzba1h4F" />
   4:      <add key="clé 2" value="lu/0UqSuS+pgvaY1XmaNSRwTVUAINPtr" />
   5:  appSettings>    

clip_image001[3] Le point de vue des classes

clip_image002

2.2 Codage de l'exemple

Dans cet exemple, je me propose d'utiliser les espaces de nom suivants :

§ Imports System.Security.Cryptography

· Pour l'algorithme de cryptage symétrique TripleDES

§ Imports System.Text

· Pour les transformations String ó Tableau d'octets puisque les algorithmes de cryptage travaillent en tableaux d'octets

§ Imports System.IO

· Pour le MemoryStream

En entrée de cryptage, il faut fournir deux éléments importants :

o Le vecteur d'initialisation utilisé par l'algorithme de cryptage pour le premier bloc d'information à crypter. Sans cet IV (on peut le considérer comme un modèle de cryptage), les données communes entre deux chaînes seraient cryptées suivant le même modèle pour une clé identique. En d'autres termes, avec une même clé mais 2 IV différents, les données sont cryptées avec des valeurs différentes.

o La clé de cryptage utilisée pour Crypter / Décrypter

La classe Util sert à deux niveaux :

o Chargée du cryptage/décryptage à partir d'un IV et d'une clé codées en dur dans la classe

o Chargée de l'encapsulation de la propriété AppSettings de la classe ConfigurationSettings.

Le service de cryptographie TripleDES fourni par la Framework 1.1 admet donc un vecteur d'initialisation d'une taille exacte de 8 caractères et une clé d'une taille exacte de 24 caractères. Pour info, la classe « TripleDESCryptoServiceProvider » fournit deux services permettant respectivement de générer automatiquement un IV (méthode GenerateIV) et une clé (méthode GenerateKey).

Le code de la classe Util est le suivant :

 

   1:  Imports System.Security.Cryptography
   2:  Imports System.Text
   3:  Imports System.IO
   4:   
   5:  Public Class Util
   6:   
   7:      Private Shared iv() As Byte = System.Text.Encoding.UTF8.GetBytes("Az'RTygà") ' 8 caractères
   8:      Private Shared key() As Byte = System.Text.Encoding.UTF8.GetBytes("CeRtTrdsNjuIOlMlZaSwXdf?") ' 24 caractères
   9:   
  10:      Private Shared encryptor As New TripleDESCryptoServiceProvider
  11:   
  12:      Public Shared Function Decrypte(ByVal valeur As String) As String
  13:          Dim transform As ICryptoTransform
  14:          Dim myStream As MemoryStream
  15:          Dim cs As CryptoStream
  16:          Dim data() As Byte
  17:   
  18:          transform = encryptor.CreateDecryptor(key, iv)
  19:   
  20:          data = Convert.FromBase64String(valeur)
  21:   
  22:          myStream = New MemoryStream
  23:          cs = New CryptoStream(myStream, transform, CryptoStreamMode.Write)
  24:          cs.Write(data, 0, data.Length)
  25:          cs.FlushFinalBlock()
  26:   
  27:          cs.Close()
  28:   
  29:          Return Encoding.UTF8.GetString(myStream.ToArray())
  30:      End Function
  31:   
  32:      Public Shared Function Crypte(ByVal valeur As String) As String
  33:   
  34:          Dim transform As ICryptoTransform
  35:          Dim myStream As MemoryStream
  36:          Dim cs As CryptoStream
  37:          Dim data() As Byte
  38:   
  39:          transform = encryptor.CreateEncryptor(key, iv)
  40:   
  41:          data = Encoding.UTF8.GetBytes(valeur)
  42:   
  43:          myStream = New MemoryStream
  44:          cs = New CryptoStream(myStream, transform, CryptoStreamMode.Write)
  45:          cs.Write(data, 0, data.Length)
  46:          cs.FlushFinalBlock()
  47:   
  48:          cs.Close()
  49:   
  50:          Return Convert.ToBase64String(myStream.ToArray())
  51:      End Function
  52:   
  53:      Public Shared ReadOnly Property AppSettings(ByVal key As String) As String
  54:          Get
  55:              Dim s As String = ConfigurationSettings.AppSettings(key)
  56:              Dim valeurRetournee As String = Nothing
  57:   
  58:              If Not s Is Nothing AndAlso s.Trim.Length <> 0 Then
  59:                  valeurRetournee = Decrypte(s)
  60:              Else
  61:                  valeurRetournee = Nothing
  62:              End If
  63:   
  64:              Return valeurRetournee
  65:          End Get
  66:      End Property
  67:   
  68:  End Class

La propriété AppSettings de la classe Util permet donc de récupérer les informations du fichier de configuration en lieu et place de la propriété AppSettings de la classe ConfigurationSettings du Framework.

3 Conclusion

Pour information, d'autres services de cryptage (symétriques ou asymétriques) sont fournis par le Framework. Pour cela, je vous invite à regarder l'espace de nom « System.Security.Cryptography ».

Bien entendu, dans cet exemple, il resterait à implémenter l'interception d'erreurs lors des phases de cryptage / Décryptage (erreur de type « Bad Data » par exemple si la valeur cryptée a été modifiée). Je laisse libre cour à votre imagination pour inventer le traitement adéquat sur le sujet !

Après avoir dirigé la Gestion de la Production à Bewise pendant de nombreuses années, Frédéric a rejoint Vertice, une société du groupe éditrice de la gamme Nova et spécialisée dans la 3D interactive. Partisan d’une 3D interactive mais aussi démonstrative et utile, il s’attache à illustrer ses propos via son blog. Malgré ce changement de poste, il n’en a pas oublié ses racines de développeur et continue de participer à la communauté .NET en publiant des articles sur la conception d’Architectures pragmatiques et distribuées. Retombé depuis peu dans les musiques de type « Métal » pour le plus grand malheur de ses collègues de bureau, il n’en reste pas moins éclectique dans ses goûts musicaux !

Voir les autres publications de l'auteur


Commentaires