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)
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.
Le point de vue de l'arborescence du site :
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.
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>
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 !



