.NET - Classe de cryptage simple



Documents pareils
.NET - Classe de Log

Rafraichissement conditionné d'une page en.net

Le MSMQ. Version 1.0. Pierre-Franck Chauvet

Paginer les données côté serveur, mettre en cache côté client

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Création d'un site web avec identification NT

Application 1- VBA : Test de comportements d'investissements

La double authentification dans SharePoint 2007

Travaux Pratiques de Commande par ordinateur 1 TRAVAUX PRATIQUES

A DESTINATION DES SERVICES TIERS. Editeurs d applications et ressources pédagogiques connectées à l ENT

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp

Déploiement et monitoring

Gestion du cache dans les applications ASP.NET

Application de lecture de carte SESAM-Vitale Jeebop

Manuel Utilisateur Version 1.6 Décembre 2001

Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme

Programmation VBA/Excel. Programmation VBA. Pierre BONNET. Masters SMaRT & GSI - Supervision Industrielle P. Bonnet

Crypter le courrier. Pourquoi crypter? Les clés de cryptage. Supplément au manuel Internet sécurité d'abord!

Module http MMS AllMySMS.com Manuel d intégration

Microsoft OSQL OSQL ou l'outil de base pour gérer SQL Server

Service de certificat

Cahier des charges. driver WIFI pour chipset Ralink RT2571W. sur hardware ARM7

Reporting Services - Administration

Programmer en JAVA. par Tama

Programmation C++ (débutant)/instructions for, while et do...while

Création d objet imbriqué sous PowerShell.

Skype (v2.5) Protocol Data Structures (French) Author : Ouanilo MEDEGAN

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Dans l'article précédent, vous avez appris

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Alfstore workflow framework Spécification technique

SNT4U16 - Initiation à la programmation TD - Dynamique de POP III - Fichiers sources

Définition des Webservices Ordre de paiement par . Version 1.0

Sub CalculAnnuite() Const TITRE As String = "Calcul d'annuité de remboursement d'un emprunt"

TD Objets distribués n 3 : Windows XP et Visual Studio.NET. Introduction à.net Remoting

Recherche dans un tableau

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

ARDUINO DOSSIER RESSOURCE POUR LA CLASSE

Le stockage local de données en HTML5

MEGA Web Front-End Installation Guide MEGA HOPEX V1R1 FR. Révisé le : 5 novembre 2013 Créé le : 31 octobre Auteur : Noé LAVALLEE

Programmation en Java IUT GEII (MC-II1) 1

Sécurisez votre serveur Web Internet Information Services de Microsoft (MS IIS) avec un certificat numérique de thawte thawte thawte thawte thawte

Convers3 Documentation version Par Eric DAVID : vtopo@free.fr

Stockage du fichier dans une table mysql:

TrueCrypt : installation et paramétrage

(Fig. 1 :assistant connexion Internet)

La sécurité dans un réseau Wi-Fi

Utilisation d objets : String et ArrayList

SHERLOCK 7. Version du 01/09/09 JAVASCRIPT 1.5

1. Structure d'un programme FORTRAN 95

TP WEBSERVICES. 1 Pré-requis. 1.1 L environnement de développement. 1.2 Les librairies nécessaires 1.3 SOAPUI

Gestion de l authentification et des autorisations

Classe ClInfoCGI. Fonctions membres principales. Gestion des erreurs

1.6- Génération de nombres aléatoires

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Programmation Réseau SSH et TLS (aka SSL)

Chapitre 7. Sécurité des réseaux. Services, attaques et mécanismes cryptographiques. Hdhili M.H. Cours Administration et sécurité des réseaux

Plateforme PAYZEN. Définition de Web-services

Guide de l'utilisateur

Microsoft Application Center Test

Programme Compte bancaire (code)

Créer un rapport pour Reporting Services

Rapport de Mini-Projet en ArcGIS Engine

Cours 14. Crypto. 2004, Marc-André Léger

Documentation CAS à destination des éditeurs

Cours Informatique Master STEP

Hébergement et configuration de services WCF. Version 1.0

Le Network File System de Sun (NFS)

Notions fondamentales du langage C# Version 1.0

Manuel des logiciels de transferts de fichiers File Delivery Services

Service Informatique et Télématique (SITEL), Emile-Argand 11, 2009 Neuchâtel, Tél ,

Les Utilisateurs dans SharePoint

Host Integration Server 2000

I. Introduction aux fonctions : les fonctions standards

Connaître la version de SharePoint installée

Dossier Technique. Détail des modifications apportées à GRR. Détail des modifications apportées à GRR Le 17/07/2008. Page 1/10

Utilitaires méconnus de StrataFrame

Création d'un site dynamique en PHP avec Dreamweaver et MySQL

Manuel d'installation

Déploiement d'une base SQL Express

Chapitre 10. Les interfaces Comparable et Comparator 1

Alfresco Guide Utilisateur

Les commandes relatives aux réseaux

Bases de données Oracle Virtual Private Database (VPD) pour la gestion des utilisateurs d applications

Extension SSO Java. Cette note technique décrit la configuration et la mise en œuvre du filtre de custom SSO Java.

Les messages d erreur d'applidis Client

Aspects techniques : guide d interfaçage SSO

Application web de gestion de comptes en banques

Utilisation de JAVA coté Application serveur couplé avec Oracle Forms Hafed Benteftifa Novembre 2008

INF2015 Développement de logiciels dans un environnement Agile. Examen intra 20 février :30 à 20:30

OUTIL DE CRYPTAGE ET DE COMPRESSION

Sage CRM. Sage CRM 7.3 Guide du portable

Network Shutdown Module V3 Extension du Manuel Utilisateur pour architecture Virtualisée VMWare ESX Server 3, 3.5

Authentification et contrôle d'accès dans les applications web

Manuel d'utilisation d'apimail V3

Protocole SSH-2.0. Tuan-Tu, TRAN. Janvier 2009

C r é a t i o n D e S i t e s. P o l C R O V A T T O

Projet de programmation (IK3) : TP n 1 Correction

Comité sectoriel de la sécurité sociale et de la santé Section «Sécurité sociale»

Mr. B. Benaissa. Centre universitaire Nâama LOGO

Transcription:

.NET - Classe de cryptage simple Version simplifiée d'une classe de cryptage Dans tous les projets plus ou moins sensible, il est très souvent demandé de 'crypter' les données qui transitent (par exemple, dans une URL par l'utilisation des QueryString). Voila donc un exemple totalement commenté et que j'utilise dans tous mes projets actuels et surtout un exemple d'application l'utilisant. Classe de Cryptage Simple des Données Introduction Dans le développement d'applications, il arrive toujours un moment où il faut échanger des données à l'extérieur de cette application (donc pas d'utilisation de variable de session, ), on doit donc passer en Mode POST ou GET, qui n'est pas fiable en matière de sécurité des données. Il est donc toujours très utile de pouvoir 'crypter' un minimum ces données sortantes. Un exemple de la mise en place récente de cette classe a été l'ajout du cryptage simple dans les HttpHandler pour le téléchargement de fichier (Cf. l'article sur les HttpHandler). Ainsi le nom du fichier appelé dans l'url n'était pas visible de l'utilisateur. Nous allons donc dans cet article présenter simplement la classe (elle est entièrement commentée) et ensuite modifier le fichier que nous avions dans l'article précédent (les HttpHandler) pour ajouter le cryptage. Le cryptage Tout d'abord voyons ce qu'est le cryptage, il s'agit de transformer une donnée d'origine selon une méthode précise (utilisant pour cela une ou plusieurs clés) pour qu'un utilisateur n'ayant pas la clé (ou les clés) qui a (ont) servi à ce cryptage ne puisse pas retrouver la donnée d'origine. Une présentation plus précise de ce qu'est le cryptage et son évolution jusqu'à nos jours est ici : Principe du Cryptage PGP (FR) La méthode qui va être utilisée dans la classe présentée est celle de la Cryptographie conventionnelle, c'est à dire le cryptage de clé secrète ou de clé symétrique. Ainsi dans cet outil nous définirons une seule et unique clé qui sera utilisée par les deux partie (la partie qui codera, et celle qui décodera). Ces deux parties peuvent être dans la même application ou non (et l'intérêt est la). Voyons maintenant plus précisément cette classe.

Classe de Cryptage Simple Le langage qui a été utilisé pour créer cette classe est le VB.NET. Vous pouvez donc facilement l'intégrer dans la librairie de classe présentée ici même : Librairie de Classe 'ASP.NET Chaînes Utilitaires' (FR) De même, elle est indépendante du FrameWork installé et fonctionne aussi bien avec le FrameWork 1.0 que le FrameWork 1.1. '*********************************************** ' $Archive: $ ' $Author: $ ' $Date: $ $Revision: $ ' Description : Liste des Fonctions pour le cryptage et décryptage des données ' ********************************************** Imports System Imports System.IO Imports System.Text Imports System.Security Imports System.Security.Cryptography Public Class EncryptData Public Shared mbytkey(7) As Byte Public Shared mbytiv(7) As Byte Public Shared Function InitKey(ByVal strkey As String) As Boolean 'Fonction de génération des clés pour les variables interne Try ' Conversion de la clé en Tableau d'octets Dim bp(strkey.length - 1) As Byte Dim aenc As ASCIIEncoding = New ASCIIEncoding() aenc.getbytes(strkey, 0, strkey.length, bp, 0) 'Hashage de la clé en utilisant SHA1 Dim sha As SHA1CryptoServiceProvider = New SHA1CryptoServiceProvider() Dim bphash() As Byte = sha.computehash(bp) Dim i As Integer ' Utilisation de la base 64-bits pour la valeur de la Clé For i = 0 To 7 mbytkey(i) = bphash(i) Next i For i = 8 To 15 mbytiv(i - 8) = bphash(i) Next Return True Catch e As Exception 'Erreur durant les opérations Return False End Try End Function Public Shared Function EncryptData(ByVal strkey As String, ByVal strdata As String) As String Dim strresult As String '1. La chaine de doitpas dépasser 90 Ko, Sinon le Buffer sera dépassé. 'Voir la raison au point 3 If strdata.length > 92160 Then strresult = "Erreur: Les données sont trop volumineuses. Ne pas dépasser 90Ko." '2. Génération de la Clé If Not (InitKey(strKey)) Then strresult = "Erreur: Impossible de générer la clé de Cryptage."

'3. Préparation de la Chaine ' Les premiers 5 Characteres de la Chaine sont formatté pour stocker l'actuel ' longueur des Données. C'est une méthode simple pour conserver la taille originale ' des données, Sans avoir à compliquer les calculs. strdata = String.Format("{0,5:00000}" & strdata, strdata.length) '4. Cryptage des Données Dim rbdata(strdata.length - 1) As Byte Dim aenc As New ASCIIEncoding() aenc.getbytes(strdata, 0, strdata.length, rbdata, 0) Dim descsp As DESCryptoServiceProvider = New DESCryptoServiceProvider() Dim desencrypt As ICryptoTransform = descsp.createencryptor(mbytkey, mbytiv) '5. Préparation des streams: ' mout est le Stream de Sortie. ' mstream est le Stream d'entrée. ' cs est la Stream de Transformation. Dim mstream As New MemoryStream(rbData) Dim cs As New CryptoStream(mStream, desencrypt, CryptoStreamMode.Read) Dim mout As New MemoryStream() '6. Début du Cryptage Dim bytesread As Integer Dim output(1023) As Byte Do bytesread = cs.read(output, 0, 1024) If Not (bytesread = 0) Then mout.write(output, 0, bytesread) Loop While (bytesread > 0) '7. Renvoie le résultat Crypté encodé en Base 64 ' Dans ce cas, Le résultat Actuel est Converti en Base 64 et il peut être ' transporté au travers du protocol HTTP sans déformation. If mout.length = 0 Then strresult = "" Else strresult = Convert.ToBase64String(mOut.GetBuffer(), 0, CInt(mOut.Length)) '8. Modification de la chaine d'entrée pour récupérer les + ' qui ne sont pas passable via Querystring strresult = strresult.replace("+", "- - -") End Function Public Shared Function DecryptData(ByVal strkey As String, ByVal strdata As String) As String Dim strresult As String '1. Modification de la chaine d'entrée pour récupérer les + ' qui ne sont pas passable via Querystring strdata = strdata.replace("- - -", "+") '2. Génération de la Clé If Not (InitKey(strKey)) Then strresult = "Erreur: Impossible de générer la clé de Cryptage." '2. Initialisation du Provider Dim nreturn As Integer = 0 Dim descsp As New DESCryptoServiceProvider() Dim desdecrypt As ICryptoTransform = descsp.createdecryptor(mbytkey, mbytiv) '3. Préparation des streams: ' mout est le Stream de Sortie. ' cs est la Stream de Transformation. Dim mout As New MemoryStream() Dim cs As New CryptoStream(mOut, desdecrypt, CryptoStreamMode.Write)

'4. Mémorisation pour revenir de la Base 64 vers un tableau d'octets pour récupérer le 'le Stream de base Crypté Dim bplain(strdata.length - 1) As Byte Try bplain = Convert.FromBase64CharArray(strData.ToCharArray(), 0, strdata.length) Catch e As Exception strresult = "Erreur: Les données en Entrée ne sont pas en base 64." End Try Dim lread As Long = 0 Dim lreadnow As Long = 0 Dim ltotal As Long = strdata.length Try '5. Réalise le Décryptage Do While (ltotal >= lread) cs.write(bplain, 0, bplain.length) lreadnow = CLng(((bPlain.Length / descsp.blocksize) * descsp.blocksize)) lread = lreadnow + lread Loop Dim aenc As New ASCIIEncoding() strresult = aenc.getstring(mout.getbuffer(), 0, CInt(mOut.Length)) '6. Nettoie la chaine pour ne renvoyer que les données signicatives ' Rappelez-vous cela dans la fonction de chiffrage, les 5 premiers caractère ' permettent de conserver la taille originale de la chaine de caracteres ' C'est la méthode la plus simple de mémoriser la taille des données d'origine, ' sans passer par des calculs complèxes. Dim strlen As String = strresult.substring(0, 5) Dim nlen As Integer = CInt(strLen) strresult = strresult.substring(5, nlen) nreturn = CInt(mOut.Length) Catch e As Exception strresult = "Erreur: Impossible de décrypter. Eventuellement " strresult &= "à cause d'une clé non conforme ou de données corrompue." End Try End Function End Class On a donc 3 fonctions dans cette classe : InitKey : Cette fonction permet d'initialiser la clé à partir d'une chaîne de caractères qu'on a choisi d'utiliser comme clé de cryptage. C'est cette chaîne qu'il faudra que les deux parties connaissent pour échanger les données. EncryptData : Permet de crypter la donnée voulue avec la clé transmise. DecryptData : Permet de décrypter la donnée voulue avec la clé transmise. Maintenant que l'on a la classe et les fonctions qui y sont, voyons comment on peut utiliser celle-ci et plus particulièrement dans notre exemple de téléchargement de fichier PDF.

Utilisation de la classe de cryptage Je vous rappelle le cadre de notre exemple qui est ici : Exemple de Téléchargement de Fichier PDF Via HttpHandlers (FR) Rappel : Ainsi dans cet exemple, nous avons pour le moment un outil qui permet de simuler un appel d'un fichier PDF. C'est-à-dire qu'on appelle une page (ASHX), en lui passant en paramètre le nom du fichier (via QueryString), qui va se charger de vérifier que le fichier voulu existe et dans le cas l'envoyer en flux HTTP au client en donnant les entêtes HTTP pour Acrobat Reader. Objectif : On voit très bien que si on ne veut pas que l'utilisateur de cette page connaisse le nom du fichier d'origine (cas, par exemple, où plusieurs utilisateurs différents peuvent appeler un fichier qui leur est propre mais ne doivent pas pouvoir appeler celui d'un autre utilisateur et donc ne doivent pas connaître la méthode de définition des noms de fichiers), il faut absolument que ce nom transmis via la QueryString soit masqué et donc de préférence crypté. Méthode : On va donc modifier la classe du Gestionnaire HTTP pour ajouter le module de décryptage, il ne restera plus qu'à utiliser à l'inverse le cryptage dans la page où on appellera ce gestionnaire.

On va donc déjà ajouter deux clés dans le fichier Web.Config, afin de pouvoir correctement utiliser le HttpHandler : <configuration> <appsettings> <!-- Fourni la clé qui va être utilisée lors de l'appel de la fonction de cryptage et Décryptage --> <add key="clecryptagefichier" value="dotnetquedubonheur"/> <!-- Fourni Le chemin permettant d'atteindre le répertoire des PDF --> <add key="repertoireracinepdf" value="c:\monrepertoirepdf\"/> </appsettings> </system.web> <httphandlers> <add verb="*" path="dl_pdf.ashx" type="dotnetquedubonheur.handlers.pdfhandler, DotNetQueDuBonheur"/> </httphandlers> </system.web> </configuration> Maintenant voyons la classe du Gestionnaire HTTP : '*************************************** ' $Archive: /DotNetQueDuBonheur/Classes/PdfHandler.vb $ ' $Author: Fabrice69 $ ' $Date: 18/03/04 01:25 $ $Revision: 3 $ ' Description : Gestion de la sortie des fichier PDF sans donner l'url réelle d'accès a ces fichier ' Ajout d'une couche de cryptage des noms ' *************************************** Imports System.IO Namespace Handlers Public Class PDFHandler Implements IHttpHandler Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest ' A partir du nom du fichier PDF crée le Flux Binaire ' afin de le fournir à la page Dim nompdf As String = Trim(context.Request("nom")) Dim nomfichier As String Dim Cle As String Cle = System.Configuration.ConfigurationSettings.AppSettings("CleCryptageFichier") nomfichier = System.Configuration.ConfigurationSettings.AppSettings("RepertoireRacinePDF") nomfichier & = EncryptData. DecryptData(Cle, (Trim(nomPDF)) If nompdf = "" OrElse Not File.Exists(nomFichier) Then context.response.write("fichier Inexistant") Else Dim f As New FileStream(nomFichier, FileMode.Open) context.response.addheader("content-type", "application/pdf") Dim buffer(f.length) As Byte f.read(buffer, 0, f.length) f.close() context.response.binarywrite(buffer) End Sub Public ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable Get Return True End Get End Property End Class End Namespace

Maintenant dans la page qui va être affichée à l'utilisateur (qui ne doit donc pas connaître le nom du fichier d'origine), on aura plus qu'à placer un HyperLink en lui fournissant comme URL : Cle = System.Configuration.ConfigurationSettings.AppSettings("CleCryptageFichier") nomfichier = EncryptData. EncryptData(Cle, (NomReelFichierPDF) MonURL = "/DotNetQueDuBonheur/DL_PDF.ashx?nom=" & nomfichier

Conclusion Cette classe n'est qu'un exemple rapide de ce qui peut être fait en matière de cryptage de données, de plus la clé utilisée est symétrique dans cet exemple et chaque partie devra posséder la même. Si vous souhaiter développer un réel outil de cryptage, il faudra certainement choisir l'utilisation de la clé privée et clé publique. Je vous laisse découvrir dans l'article cité au départ quelle sont les spécificités de ce choix technique : Principe du Cryptage PGP (FR) Quelques articles ou exemples sur ce sujet : Create a Simple, Reusable Infrastructure for Public Key Encryption Using VB.NET (US) Exemple d'implémentation de cryptage dans un WebService (FR) Example of Public/Private Key (US) Exemple avec une Clé Symétrique en C# (US) Exemple de Clé Publique/Privée en PERL (US) En vous souhaitant de bons projets de développement. Romelard Fabrice (alias F )