La sécurité des applications Web grâce à la cryptographie



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

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

Livre blanc. Sécuriser les échanges

Signature électronique. Romain Kolb 31/10/2008

TP 2 : Chiffrement par blocs

Introduction à la sécurité Cours 8 Infrastructure de clés publiques. Catalin Dima

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

Sécurité du Système d Information. Mini PKI

Le protocole sécurisé SSL

Cryptologie. Algorithmes à clé publique. Jean-Marc Robert. Génie logiciel et des TI

Rapport de certification ANSSI-CSPN-2010/07. KeePass Version 2.10 Portable

Gestion des Clés. Pr Belkhir Abdelkader. 10/04/2013 Pr BELKHIR Abdelkader

Cryptographie. Cours 3/8 - Chiffrement asymétrique

Sommaire Introduction Les bases de la cryptographie Introduction aux concepts d infrastructure à clés publiques Conclusions Références

Informatique. Les réponses doivent être données en cochant les cases sur la dernière feuille du sujet, intitulée feuille de réponse

Mieux comprendre les certificats SSL THAWTE EST L UN DES PRINCIPAUX FOURNISSEURS DE CERTIFICATS SSL DANS LE MONDE

Une introduction à SSL

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

Autorité de certification

Plateforme PAYZEN. Définition de Web-services

L envoi d un formulaire par courriel. Configuration requise Mail Texte Mail HTML Check-list

INF 4420: Sécurité Informatique Cryptographie II

Les certificats numériques

Présentation. LogMeIn Rescue. Architecture de LogMeIn Rescue

I.1. Chiffrement I.1.1 Chiffrement symétrique I.1.2 Chiffrement asymétrique I.2 La signature numérique I.2.1 Les fonctions de hachage I.2.

titre : CENTOS_CUPS_install&config Système : CentOs 5.7 Technologie : Cups Auteur : Charles-Alban BENEZECH

Université d Aix-Marseille Master Réseaux & Télécoms Cryptographie

La sécurité dans les grilles

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

Serveur de partage de documents. Étude et proposition d'une solution afin de mettre en place un serveur de partage de documents.

NOTE: Pour une meilleure sécurisation, nous vous recommandons de faire l installation des outils web à l intérieur d un serveur virtuel.

Guide Numériser vers FTP

1. Mise en œuvre du Cegid Web Access Server en https

Documentation utilisateur "OK-MARCHE" Historique des modifications. 3.0 Mise à jour complète suite à version OK-MARCHE V2.2. de marchés publics

TD n o 8 - Domain Name System (DNS)

7. Le Service de certification déchiffre le document avec sa clé privée de déchiffrement.

Principales failles de sécurité des applications Web Principes, parades et bonnes pratiques de développement

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

ÉPREUVE COMMUNE DE TIPE Partie D

Les Protocoles de sécurité dans les réseaux WiFi. Ihsane MOUTAIB & Lamia ELOFIR FM05

Mise en place d un serveur HTTPS sous Windows 2000

L identité numérique. Risques, protection

Manuel des logiciels de transferts de fichiers File Delivery Services

Solution d inventaire automatisé d un parc informatique et de télédistribution OCS INVENTORY NG. EHRHARD Eric - Gestionnaire Parc Informatique

Devoir Surveillé de Sécurité des Réseaux

Service de certificat

Architectures PKI. Sébastien VARRETTE

Processus 2D-Doc. Version : 1.1 Date : 16/11/2012 Pôle Convergence AGENCE NATIONALE DES TITRES SECURISÉS. Processus 2D-Doc.

Certificats (électroniques) : Pourquoi? Comment? CA CNRS-Test et CNRS

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

SSH, le shell sécurisé

Keyyo Guide de mise en service CTI / API / TAPI Keyyo

CCNA Discovery Travailler dans une PME ou chez un fournisseur de services Internet

FORMATION SUR «CRYPTOGRAPHIE APPLIQUEE

Protocoles d authentification

Cryptographie et fonctions à sens unique

Pascal Gachet Travail de diplôme Déploiement de solutions VPN : PKI Etude de cas

Certificats X509 & Infrastructure de Gestion de Clés. Claude Gross CNRS/UREC

Manuel de la sécurité intégrée HP ProtectTools Ordinateurs d entreprise HP modèle dx5150

La sécurité des réseaux. 9e cours 2014 Louis Salvail

UltraBackup NetStation 4. Guide de démarrage rapide

II- Préparation du serveur et installation d OpenVpn :

Sécurisation du réseau

Sécurité des réseaux IPSec

Installation et utilisation d'un certificat

Initiation au cryptage et à la signature électronique

Gestion des Clés Publiques (PKI)

Sécurisation des accès au CRM avec un certificat client générique

Mise en route d'un Routeur/Pare-Feu

Sécurité WebSphere MQ V 5.3

Authentification de messages et mots de passe

Préparation d un serveur Apache pour Zend Framework

Sécurité des réseaux sans fil

Déploiement d'une Infrastructure de Gestion de Clés publiques libre

Programmation Réseau SSH et TLS (aka SSL)

Mécanismes de configuration automatique d une interface réseau, aspects sécurité

Gestion d identités PSL Installation IdP Authentic

SÉCURITÉ DU SI. Mini PKI. Denoun Jérémy De Daniloff Cyril Bettan Michael SUJET (3): Version : 1.0

CARPE. Documentation Informatique S E T R A. Version Août CARPE (Documentation Informatique) 1

Konica Minolta, un leader aux standards de sécurité les plus élevés du marché

CRYPTOGRAPHIE. Chiffrement par flot. E. Bresson. SGDN/DCSSI Laboratoire de cryptographie

Installation d OwnCloud 8.0 sous Debian Avec connexion des utilisateurs active directory et mise en place de HTTPS

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

Encryptions, compression et partitionnement des données

Les certfcats. Installation de openssl

AWS avancé. Surveiller votre utilisation d EC2

Aristote Groupe PIN. Utilisations pratiques de la cryptographie. Frédéric Pailler (CNES) 13 janvier 2009

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

Du 03 au 07 Février 2014 Tunis (Tunisie)

Gestion des clés cryptographiques

Modes opératoires pour le chiffrement symétrique

PHP CLÉS EN MAIN. 76 scripts efficaces pour enrichir vos sites web. par William Steinmetz et Brian Ward

Guide de démarrage du canal de transfert FTP

Manuel d Administration

IPS-Firewalls NETASQ SPNEGO

Transcription:

La sécurité des applications Web grâce à la cryptographie Pendant le développement d applications PHP, vous vous êtes probablement retrouvé dans des situations dans lesquelles vous deviez élever le niveau de sécurité. Imaginez, par exemple, que deux applications PHP échangent des données, que chacune d entre elles doit s assurer que l autre est correctement identifiée et que les données échangées ne sont connues que d elles seules. Seuls des techniques robustes de cryptographie peuvent y parvenir, et je vous recommande OpenSSL et PHP pour cela. Par Carlos Serrão Chaque jour, les applications Web deviennent de plus en plus complexes. La tendance actuelle est de remplacer la plupart des applications de bureau que nous utilisons actuellement par leur équivalent Web. Cela implique de nouveaux besoin en matière de sécurité, notamment en ce qui concerne l interaction entre les différents clients de telles applications et pour les applications elles-mêmes. Il faut en particulier des mécanismes robustes d identification, des signatures numériques et une cryptographie à clé publique. Il existe d autres méthodes pour introduire la cryptographie à clé publique dans un environnement de production PHP, soit par le biais d extensions PHP personnalisées qui ajoutent cette fonctionnalité à PHP lui-même, soit par le biais de l utilisation de l extension de GPG (GNUPG). Le moyen probablement le plus efficace d introduire la cryptographie dans vos applications PHP consiste à utiliser l extension OpenSSL. Dans cet article, j utilise l extension OpenSSL pour PHP et je vous montre comment tirer pleinement avantage de cette extension afin de fournir à vos applications PHP les fonctionnalités suivantes : création de certificats X509 utilisation de certificats X509 pour chiffrer et déchiffrer des données grâce à un mécanisme à clé publique utilisation de la cryptographie à clé publique pour signer numériquement des données utilisation de certificats X509 pour vérifier des données signées numériquement Mais avant de commencer, voici quelques informations simples et fondamentales concernant les techniques de cryptographie, notamment celles à clé publique. Quelques mots au sujet de la cryptographie Le processus de transformation d informations claires (texte simple) en quelque chose qui ait un sens pour l auteur des informations et pour ceux à qui elles sont destinées (texte chiffré) s appelle le chiffrement. Pour y parvenir, le moyen le plus simple est d utiliser le remplacement de texte :

// technique de chiffrement for($n = 0; $n < strlen($plaintext); $n++) { $ciphertext.= chr(ord($plaintext[$n]) + $key); // technique de déchiffrement for($n = 0; $n < strlen($ciphertext); $n++) { $result.= chr(ord($ciphertext[$n]) - $key); Dans cet exemple, nous parcourons simplement les données du texte clair et effectuons un simple remplacement de texte en fonction de la valeur qui a été attribuée à une clé. Ensuite, le processus inverse est effectué avec la même clé pour obtenir la valeur d origine. Cela se nomme le chiffrement César, et il s agit de l une des techniques de chiffrement les plus simples et les plus connues. Il s agit d un type de chiffrement par substitution, dans lequel chaque lettre du texte clair est remplacée par une lettre qui se trouve à un endroit déterminé plus loin dans l alphabet. Ce procédé est très simple, mais il n offre quasiment pas de sécurité aux informations que vous aimeriez masquer. L une des caractéristiques les plus importantes en matière de bon algorithme de cryptographie concerne l entropie des données. Ce premier exemple ne se repose pas sur des informations aléatoires : les mêmes caractères sont toujours remplacés de la même manière, et une analyse statistique du texte chiffré peut suffire à un intrus pour déchiffrer les informations. Une autre caractéristique importante en matière de bon algorithme de cryptographie concerne la clé. Dans le cas que nous venons de voir, la clé est extrêmement simple à trouver et à craquer, c està-dire deviner. Reportez-vous à la figure 1 pour en comprendre les raisons. La cryptographie moderne repose sur des processus mathématiques plus avancés afin d implanter des mécanismes cryptographiques robustes. Ils fonctionnent généralement au niveau binaire et effectuent des substitutions, des déplacements et des permutations des informations d origine, en fonction d une clé cryptographique établie. Les deux types de cryptographie les plus couramment utilisés sont : la cryptographie à clé secrète et la cryptographie à clé publique. La différence fondamentale entre celles-ci réside dans le fait que, dans le premier cas, une seule clé secrète est utilisée pour chiffrer et déchiffrer les informations, tandis que dans le second cas, une paire de clés est utilisée. L une permet de chiffrer les informations, l autre de les déchiffrer. Avec la cryptographie à clé secrète, telle qu illustrée à la figure 2, l expéditeur, Alice, et Figure 1 Figure 2 Figure 3 le destinataire, Bob, doivent tous deux partager la même clé, car elle permettra à la fois de chiffrer et de déchiffrer les données. Si Alice veut envoyer des informations privées à Bob, elle devra créer et utiliser une clé pour chiffrer les données et l envoyer à Bob. Bob utilise alors la même clé qu Alice a utilisé pour déchiffrer les données. Cela soulève un important problème : comment cette clé secrète est-elle créée et transmise de manière sécurisée à la fois à Alice et à Bob, sans être interceptée par une tierce personne? La réponse à cette question est simple : il faut utiliser la cryptographie à clé publique pour distribuer la clé secrète! En réalité, l utilisation de la cryptographie à clé publique permet à Alice et à Bob d avoir une paire de clés : une clé publique qui peut être librement distribuée à n importe qui, et une clé privée qui doit être gardée et enregistrée de manière appropriée afin d éviter qu elle ne soit divulguée. Les clés dans cette paire de clés sont toutes deux liées mathématiquement, mais il est impossible de déduire la clé privée à partir de la clé publique, et vice versa. Ce qui est chiffré avec l une des clés ne peut être déchiffré qu en utilisant la paire correspondante. Dans ce scénario, si Alice veut envoyer des informations sécurisées à Bob, elle doit chiffrer ces informations en utilisant la clé publique de Bob. Quand Bob reçoit le message, il utilise sa clé privée pour déchiffrer les informations et obtenir des données claires. Comme

le présente la figure 3, dans ce scénario, il n est pas nécessaire de changer le même clé secrète. Par la suite, nous allons voir comment utiliser ces mécanismes cryptographiques dans PHP afin de développer des applications mieux sécurisées. Utilisation de la cryptographie à clé secrète avec PHP Le meilleur moyen d utiliser la cryptographie à clé secrète dans des applications PHP consiste à utiliser l extension mcrypt. Mcrypt offre aux développeurs une fonctionnalité qui leur permet de chiffrer et de déchiffrer des données en utilisant des algorithmes à clé secrète. Une alternative consiste à programmer directement l algorithme cryptographique à clé secrète dans PHP. Néanmoins, cette alternative est toujours défavorable aux développeurs, car leur implantation peut contenir des failles de sécurité et ils risquent très certainement de rencontrer des problèmes de performances. Par conséquent, et par précaution, utilisez mcrypt. Mcrypt donne aux développeurs PHP le choix entre plusieurs algorithmes cryptographiques à clé secrète. Il y a encore peu de temps, la norme de chiffrement des données (DES, Data Encryption Standard) était l algorithme le plus courant pour effectuer une cryptographie à clé secrète ; néanmoins, cette norme a été remplacée par la norme de chiffrement avancée des données (AES/Rijndael, Advanced Encryption Standard) en raison de sa robustesse. Nous utiliserons donc, dans les exemples suivants, AES comme algorithme cryptographique. La première chose à faire est de s assurer que l extension elle-même est correctement installée et configurée pour fonctionner sur votre système. Ce procédé dépend du serveur sur lequel PHP a été déployé. S il s agit d une machine Windows, vous devrez vous assurer que la ligne extension=php_ mcrypt.dll n est pas commentée dans le fichier php. ini. Dans un système Linux, vous devrez vous assurer que PHP est compilé avec l option --with-mcrypt. En réalité, deux opérations peuvent être effectuées avec l extension mcrypt : le chiffrage et le déchiffrage des données. Pour ces deux procédés de base, il suffit d utiliser les fonctions suivantes : mcrypt_cbc(), mcrypt_ecb(), mcrypt_cfb() et mcrypt_ofb(). Les différents noms des fonctions font référence à leurs différents modes de fonctionnement. Néanmoins, l explication en détail de leurs mécanismes ne fait pas est l objet de cet article. CBC :Enchaînements de blocs ; ECB :Dictionnaire de codes ; CFB :Chiffrement à rétroaction ; OFB :Chiffrement à rétroaction de sortie. Les fonctions mcrypt_* prennent les deux paramètres suivants : Le nom de l algorithme à utiliser. Dans notre cas, nous utiliserons l algorithme AES/Rijndael. Trois valeurs valides sont alors possibles : MCRYPT_RIJNDAEL_128, MCRYPT_ RIJNDAEL_192 ou MCRYPT_RIJNDAEL_256. Les chiffres de la chaîne représentent la taille de la clé en nombre de bits. Par exemple, si vous utilisez MCRYPT_RIJNDAEL_128, il est conseillé d utiliser une taille de clé de 128 bits. La clé, c est-à-dire une chaîne qui contient la clé avec la taille qui a été spécifiée précédemment Les données à chiffrer ou à déchiffrer L opération à effectuer. Il peut supposer l une des deux valeurs : MCRYPT_ENCRYPT ou MCRYPT_DECRYPT Le motif d initialisation (IV, Initialization Vector). Il s agit d une chaîne qui contient un bloc de bits requis pour permettre l exécution d un flux ou d un chiffrement par blocs dans l un des différents modes d opération. Il rend possible l existence d un flux unique, indépendant des autres flux produits par la même clé de chiffrement, sans avoir à passer par un nouveau processus de création de clé. Dans l exemple suivant, nous allons construire une classe en utilisant les nouvelles caractéristiques orientées objet de PHP 5 afin de maîtriser le chiffrage et le déchiffrage avec AES/Rijndael. Cette classe, appelée «AES», définit deux méthodes de base : encrypt() et decrypt() pour maîtriser les opérations cryptographiques. Avant procéder à ces deux opérations, le constructeur de la classe doit être invoqué pour construire un objet «AES». Le constructeur doit recevoir les paramètres suivants : La «clé», qui doit être soit de 128, soit de 192, soit de 256 bits. En d autres termes, il doit s agir d une chaîne de 16, 24 ou 32 caractères «IV», le motif d initialisation, qui est de 128 bits et par conséquent une chaîne de 16 caractères

Le «mode de chiffrement», chaîne qui contient inquiétez pas, cela est une bonne chose! Maintenant soit CBC, ECB, CFB ou OFB que nous avons chiffré les données, déchiffrons-les. Un exemple d utilisation : $aes = new AES( 0123456789ABCDEF, 1111111111111111, CBC ); Cela initialisera l objet «AES» avec une clé de 128 bits (0123456789ABCDEF), et un IV de 128 bits (1111111111111111) qui utilise le mode de chiffrement «CBC». La classe que nous avons définie pour contrôler le chiffrement AES est également protégée grâce à un contrôle des erreurs, tel que la gestion des exceptions, et le code doit donc être mis à l intérieur d une assertion try et catch : try { $aes = new AES( 0123456789ABCDEF, 1111111111111111, CBC ); catch (AESException $e) { echo $e; Chiffrement des données avec une clé secrète Maintenant que nous avons créé notre objet «AES», nous pouvons commencer à chiffrer et à déchiffrer les données grâce à cet objet. Pour chiffrer les données, nous pouvons définir une fonction qui effectuera l opération à l intérieur de la classe «AES». Cette fonction contient, outre le code qui procéde à la validation, le code spécifique pour invoquer les fonctions mcrypt : mcrypt_cbc($alg, $this->key, $data_to_encrypt, MCRYPT_ENCRYPT, $this->iv); Vous aurez peut-être remarqué que lorsque l on invoque cette fonction à l intérieur de la classe «AES», on suppose que le constructeur a déjà été appelé et que la clé, le motif d initialisation IV et le mode de chiffrement possèdent des valeurs valides. Une fois cela en place, nous pouvons directement invoquer la méthode encrypt() dans la classe AES, comme suit : try { $aes = new AES( 0123456789ABCDEF, 1111111111111111, CBC ); $cipherdata = $aes->encrypt( Ceci est une valeur secrète ); echo $cipherdata; catch (AESException $e) { echo $e; Le résultat de ce script doit être assez illisible. Ne vous Déchiffrement des données avec une clé secrète Pour déchiffrer les données, il suffit d effectuer l opération inverse. À nouveau, il suffit de se concentrer sur la partie spécifique à mcrypt, et ignorer toutes les validations que la méthode de la classe applique. mcrypt_cbc($alg, $this->key, $data_to_decrypt, MCRYPT_DECRYPT, $this->iv); Comme vous l avez peut-être déjà remarqué, la seule différence entre cette ligne et celle que j ai présentée précédemment porte sur la macro MCRYPT_ DECRYPT. Cette macro indique que les données doivent être déchiffrées. Nous pouvons donc revenir à notre code et déchiffrer les données précédemment chiffrées. Vous devriez obtenir quelque chose ressemblant à : try { $aes = new AES( 0123456789ABCDEF, 1111111111111111, CBC ); $cipherdata = $aes->encrypt( This is a secret value ); echo $cipherdata; $plaindata = $aes->decrypt($cipherdata); echo $plaindata; catch (AESException $e) { echo $e; Le résultat de l exécution de ce script devrait permettre la récupération des données d origine à partir du texte chiffré. Dans cet exemple, nous n avons fait que chiffrer et déchiffrer les données à l intérieur du même script PHP, sur le même ordinateur hôte, mais la même technique pourrait s appliquer dans un scénario clientserveur à distance. Néanmoins, dans ce cas, vous devrez prendre en considération le partage de la clé entre le client et le serveur, sans la compromettre. Utilisation de la cryptographie à clé publique dans PHP Comme je l ai mentionné précédemment, la cryptographie à clé secrète pose un problème qui doit être résolu : celui de la distribution de la clé secrète. Un moyen de surmonter ce problème consiste à utiliser la cryptographie à clé publique. Toutefois, la cryptographie à clé publique souffre également d un problème de confiance. Je vous explique. Lorsque vous essayez d envoyer des informations privées à une autre personne en utilisant le chiffrement à clé publique, vous devez, d une manière ou d une autre, obtenir la clé publique de cette personne afin

de pouvoir chiffrer les données. La question est : comment savoir si la clé que vous utiliserez provient réellement de la personne à laquelle vous voulez envoyer vos données ou d une autre personne qui essaie d usurper son identité? Soit vous connaissez l autre personne personnellement, et alors elle vous donne sa clé publique «en mains propres», soit vous n avez pas de moyen sécurisé pour y parvenir. Il existe heureusement un moyen de surmonter ce problème : les certificats numériques. Il s agit d un ensemble d octets qui affirme que la clé qu ils transportent est réellement la clé du propriétaire. Les certificats numériques rassemblent généralement des informations sur le monde réel avec la clé publique. Ils sont délivrés par des agents de certification : Certification Authorities (CA). Un CA est tout simplement une entité tierce, de confiance, qui valide les clés publiques et qui délivre les certificats numériques, qui contiennent ces clés. Le format le plus courant pour un certificat numérique est X509. Dans un scénario de la vie réelle, vous n iriez jamais demander une clé publique à l entité à laquelle vous essayez d envoyer des informations privées. Vous lui demanderiez leur certificat numérique. C est exactement ce que nous allons faire quand nous utiliserons la cryptographie à clé publique. Dans le monde à code ouvert, OpenSSL est le principal fournisseur de cryptographie à clé publique. OpenSSL (http://www.openssl.org) est utilisé pour fournir au serveur HTTP d Apache les certificats numériques nécessaires pour utiliser le protocole SSL. PHP possède également une extension qui peut tirer parti des fonctionnalités de OpenSSL. Afin de pouvoir utiliser OpenSSL à l intérieur de vos scripts PHP scripts, vous devrez vous assurer que l extension OpenSSL n est pas commentée dans votre fichier de configuration php.ini. Dans le cas de Windows, il s agit de extension=php_openssl.dll, et dans le cas de Linux, vous aurez besoin de compiler votre installation PHP avec l option de configuration --with-openssl. Pour les utilisateurs de Windows, le fichier libeay32. Une clé exportée -----BEGIN RSA PRIVATE KEY----- MIIEpAIBAAKCAQEAnyyxVSvESCZktTF/oDH0sywCS1bBICSBx1H3gODCCXmihCig CIuZM/XSsfTaXYbvLJ2OrLkJ6GSPJSA/izz3jaioWtebHOu+DovUOpWQvh9qdXSw... ympnrkjmhjkugjn7/3yzhdu3l0kyfmgazfj+1y3ne+psej+gyulexp2vcbfpl1o7 60mCuaizGIZYScdqJF5jrD41GTP9BOzVii42ktcG8MmfGtrcZAGfsg== -----END RSA PRIVATE KEY----- dll doit être copié dans le répertoire system32 de Windows. À nouveau pour Windows, si vous avez l intention d utiliser la génération de clés ou des fonctions de signatures de certificats, vous devrez installer un fichier openssl.cnf valide sur votre système. L extension OpenSSL de PHP recherche ces fichiers dans les répertoires configurés par les variables d environnement OPENSSL_CONF et SSLEAY_CONF. Si l un d entre eux n est pas configuré, vous devrez spécifier l emplacement du fichier manuellement dans vos propres scripts. Ce fichier doit exister sur le système. Généralement, il y a un fichier openssl.cnf qui se trouve dans votre répertoire d installation PHP, c est-à-dire PHP_DIR, dans PHP_DIR /extras/openssl. Création d une paire de clés Lorsque vous utilisez la cryptographie à clé publique, l une des opérations les plus communes consiste à créer une paire de clés. Une paire de clés est un ensemble de bits qui représentent à la fois les clés publique et privée d un sujet. Les clés de cette paire sont liées mathématiquement, mais il est impossible de dériver une clé privée à partir de la clé publique, et vice-versa.= Pour créer une paire de clés avec l extension OpenSSL de PHP, il faut appeler la fonction nommée openssl_pkey_new(). Cette fonction crée une paire de clés, grâce à un ensemble de paramètres de configuration spécifiés par l utilisateur : <?php /* cree une nouvelle paire de clé */ $CONFIGURATION[ configargs ] = array( config => C:\wamp\php\extras\openssl\openssl. cnf, private_key_bits => 2048 ); $keypair = openssl_pkey_new($configuration[ con figargs ]); var_dump($keypair);?> La paire de clés qui en résulte, et dont la taille est de 2048 bits, est enregistrée dans une variable, qui pourra être utilisée pour effectuer des opérations de cryptographie. Il est nécessaire d avoir une version imprimable de la paire de clés dont nous aurons besoin pour exporter les clés. Pour ce faire, il faut utiliser la fonction openssl_pkey_export() : openssl_pkey_export($keypair, $mykey, null, $CO NFIGURATION[ configargs ]); Cette fonction reçoit la paire de clés précédemment créée et l exporte dans $mykey dans un format imprimable. Il est éventuellement possible de protéger ces informations par un mot de passe. Le résultat ressemble à l encadré ci-contre.

Il est également possible d exporter la paire de clés vers un fichier, afin de pouvoir les transporter ou pour une utilisation ultérieure. Pour cela, il faut utiliser la fonction openssl_pkey_export_to_file() : openssl_pkey_export_to_file($keypair, pem, null, $CONFIGURATION[ configargs ]); mykey. ); /* Création d une requête de certification de signature */ $csr = openssl_csr_new($dndata, $keypair, $CONF IGURATION[ configargs ]); /* signature du CSR (auto-certification) */ $x509certificate = openssl_csr_sign($csr, null, $keypair, 365, $CONFIGURATION[ configargs ]); Il en résulte que la paire de clés est exportée vers un fichier appelé mykey.pem. De la même manière qu il est possible d exporter une paire de clés vers un fichier, il est également possible d importer une paire de clés à partir d un fichier. Voici comment y parvenir : <?php /* chargement d une paire de clé depuis un fichier */ $fp = fopen( mykey.pem, r ); $skey = fread($fp, 10000); fclose ($fp); $keypair = openssl_pkey_get_private($skey); var_dump($keypair);?> La gestion des certificats numériques Maintenant que nous avons appris à créer, à exporter et à importer des paires de clés, nous possédons suffisamment de notions pour commencer à chiffrer et à déchiffrer ces informations grâce à la cryptographie à clé publique. Lors de l utilisation de OpenSSL, il est nécessaire d utiliser un mécanisme qui affirmera que la clé publique provient réellement de l expéditeur d origine. Ce mécanisme, comme je l ai mentionné précédemment, est un certificat numérique X509. Généralement, les certificats sont créés par des agents de certification, mais comme nos clés publiques ne seront pas certifiées par de telles agents, nous utiliserons un mécanisme appelé l auto-certification. L auto-certification vous permet de publier vos propres certificats numériques et de les certifier vous-même. Cela a peu de valeur dans une situation réelle, peut-être parce que personne ne vous fait confiance, mais elle sera parfaite pour notre scénario de test et de démonstration. /* Quelques données d identifications pour le certificat */ $dndata = array( countryname => PT, stateorprovincename => Lisboa, localityname => Lisboa, organizationname => ISCTE, organizationalunitname => ADETTI, commonname => Carlos Serrao, emailaddress => carlos.serrao@iscte.pt Le processus pour créer un certificat X509 est extrêmement simple avec OpenSSL. La première chose à faire est de créer un CSR. Un CSR, ou requête de signatures de certificats (Certificate Signing Request en anglais) est un document numérique qui contient des informations concernant le sujet qui requiert la certification. Pour le CSR, il est important de régler le DN (Distinguished Name, nom distinctif) du sujet. Le DN contient plusieurs attributs, dont les plus courantes sont : countryname ou pays, stateorprovincename ou province, localityname ou ville, organizationname ou nom d entreprise, organizationalunitname ou département, commonname ou nom et emailaddress ou adresse courriel. Pour créer le CSR, il faut utiliser la fonction openssl_ csr_new() ainsi que les données du DN et la paire de clés. Toutes ces données seront rassemblées et un CSR X509 sera préparé. /* creation d une nouvelle requête de certificat */ $csr = openssl_csr_new($dndata, $keypair, $CONFI GURATION[ configargs ]); Une fois le CSR compilé, il doit être signé, soit par vous-même, soit par un agent de certification. Dans ce cas, nous signerons nous-mêmes le CSR. Pour cela, nous utilisons openssl_csr_sign(). Cette fonction reçoit le CSR généré précédemment, le certificat de signature, qui dans notre cas, est NULL, car il a été auto-signé, la paire de clés et le nombre de jours pendant lequel le certificat sera valide. Il en résulte un certificat X509 auto-signé. /* auto-certification du CSR */ $x509certificate = openssl_csr_sign($csr, null, $keypair, 365, $CONFIGURATION[ configargs ]); Il est impossible d exporter et d analyser un certificat X509. Pour exporter un objet du certificat X509 vers une chaîne, vous pouvez utiliser la fonction openssl_ x509_export() : <?php openssl_x509_export($x509certificate, $sx509);

echo $sx509; Les dossiers nexen.net Pour analyser un certificat X509 vers une chaîne, il y a la fonction openssl_x509_parse(), qui convertit un objet X509 en tableau. Il est ensuite possible d imprimer le contenu du certificat : /* analyse du certificat et affichage */ print_r(openssl_x509_parse($x509certificate)); extraire la clé publique d un certificat X509, il existe une fonction qui porte le nom de openssl_pkey_get_ public(). L unique argument vers cette fonction est un certificat X509 sous la forme d une chaîne : openssl_x509_export($x509certificate, $sx509); $cleardata = Test string. $publickey = openssl_pkey_get_public($sx509); openssl_public_encrypt($cleardata, $cipherdata, $publickey); echo CIPHERDATA =.$cipherdata; De même qu avec les paires de clés, il est possible d exporter à la fois un certificat X509 vers un fichier et d en importer un à partir d un fichier. L exportation vers un fichier est simple si l on utilise openssl_x509_ export_to_file(): /* exporter le certificat vers un fichier */ openssl_x509_export_to_file($x509certificate, mycert.pem ); Il en résulte un certificat numérique qui est enregistré dans le fichier appelé mycert.pem. Pour importer un certificat à partir d un fichier, il convient de suivre la procédure suivante : /* lit un certificat dans un fichier et l importe */ $fp = fopen( mycert.pem, r ); $mycert = fread($fp, 15000); fclose ($fp); $x509mycert = openssl_x509_read($mycert); La fonction openssl_x509_read() permet d importer le certificat vers un objet X509. Ainsi, vous serez en mesure de créer vos propres clés et vos propres certificats et les utiliser sur vos applications. Chiffrement et déchiffrement des données avec une clé publique Les fonctions de OpenSSL permettent à l utilisateur de chiffrer et de déchiffrer, soit à l aide de clés publiques, soit à l aide de clés privées. Il suffit de vous rappeler que ce qui a été signé avec une clé publique ne pourra être déchiffré qu avec la clé privée correspondante, et vice versa. N oubliez pas également qu il n est pas conseillé d utiliser la clé privée pour chiffrer vos données si vous souhaitez garantir leur protection. En effet, tous ceux qui sont en possession de votre clé publique sont également capables de déchiffrer n importe quelle donnée chiffrée par la clé privée. Par conséquent, il faut utiliser le certificat X509 pour extraire la clé publique du destinataire et utiliser cette clé lors de l envoi de données critiques à l expéditeur. Pour Une fois la clé publique obtenue à partir du certificat, il est possible d utiliser openssl_public_encrypt() pour chiffrer les données. Ces données sont alors verrouillées avec la clé publique du destinataire et ne pourront être ouvertes qu en utilisant la clé privée correspondante. La personne qui recevra ces données chiffrées devra posséder la clé privée afin de déchiffrer les données et d obtenir les informations d origine : $privatekey = openssl_pkey_get_ private($keypair); openssl_private_decrypt($cipherdata, $newtext, $privatekey); echo DECIPHER =.$newtext; Pour obtenir la clé privée, il faut utiliser la fonction openssl_pkey_get_private(). openssl_private_ decrypt() est invoquée pour effectuer le déchiffrage et obtenir les informations d origine. Cet exemple fonctionne pour des petits blocs de données, comme pour les simples messages que j ai montrés. Si le bloc de données à chiffrer est plus grand, quelques astuces permettent d appliquer le remplissage : // supprime 11 octets a cause du complément $maxlength = (1024 - (11*8))/8; $cipherdata = ; while($cleardata){ $input = substr($cleardata, 0, $maxlength); $cleardata = substr($cleardata, $maxlength); if (openssl_public_encrypt($input, $encrypted, $publickey)==false) { break; $cipherdata.= $encrypted; echo CIPHERDATA =.$cipherdata; $maxlength = 1024/8; $newptext = ; while($cipherdata){ $input = substr($cipherdata, 0, $maxlength); $cipherdata = substr($cipherdata, $maxlength); if (openssl_private_decrypt($input, $out, $privatekey) == false) { break; $newptext.= $out;

echo DATA =.$newptext; Les dossiers nexen.net Comme vous l aurez peut-être remarqué, ce que nous faisons en réalité consiste à diviser les différents blocs de données en des fragments de 1024 bits. Cela s explique par le fait que nous utilisons la clé à 1024 bits. Avec une clé plus grande, la taille du bloc sera aussi plus grande. Cela conclut cette section concernant le chiffrement et le déchiffrement à clé publique. Passons maintenant à un autre sujet important concernant la sécurité : les signatures numériques. Signature et vérification des données avec une clé publique Tout d abord, il est important que vous sachiez ce qu est une signature numérique et ce pour quoi elle est utilisée. En termes génériques, une signature numérique est utilisée pour garantir à quelqu un que les données que vous avez créées ou envoyées sont exactes et qu elles n ont pas été trafiquées. Elle est généralement utilisée pour garantir l identité et l intégrité à une tierce partie. En termes techniques, une signature numérique est constituée d une valeur de hachage générée à partir des informations qui sont signées et chiffrées avec la clé publique de l expéditeur. Comme vous l aurez peut-être remarqué, les signatures numériques ne garantissent pas la confidentialité, car toute personne ayant accès à la clé publique de l expéditeur peut déchiffrer le message. Ce n est pas un problème. PHP et OpenSSL proposent les mécanismes nécessaires pour gérer les signatures numériques. Deux procédés de base sont à retenir : la génération des signatures numériques et la vérification des signatures numériques. Si vous observez la figure 4, vous pourrez observer comment ces algorithmes fonctionnent. Pour générer une signature numérique à partir d un message, une valeur de hachage est calculée à partir du message et chiffrée avec la clé publique de l expéditeur : il s agit de la signature numérique. Le destinataire reçoit le message et calcule également une valeur de hachage à partir du message d origine. Ensuite, en utilisant la clé publique de l expéditeur, le destinataire déchiffre le hachage d origine envoyé et le compare avec les nouveaux hachages générés. S ils correspondent, la signature numérique est vérifiée. Le cas échéant, soit la signature numérique a été contrefaite, soit altérée pendant le processus. Dans l extension OpenSSL de PHP, deux fonctions permettent de signer et de vérifier les signatures numériques : openssl_sign() et openssl_verify(). $data2sign = Une information à signer!!! ; $pkey = openssl_pkey_get_private($keypair, null); $signature = null; openssl_sign($data2sign, $signature, $pkey, OPENSSL_ALGO_SHA1); echo $signature; openssl_sign() reçoit les données à signer, la Figure 4

clé privée de l expéditeur et une identification de l algorithme de signature à utiliser. Dans ce cas spécifique, OPENSSL_ALGO_SHA1 signifie que l algorithme de hachage SHA1 sera utilisé dans le processus de génération de la signature numérique. openssl_x509_export($x509certificate, $sx509); $pubkey = openssl_pkey_get_public($sx509); if (openssl_verify($data2sign, $signature, $pubkey) == true) { echo Signature valide ; else { echo Signature erronnée ; Pour vérifier la signature numérique précédemment générée, utilisez openssl_verify(). Cette fonction accepte les données d origine, la signature et la clé publique de l expéditeur. Si la signature est valide, la fonction retourne TRUE. Remarques finales Je l ai déjà dit, mais je le répète : n essayez pas d inventer votre propre algorithme cryptographique. La plupart des algorithmes de sécurité «faits maison» sont simples à casser grâce à l analyse cryptographique. Il est vraiment beaucoup plus sûr d utiliser un algorithme bien établi et testé, comme ce que j ai présenté dans cet article, plutôt que d utiliser votre propre algorithme, même si vous pensez qu il est extrêmement sûr. N allez pas non plus vous imaginer que vous êtes en sécurité simplement parce que vous utilisez l un des algorithmes que j ai décrit! La plupart du temps, les failles sécuritaires proviennent du fait que l application a été mal conçue, et même si vous utilisez une bonne cryptographie, si vous ne vous occupez pas de la gestion et/ou de l enregistrement des clés, vous rencontrerez encore de sérieux problèmes. N oubliez pas que toute application Web n est seulement aussi sûre que son lien le plus faible. Par conséquent, cela n a pas d importance si vous développez un module de cryptographie complexe, si certaines autres parties de l application ne sont pas sécurisés. Février 2007 10 www.nexen.net