cryptographie en php

7
Cryptographie en PHP LukaszLach,Michal Stanowski Niveaude difficulté : o Voussavez probablement tous en quoi consiste la cryptographie. Vousdisposez d'une information (parexemple texte) et vous fa chiffrez de sorte qu'unepersonne non autorisée ne puissepas le lire.Vousvoyezla cryptographie tous les jours : en utilisant une banque lnternet ou en envoyant un courriel chiffré. Toutcelaest possible avec PHP. ikipedia définit la cryptograPhie comme une discipline de cryP- tologie, s'attachant à protéger des messages. Son objectif consiste à chiffrer les informations. En pratique, il s'agit de convertir une information en une autreà I'aide des calculs mathématiques complexes (chiffrement) et de convertir éventuellement cette information en son état initial (déchiffrement). C'est un do- mainesouvent présent dans le contexte des applications Internet, aussi biendans les petits services que les grands services commerciaux ; lors de la connexion à une banque Internet, les données saisies sont envoyées via une connexion SSL sécu- risée, chiffréeet lorsquevous envoyez des courriels confidentiels, vous utilisez le système PGP qui protège le contenu contre lestierces personnes. PHP contient de nombreuses fonc- tions,permettant de chiffrer et de générer les fonctions de hachagede n'importe quelle chaîne de caractères ou de con- tenu de fichiers. Une partie d'entre elles est disponible nativement maisla plupart sontutilisées à I'aide d'une extension ex- térieure, jointe à PHP.Nous montrerons dans cet article comment utiliserces fonctionsde manière efficace sur trois exemples pratiques. Système de connexion sécurisée Dans un premier temps, créez un système de connexion sécurisée. C'est un exemple Ce qu'il faut savoir... ll sera utilede connaître des basesde la cryptographie et de PHP. Cet articleexplique... Vous apprendrez comment créer un système sécurisé de connexionet une apptication pour stocker et chiffrer les fichiers sur un serveur Web. Nous pré- senterons les meilleures solutions les plus populaires de cryptographie en PHP sur ces exemples. Auteur Lukasz Lach étudie l'informatiqueà la faculté de Cybemétique de l'Académie Militaire de Technologie à Varsovie. Depuis plusieurs années, il crée des applications lntemet à faide des techno- logies,comme PHn XHTML, JavaSciPt et XML. ll a le certificat Zend Ceftified Engineer. Il a écit et publié plusieurs afticlesde presses dans /es magazines polonaiset étrangers. lls concement la création des applications lntemet et la prcgrammafibn sécunsée en PHP. Michal Stanowski esf caPable de programmer des applications orientées objets en PHPS de manièrc avancée. ll s'rhféresse à la sécurité des applications lntemetet leur utilité. llpasse son femps libre à visiter la Pologne à vélo. www.phpsolmag.org PHP Solutions N'4/2006

description

PHP SOLUTIONS

Transcript of cryptographie en php

Page 1: cryptographie en php

Cryptographie en PHPLukasz Lach, Michal Stanowski

Niveau de diff iculté : o

Vous savez probablement tous en quoiconsiste la cryptographie. Vous disposezd'une information (par exemple texte) et vousfa chiffrez de sorte qu'une personne nonautorisée ne puisse pas le lire. Vous voyez lacryptographie tous les jours : en uti l isant unebanque lnternet ou en envoyant un courrielchiffré. Tout cela est possible avec PHP.

ikipedia définit la cryptograPhiecomme une discipline de cryP-tologie, s'attachant à protéger

des messages. Son objectif consisteà chiffrer les informations. En pratique, il

s'agit de convertir une information en une

autre à I'aide des calculs mathématiquescomplexes (chiffrement) et de convertiréventuellement cette information en son

état initial (déchiffrement). C'est un do-

maine souvent présent dans le contextedes applications Internet, aussi bien dans

les petits services que les grands services

commerciaux ; lors de la connexion à une

banque Internet, les données saisies sont

envoyées via une connexion SSL sécu-risée, chiffrée et lorsque vous envoyezdes courriels confidentiels, vous utilisezle système PGP qui protège le contenucontre les tierces personnes.

PHP contient de nombreuses fonc-

tions, permettant de chiffrer et de générer

les fonctions de hachage de n'importequelle chaîne de caractères ou de con-

tenu de fichiers. Une partie d'entre elles

est disponible nativement mais la plupart

sont utilisées à I'aide d'une extension ex-

térieure, jointe à PHP. Nous montreronsdans cet article comment utiliser cesfonctions de manière efficace sur trois

exemples pratiques.

Systèmede connexion sécuriséeDans un premier temps, créez un systèmede connexion sécurisée. C'est un exemple

Ce qu' i l faut savoir. . .ll sera utile de connaître des bases de lacryptographie et de PHP.

Cet art icle expl ique...Vous apprendrez comment créer unsystème sécurisé de connexion et uneapptication pour stocker et chiffrer lesfichiers sur un serveur Web. Nous pré-senterons les meilleures solutions lesplus populaires de cryptographie en PHPsur ces exemples.

AuteurLukasz Lach étudie l'informatique à lafaculté de Cybemétique de l'AcadémieMilitaire de Technologie à Varsovie.Depuis plusieurs années, il crée desapplications lntemet à faide des techno-logies, comme PHn XHTML, JavaSciPtet XML. ll a le certificat Zend CeftifiedEngineer. Il a écit et publié plusieursafticles de presses dans /es magazinespolonais et étrangers. lls concement lacréation des applications lntemet et laprcgrammafibn sécunsée en PHP.

Michal Stanowski esf caPable deprogrammer des applications orientéesobjets en PHPS de manièrc avancée. lls'rhféresse à la sécurité des applicationslntemet et leur utilité. llpasse son fempslibre à visiter la Pologne à vélo.

www.phpsolmag.org PHP Solutions N'4/2006

Page 2: cryptographie en php

parfait d'utilisation de fonctions crypto-graphiques disponibles en PHP. Dans ce

système sécurisé, le mot de passe saisipar I'utilisateur sera envoyé sous forme

chiffrée deux fois : la première fois via I'al-gorithme MDS et ensuite via HMAC-MDS.

La valeur envoyée sera correcte une

seule fois car la clé publique, nécessaire

dans le processus de chiffrement, sera

unique à chaque fois - créé dynamique-ment du coté du serveur.

Ce système s'avère très utile lorsque

de I'algorithme MDS. HMAC-MDS est une

extension de la fonction de hachage MD5

hachage dumot de passe

CLIENTmot de passe -[ffi]

rrrur uE' P"ùùnLl u À r ^ r ._[rnÂ

. clé

rque

SER\

hachagde pasrcombinla clé p

de

rithmes supplémentaires pour les utiliser

dans vos projets.

hachage du motde passe,combinée avecla clé publique

Dans ce système, nous admet-

tons que le mot de Passe envoYé ParI'utilisateur sous forme de HMAC-MDSne sera vrai qu'une seule fois. Si vous

ouvrez ou générez de nouveau la page,

une nouvelle clé sera générée et donc,

le hachage créé aura une autre valeur.

Qu'est-ce que cela vous donne ? Même si

une tierce perSonne écoute les données,les informations ainsi obtenues lui seront

complètement inutiles. Concentrez-vousdans un premier temps sur la partie HTML

du code source, présent dans le Listing 2.

Dans les premières lignes du script, vous

ajouterez le fichier du langage JavaScriptappefé md1is, contenant deux fonctions

cléS : n"*-*ds et hex-hmac-mds ; elles sont

équivalentes aux fonctions md5 êt hmac-

mas, disponibles du coté du script PHP. Le

code source de la fonction parseForm sê

trouve ci{essous. Elle est appelée avant

d'envoyer le formulaire. Ce formulaire se

trouve dans la partie body du document et

contient quatre champs importants :

key - champ du tYPe hidden conte-nant la clé unique, générée du côtédu serveur. Elle est utilisée à l'étape

de connexion par les versions HMAC

de la fonction de hachage,js - champ du type hidden dont la va-

leur détermine si le navigateur de l'uti-

lisateur supporte JavaScript. Sa valeurpar défaut s'élève à o (zéro), remplacépar r (un) avant I'envoi dans les der-nières lignes de la fonction dolosin,username - chamP du tYPe text, coî-tenant le nom d'utilisateur saisi,password - chamP du tYPe text, GoIl-tenant le mot de passe saisi.

Le rôle du champ js est très important:lorsque sa valeur est égale à 0, vous savez

publique

début dela connexion

vous n 'avez pas SSL sur le serveur et . ^ .^r-^ )^ t^-^t i^^^^^^^tA, , a, ,atÀmarlz

vous vourez envoyer des donné", "nit_

Figure 1" schéma de fonctionnement du système de connexion sécurtsêe

frées. Contrairement au système tradition- et permet d'ajouter une clé supplémentai-

nel de connexion, celui-là protège effica- re. La chaîne de caractères ainsi générée

cement les utilisateurs contre les attaques peut alors être envoyée au destinataire. Ce

du type sniffing, consistant à écouter les destinataire peut vérifier si la suite envoyée

informations échangées entre le client et est correcte à I'aide de cette clé secrète.

le serveur, ce qui permet en conséquence Dans le système de connexion dans cet

de récupérer le login d'utilisateur et le mot article, vous utiliserez I'algorithme HMAC

de passe saisis et de les utiliser pour se pour générer le hachage du mot de passe,

connecter. De plus, tous les mots de pas- en y ajoutant une clé aléatoire, générée

se seront stockés uniquement sous forme du côté du serveur. PHP n'est pas doté

de MDS et les personnes non autorisées de I'implémentation HMAC de I'algorithme

ne pounont pas les connaître (en admet- MDs. ll est donc nécessaire de la décrire

tant que les mots de passe comprennent en vous basant sur la documentation dis-

au moins 4 ou 5 caractères). L'encadré ponible (httpt/www.ietf.org/rfclrtc2104.ffi).

Atgorithmes et fonctions de hachage Le code source de la fonction r'mac md5 sê

contient les informations élémentaires trouve sur le Listing 1.

concernant les fonctions de hachage. La L'atout supplémentaire de I'implémen-

Figure 1 présente un schéma du système tation présentée réside dans le fait qu'elle

de connexion sécurisée. permet non seulement de générer le

Dans I'exemple de cet article, vous hachage HMAC-MDS mais aussi HMAC-

utiliserez également des versions HMAC SHAI ; vous disposez donc de deux algo-

nainagedirection-de calcul

énorme et est pratiquement impossible. Une caractéristique importante de la fonction de

hachage est que la modification d'au moins un caractère de la chaîne initiale, indépen-

encore modifiés.Malgré cela, les algorithmes de hachage disponibles nativement en PHP suffisent

pleinemént, indépendamment de la taille du projet créé. Les algorithmes tels que CRC32

et MDb sont courants et utilisés pour créer des sommes de contrôle de fichiers ou de

données confidentielles, qui doivent être accessible seulement sous forme permettant une

validation (par exemple d'un mot de passe). Le Tableau 1 contient les algorithmes disponi-

bles nativement en PHP et via I'extension MHASH.

PHP Solutions N'4/2006 www.phpsolmag.org

Page 3: cryptographie en php

que les données concemant le nom d,utili-sateur et le mot de passe seront envoyéessous forme visible. Malgré cela, vous êtestoujours capables de vous connecter sansproblèmes. Retournons au code source dela fonction analysée. Si le nom d'utilisateurou le mot de passe ne sont pas précisés,affichez un message adéquat et placezle curseur dans le champ vide. Sinon,modifiez le contenu du champ, contenantle mot de passe en hachage HMAC-MDSde MDS du mot de passe saisi et de la cléunique, disponible dans le champ rey. Deplus, paramétrez la valeur du champ 1sen 1 et autorisez I'envoi du formulaire enretournant la valeur true.

Observez à présent ce qui se passedu côté du serveur: le code completPHP de I'exemple décrit se trouve sur leListing 3. La fonction dolosin constitue lagrande partie du script; elle est chargéede vérifier le nom d'utilisateur et le motde passe. Si I'une de ces données n'estpas précisée, la valeur -1 est retournée.Ensuite, véifiez si la clé, envoyée du for-mulaire (champ rey), correspond à celleenregistrée dans la session. Si tout réus-sit, connectez-vous à la base de donnéeset chargez le nom d'utilisateur et MDSdu mot de passe. Si la personne, dont lenom d'utilisateur est cherché, n'existe pas,retournez la valeur -3. Sinon, vérifiez sile mot de passe envoyé est correct selonque le navigateur de I'utilisateur a effectuéla fonction JavaScript. Si le mot de passecorrespond, retournez le nom d'utilisateulsinon, retournez la valeur 4. Les valeursnumériques négatives susmentionnéessont employées dans la partie principaledu code pour afficher le message d'erreurapproprié. Si la valeur retournée par lafonction dolosin est une chaîne de ca-ractères, traitezJa comme un nom d'utili-sateur et enregistrez-la dans la variabtede session en redirigeant en même tempsI'utilisateur sur la page du panneau deI'administration. Enfin, modifiez la valeurde la variable de la clé, en y enregistrantune nouvelle valeur unique.

Résumons: vous avez créé un petitscript avec de grandes fonctionnalitésà I'aide d'une seule fonction de hachage.Ce script garantit aux utilisateurs connec-tés à votre service un niveau élevé desécurité. Regardez une autre fonction, dis-ponible nativement en PHp, permettant dechiffrer les chaînes de caractères à l,aidedes algorithmes, comme DES et Blowfish.ll s'agit de la fonction crypr.

Notions de la cryptogra-phie - crypt

-

Contrairement aux suppositions, la fonc-tiofl crypt permet de chiffrer en une seuledirection, la fonction decrypr, permettant

de déchiffrer I'information, n'existe pas.En pratique, il s'agit d'une autre fonctionde hachage. Regardez comment vouspouvez créer un script d'authentificationplus simple, à I'aide de cette fonction et

Listing 1. lmplémentation de l'atgorithme HMAC-MD| pour pHp

' php

def ine 'HMAC_MD5 ' , I , ;

d e f i n e r ' H M A C _ S H A I ' , 2 , ;f u n c t i o n h m a c i $ s t r i n 9 , $ k e y , $ a l g o r i t h m = H M A C M D 5 ,

$ a l g o r i t h m = $ a l g o r i t h m = = H M A C _ M D 5 ' m d 5 ' : ' s h a 1 , ;

i f r f u n c t i o n _ e x i s t s ' h a s h _ h m a c ' ,r e t u r n h a s h _ h m a c $ a l g o r i t h m , $ s t r i n g , $ k e y , -

i f i s s e t r $ k e v 6 4 l

$ k e y = p a c k , ' H * ' , $ a l g o r i t h m g k e y r , ;

$ k e y = s t r _ p a d , $ k e y , 6 4 , " \ 0 " ;$ i P a d = s t r _ r e p e a t , " \ x 3 6 " , 6 4 ;$ o P a d = s t r _ r e p e a t " \ x 5 c , ' , 6 4 ;r e t u r n $ a l g o r i t h m i I $ k e y ^ S o p a d , . p a c k , ' H * '

$ s t r j . n g , , ;

func t ion hmac_mdS ($s t r ing , gksy

re turn hmac $s t r ing , Skey , HMAC MD5, ;

$ a l g o r i t h m $ k e y ^ ç i p " 6

Listing 2. code HTML du système de connexion sécurisée

I DOCTYPE htMl PUBLIC " - / /W3C/ / DTD XHTI"IL 1 . 1/ /EN"" h t t p : / / w w w . w 3 . o r g l T R / x h t m l 1 1 / D T D / x h t m l l 1 . d r d , , ,

h t m l x m l - n s = " h t t p : / / w w w - w 3 . o r g / I 9 9 9 l x h t m l " x m l : ] a n g = " p L t r, head

t i t l e P H P S o l u t i o n s : : h m a c m d 5 / t i t l e ,meta h t tp -equ iv="Conten t -Type" conten t=" tex t /h tm] ; charse t :u t f_g" /

. s c r r p t t y p e = " t e x t / j a v a s c r i p t " s r c = " m d 5 . j s " . . / s c r l p t ,sc r lp t t ype=" tex t / j avascr j -p t "

f u n c t i o n g , i 6 r , r e t u r n d o c u m e n t . g e t E l - e m e n t B y l d i i d rfunc t ion parseForm, j

V ê r u = S i ' u s e r n a m e ' ) , p = $ : ' p a s s w o r d , ) , .i f u . v a l g e = = t '

a l e r t ' S a i s i s s e z I e n o m d \ ' u t j . l i s a t e u r . ' r ;

u . f o c u s : j ; r e t u r n f a l - s e ;

i f i p . v a l u e - = " : l

a f e r t i ' S a i s i s s e z l _ e m o t d e p a s s e . ' t , .

p . f o c u s r r ; r e t u r n f a l s e , .

p . v a l u e = h e x h m a c m d 5 i $ " k e y ' j . v a l u e , h e x _ m d S i p . v a f u e t ) . .

$ ( ' j s ' j . v a L u e = 1 , . r e t u r n t r u e , .

/sc r ip t , /head; body

php

i f I ! e n r p t y i S e r r o r S t r i n g ) ;e c h o ' d i v i d = " e r r q r " ' , $ e r r o r S t r i n g . ' , t / d i v , ' , .

: fo rm metho6="pos t ' r ac t ion=" rog in .php" onsubmi t=" re tu rn parseFormo, , ; . . - .d iv' Lnput type="h idden" name="key" id=" )çsy" vaLue=": ? p h p e c h o $ _ S E S S I O N [ ' k e y ' ) ? , " / .

. : I n P u t t y p e = " h i d d e n " n a m e = " j S i l i d = " j s t r v a l u e = " 0 " / ) .

. : l a b e l f o r = " u s e r n a m e " : , 1 q 6 p d ' u t i l i s a t e u r : . : / I a b e I ,

" , inpu t type=" tex tÙ name="username" id= t 'usernamer ' / .> . .b t / ; .: I a b e I f o r = ' t p a s s l v o r d " , M o t d e p a s s e : . : / l a b e I >: rnput type="pass$rord , ' name="password" id="pass lvordr , / . . , , .b r / . . ,. l rnput type="submi t " va lue="OK" / . . .

, /d iv> , / f o rm, . : /body : , , /h tml ,

www.phpsolmag.org PHP Sofutions N'4/2006

Page 4: cryptographie en php

basé sur le protocole HTTP et I'algorithmeDES.

Le principe du fonctionnement de toutsystème d'authentification est quasi identi-que. Une fois le nom d'utilisateur et le motde passe précisés, le script compare cesdonnées aux informations stockées dansla base de données ou dans le fichier.Pour des raisons de sécurité, le mot depasse de I'utilisateur n'est pas stocké sousforme visible : le hachage du mot de passe

est enregistré dans la base de données.Afin de créer ce type de hachage, utilisezh fonction crtpr. Elle est disponible par

défaut dans toute installation de PHP, iln'est donc pas nécessaire de modifier par

exemple le fichier de configuration.Dans un premier temps, crêez un sim-

ple exemple basé sur la fonction c'ypt. LeListing 4 présente son code source.

À chaque chargement de la page oudu script, vous obtiendrez une valeur unlque de hachage. llen est ainsicar une sui-te de caractères aléatoire, gsatr, est crééeà chaque fois ; elle est indispensable dans

ALDER32

X - md5( ), mdS_file( )

TIGER

TIGERI60

le processus de création du hachage. Lechoix de I'algorithme employé dépend dudeuxième argument d'appel de la fonctionanalysée. L'algorithme DES standard est

X-sha1( ), shal_file( ) X-MHASH SHA1

X - MHASH TIGER

X. MHASH ADLER32

X-MHASH GOST

X-MHASH MDs

X- MHASH TIGERI6O

employé pour la valeur à deux caractèresde la variable $satr et I'algorithme DES,version étendue - pour la valeur à neufcaractères. Afin d'utiliser I'algorithme MDS,

Tableau 1. Algorithmes disponibles nativement en PHP etvia I'extension MHASH

GOST

HAVALI60 X- MHASH HAVALI6O

HAVAL256 X-MHASH HAVAL2Sô

MD5

Listing 3. Code PHP du sysfème de ænnexion sécurisée

<?PhP

function dologin() i

/ / Le non et l-e not de passe non renseignés

i f (e ry ty ($_PosTI rusernamer ] ) | |- -F ty ($_POST I 'passwordr I ) )

return -1;

$ j s = $ _ P O S T [ ' j s ' ] ;

$ k e Y = $ - s E S s r o N [ ' k e ' ' ] ;

/ / La cLé envoyée dans la requête HTTP

// ne correspond pas à cel le

// enregistrée dans - la sessjon

i f ( $ k e y ! = $ _ P o S T [ ' k e y ' ] )

return -2;

/ / recherche de l 'enreg is t renent de 1 'adn in is t ra teur

// du non saisi

$ m y s q l _ h a n d l e = n y s q l _ c o n n ê c t ( ' h o s t r r ' u s e r n a m e ' ,'password t )

or die 1nyeql_error () ) ;

ryegl_select_db ( ' test r, $mysql_handle)

or die (rysql-error O ) ;

$rnysql_result = uyaql_qrery( 'SELECT username' password

FROM admin

WHERE usernême = rr' .mysql_real_escape_etring(

$_POST[ 'username' J , $mysq l_hand le) . " " ) ;

/ / I tbsence de 1'enregistrement de l 'adninistrateut

/ / d u n o n d ' u t i T i s a t e u r s a i s i

i f (uycql_nun_rors ($mysql_result) == 0)

return -3;

$row = uyaql_fetch_aseoc ($mysql_result) ;

/ / val idation du not de passe se.lon gue

/ / JavaScr ip t a é té u t i l i sé

i f ( $ j s ) r

r e g u i r e ' h m a c _ m d S . p h p ' ;

i f (hmac_mdS ($row i 'password ' J , $key) !=

$ P O S T I r p a s s w o r d r : )

return -4;

i else i

i f ( n d s ( $ P O S T i ' p a s s w o r d ' l ) ! = $ r o w [ ' p a s s w o r d ' 3 )

return -4;

I

/ / La connexion a réussi, nous retournons

/ / l e n o m d t u t i l i s a t e u r

re tu rn $ rowI rusernamet ] ;

s e s s i o n s t a r t O ;

$ e r r o r S t r j - n g = t ' ;

$ log inResu l t = do log inO, '

s r i t ch ($ log inResu l t ) {

case -1: break;

case -2 : $er ro rSt r ing =

rLa va leur de la c Ié incor rec ter ; b reak ;

case -3 : $er ro rSt r ing =

rLe nom d \ tu t i l i sa teur incor rec t ' , ' b reak ;

case -4 : $er ro rSt r ing =

tLe mot de passe incor rec t ' ; b reak ;

default:

$ S E S S I O N I ' u s e r n a m e ' l = $ l o g i n R e s u l t ;

header ( 'Locat ion :

h t tp : / / server . com/admin /pane l . php ' ) ;

d i e ( ) ;

l

S SESSION [ 'key' ] = nd5 (uniqid (rand O , true) ) ;

PtlP Solutions N' 4/2006 www.phpsolmag.org

Page 5: cryptographie en php

la variable $salt doit comprendre douzecaractères avec la chaîne $1$ au début.ll s'agira de seize caractères qui com-mencent par s2s ou $2a$ pour I'algorithmeBlowfish. La variable ssat-r est ensuiteajoutée au hachage généré.

Retournons à notre exemple où vouscréez un script d'authentification via leprotocole HTTP. Les noms d'utilisateurs etleurs mots de passe se trouveront dans lefichier texte (Listing 5).

Mentionnons tout d'abord une caracté-ristique intéressante de la fonctioll crypt.Si vous essayez de créer un hachage del'information envoyée par I'utilisateur (par

exemple, le mot de passe) en précisantle hachage stocké dans la base de don-nées ou dans le fichier (modèle du mot depasse) en tant QUê $sarr, la fonction devraretoumer le même hachage. Cette situa-

' tion n'a lieu que si le mot de passe précisé

conespond à celui utilisé pour la premièrefois pour créer le hachage. Utilisez cettecaractéristique dans votre script d'authenti-fication. N'oubliez pas que I'authentificationbasée sur le protocole HTTP est disponibleseulement quand votre PHP fonctionne entant que module Apache. Si ce n'est pas

le cas (donc PHP fonctionne en tant que

CGI), votre exemple ne fonctionnera pas.

Observez le Listing 6. Dans un pre-

mier temps, il faut vérifier si I'utilisateura envoyé son login et son mot de passe. S'ilne I'a pas fait, envoyez les en-têtes HTTPappropriés pour demander au navigateurd'afficher la fenêtre de connexion apprepriée. Les mêmes en-têtes sont envoyés siles données de connexion sont inconectes.Si I'utilisateur vous envoie les bonnes don-nées, il faut récupérer le contenu du fichierqui sert de votre base et stocke les mots depasse des utilisateurs. Séparez les donnéeschargées à l'aide de la fonctioll exprode €I1séparant les noms d'utilisateurs et les motsde passe. La demière étape est une bouclequi traverse tous les enregistrements et vé-rifie si I'utilisateur peut accétler à la page enquestion. Afin de vérifier si le mot de passe

est conect, utilisez la caractéristique de lafonction crypt déct'ite cidessus.

Comme vous pouvez le remarquer,elle peut être employée sans problèmepour réaliser un simple système d'authen-tification. ll est toutefois recommandé d'uti-liser les algorithmes comme MDS et SHAI(donc les fonctions md5, srrar) câr I'algo-rithme DES n'est pas aussi complexe. Deplus, lors de la création du hachage, seuls8 premiers caractères sont utilisés.

C ryptog rap h ieavancée - MCryptMCrypt est une extension PHP proposant

les méthodes qui permettent de chiffrerles données à I'aide des algorithmescomme DES, TripleDES, Blowfish, RC2 etd'autres. La liste des algorithmes les pluspopulaires, disponibles pour cette exten-sion, se trouve dans le Tableau 2. L'en-cadré lnstallation de l'ertension MCrypt

présente comment installer et configurerla bibliothèque.

MCrypt est un outil puissant. En vous y

basant, vous créerez donc un exemple as-sez complexe. Vous écnrez une applicationquivous permettra de stocker sur le serveurles fichiers de tout type sous forme chifirée.Pour les charger sur le disque local, il fau-dra préciser un mot de passe, identiqueà celui utilisé lors du chiftement du docu-

Listing 4. Exemple de l'utilisation de la fonction crypt

php

$ p a s s w o r d : r q w e r t ! r i

$ s a 1 t = ' $ l S a b c d e $ ' , '

$ h a s h = c r y p t ! $ p a s s w o r d , $ s a I t l ;

echo Shash;

Listing 5. Format de données du fichier contenant les données des utilisateurs

admin : $1$Lp5 .2 / / . SUMLIAWJJB9fLR. FU4gSAwt

u s e r : $ 1 $ h I 3 . W d O . $ t h b t d l a t 0 a u C N f n T s 5 B d y l

Listing 6. Scnpf de validation de données /ors de l'autorisation

l php

d e f i n e i ' U S E R S F I L E ' , ' u s e r s . t x t ' r ;

i f i i s s e t r $ _ S E R V E R ' P H P _ A U T H _ U S E R ' r i & & i s s e t i $ _ S E R V E R , ' P H P - A U T H - P W ' I ;

$ u s e r s = e x P l o d e i " \ n " , f i l e _ g e t _ c o n t e n t s l U S E R S _ F I L E ) ) ;

f o r e a c h i $ u s e r s a s $ u s e r l

$ u s e r = e : ç l o d e r ' : ' , t r i m i $ u s e r i , 2 1 , '

i f l $ u s e r 0 = = $ S E R V E R ' P H P A U T H U S E R ' j

i f i c r y p t ( $ _ S E R V E R ' P H P _ À U T H _ P W ' , $ u s e r 1 . . $ u s e r 1 ' r

h e a d e r i ' V i V ' l W - A u t h e n t i c a t e : B a s i c r e a l m = " P r i v a t e " ' ) ;

h e a d e r ( ' H T T P / 1 , 0 4 0 1 U n a u t h o r i z e d ' i ;

exit , '

e lse

h e a d e r i ' W W W - A u t h e n t i c a t e : B a s i c r e a l m = " P r i . v a t e " ' \ ;

h e a d e r i ' H T T P / / 1 . 0 4 0 1 U n a u t h o r i z e d ' ) , '

exit,'

Listirrg 7 ̂ Structure de Ia table contenant les données des fichiers chiffrés

CREATE TABLE I secure f i les' (

' i d ' i n t ( 1 1 ) u n s i g n e d N O T N U L L a u t o _ i n c r e m e n t ,'name ' varchar i100 i de fau l t N t tLL 't m i m c r v n o t r r : r c h 3 a i J [ ) d e f a U l t N I I L L ,

' d a I e ' i n t ' 1 0 I u n s i g n e d d e f a u l t ' 0 ' ,

' I e n g t h ' v a r c h a r i 2 5 5 ; d e f a u l t r 0 ' ,

' key' varch ar ' ,32) default NULL,' d a t a ' t e x t ,

PRIMARY KEY { ' id ')

) TYPE=MyISAM,'

break;

www.phpsolmag.org PHP Solutions N'4/2006

Page 6: cryptographie en php

ment. Vous stockerez toutes les données

(donc les fichiers chifirés et les informations

détaillées les concemant, comme la taille

ou le type MIME) dans la base de données.

Le Listing 7 présente une requête SQL,

chargée de créer un tableau adéquat. Les

colonnes appropriées stockeront le nom

du fichier, la date d'ajout à la base, le type

MIME ainsi que la taille du fichier original, la

clé et le fichier sous forme chifirée.

Quelque chose de très simplepour commencer : chiffrer unfragment du texteAvant de passer à I'implémentation de

votre stockage sécurisé de données, ob-

servez le schéma de fonctionnement et

de fonctionnalités de I'extension MCrypt.

Le Listing 8 présente un exemple de code

PHP dont I'objectif consiste à chiffrer la

chaîne de caractères donnée à I'aide

d'une clé et ensuite à la déchiffrer.

Afin d'initialiser les mécanismes de la

bibliothèque Mcrypt, appelez la fonction

mcrypt_module_open ; elle prend en premier

argument le nom de l'algorithme que vous

voulez utiliser. Le deuxième et le quatrième

paramètre comprennent des chemins aux

modules appropriés. lls permettent d'utili-

ser I'algorithme donné. Si vous les laissez

vides, comme dans I'exemple, les chemins

définis dans le fichier de configuration

php.ini seront alors utilisés. Le troisième

argument définit le mode de chiftement;

Tabteari 2. Les algorithmes de chiffrement les plus populaires, disponibles dansl'extension MCrypt

MCRYPT 3DES

MCRYPT THREEWAY

MCRYPT BLOWFISH

MCRYPT CRYPT

MCRYPT DES

MCRYPT GOST

MCRYPT IDEA

MCRYPT SERPENT

MCRYPT TWOFISH

168

96

do 448

1 M

56

Sowiet Gosudarswiennyj 256

International Data 128Encryption Algorithm

Serpent 128,192 ou 256

Twofish 128,192 ou 256

DES double

3way

Blowfish

Chifrement

DES

64

96

64

I

64

64

64

128

128

Figure 2. Apptication d'un stockage sécunsé de fichiers sur le serueur sous formechiffrée

vous utiliserez le mode ecn. Lê Tableau

3 présente tous les modes possibles de

chifirement ainsi que leurs descriptions.

Enregistrez le résultat du fonctionnement

de la fonction analysée dans la variable

auxiliaire srd. L'étape suivante consiste

à créer un vecteur d'initiation au moyen de

la fonction mcrtæt_create_iv. Cette fonction

nécessite la traille du vecteur et la source de

données aléatoires. ll est recommandé

d'utiliser la constiante McRypr RAI.Jo car ceci

fonctionne aussi bien sous Linux que sous

Windows. La bibliothèque MCrypt est ici

prête à accepter les données à chifter.

Dans un premier temps, réservez I'espace

adéquat dans la mémoire. Pour ce faire, uti-

lisez la foncti on mcr]æt_generic_init, êrl

lui transmettant les poignées du module et

du vecteur d'initiation ainsi que la valeur de

la clé, utilisée lors du chiffrement. La clé a

été coupée à une longueur maximale, sup-

portée par I'algorithme sélectionné. Appelez

ensuite la fonction mcrypt seneric dont le

résultat est une chaîne de caractères chif-

frée. Ensuite, libérez la mémoire réservée

à I'aide de la fonction mcrypt-generic-

deinir. Pour terminer le travail avec la bi-

bliothèque Mcrypt, appelez mcrypt_module-

cr-ose. Le déchifrement des informations se

déroule de manière quasi analogue à cette

difiérence près que vous utiliserez la fonc-

tion mdec.ypt seneric au lieu de la fonction

mcrypt seneric ; cette première prend les

mêmes arguments que cette demière.

Dépôt sécurisé de donnéesPuisque vous avez les notions indispen-sables concernant la bibliothèque MCrypt,écrivez à présent les fonctions appro-priées pour votre application. Le Listing 9présente le code source du script de chif-frement du fichier envoyé.

Avant d'ajouter un enregistrementà la table, vérifiez si l'utilisateur a saisi la clédemandée et si le fichier a été bien envoyésur le serveur. Ensuite, créez le hachage dela clé à I'aide de l'algorithme MDS pour vârifier rapidement si elle est conecte lors du

Insta l lat ionde I 'extension MCryptSi vous disposez du système Win-dows, vous avez sûrement le fichierlibmcrypt.arr disponible à téléchargersur le site httpt/ftp.emini.dUpub/php/win32/mcryptl. ll faut le placer dans lerépertoire c:\wndorvs\system32\. Si vousdisposez d'un autre système, visitez lesite httpt/mcrypt.sourceforge.neV, télé-chargez les sources de la bibliothèqueet compilez-les. Afin d'utiliser l'extensionMCrypt en PHP, compilez-la avec la di-rective -with-mcrypt [=DrR] où DIR estun chemin de la bibliothèque libmcrypt.

www.phpsolmag.org PHP Solutions N" 4/2006

Page 7: cryptographie en php

Tableau 3. Modes de chiffrement supportés par l'extension MCrypt

chargement du fichier. Vous éviterez ainsi

qu'un utilisateur télécharge un fichier pour

se rendre compte d'avoir confondu les clés

et que le fichier est inutile. Une fois le fichier

chargé, chiffrez son contenu et ajoutez une

entrée adéquate à la base de données.

MCRYPT MODE ECB

MCRYPT MODE CBC

MCRYPT MODE CFB

MCRYPT MODE OFB

MCRYPT MODE NOFB

MCRYPT MODE STREAM

Observez la fonction de chargement

des fichiers ajoutés auparavant. Dans un

premier temps, comparez la clé envoyée

par I'utilisateur à celle attribuée au fichier

donné. Si les clés (et en pratique, leurs

hachages MD5) sont identiques, il est

possible de déchifirer le contenu du fichier.

Ce processus ne se difière pas beaucoup

du simple chifirement et il vous a été déjà

présenté. Puisque I'utilisateur doit disposer

d'une option permettant d'enregistrer le

fichier sur son disque, il est nécessaire

d'envoyer les entêtes appropriés à son

navigateur. Pour ce faire, utilisez la fonc-

tion header et les en-têtes content-rype êt

conrent-DisposiLion. A la f in, avant d'gn-

voyer le contenu du fichier, il faut suppri-

mer les caractères vides que les fonctions

de chiffrement peuvent laisser à la fin du

fichier. Ces caractères peuvent provoquer

des problèmes ultérieurs dans sa lecture.

Puisque vous connaissez la longueur du

fichier original, vous pouvez I'effectuer sans

problème au moyen de la fonction subsrr.

L'exemple présenté a démontré

que vous pouviez chiffre vos données

rapidement et les stocker dans la base.

ll peut s'agir aussi bien des mots de passe

que des contenus de fichiers entiers.

N'oubliez pas toutefois que le processus

de chiffrement d'un fichier de 40Mo peut

charger considérablement le processeur et

provoquer une surcharge de la mémoire,

attribuée à PHP. Le message d'erreur

s'affichera alors et le script interrompra son

fonctionnement. La durée de chiffrementpeut être longue si vous sélectionnez un

algorithme complexe. Une bonne solution

consiste alors à chiffrer les blocs indivi-

duels de données. Pour connaître la taille

du bloc pour un algorithme de chiffrement,

vous disposez de la fonction mcrypr_ser_

b f o c k s i z e O U m c r y p t e n c g e t b l - o c k

s l - z e .

Conclus ionNous avons présenté dans cet articleune partie seulement des fonctionnalitésdes fonctions cryptographiques que vouspouvez utilisez dans les applications PHP.Dans nos exemples, nous vous avonsexpliqué comment protéger les données etcréer des systèmes d'authentification sé-curisée. Dans les prochains articles, nousvous parlerons notamment de la bibliothè-que OpenSSL et de I'envoi des courrielssécurisés depuis PHP. r

Sur Internet

. http://php.net/mcrypf - MCrypt

. http://php.net/mhash - MHash

. http://phpsec.org/ - PHP SecurityConsortium

Mode de livres électroniques

Mode de chiffrement par chaînage de blocs

Mode de chiffrement à rétroaction

Mode de chiffrement à rétroaction de sortie de B bits

Mode de chiffrement à rétroaction de sortie de n bits

Mode de chiffrement de flux

Listing 8. Exemple comment utiliser l'extension MCrypt

php

/ / Not re c lé e t cha ine de carac tères à ch i f f re r

$ k e y : ' c I é s e c r è t e ' ;

$ p l a i n t e x t = ' d o n n é e s c o n f i d e n t j . e l l e s à c h i f f r e r ' ;

/ / tn i t iaL isa t ion des mécan ismes de ch i f f renent

S t d = m c r y p t m o d u l - e o p e n ' b l o w f i s h ' , ' ' , ' e c b ' , ' ' ;

$ k e y = s u b s t r $ k e y , 0 , m c r y p r e n c g e t k e y s i z e $ t d

$ i v : m c r y p t c r e a t e i v m c r y p t e n c g e t i v s i z e $ t d ,

// Chiffrenent

m c r y p t _ g e n e r j - c _ i n i t $ t d , $ k e y , $ i v , ;

$ e n c r y p t e d = m c r y p t g e n e r i c S t d , S p I a i n t e x t ;

m c r y p r g e n e r r c d e i n i t S t d ;

echo $encryp ted ;

/ / Déch i f f renent

m c r y p t g e n e r i c i n i t $ t d , $ k e y , S i v , , '

$decryp ted = mdecryp t gener ic S td , $encryp ted ;

mcryp t_gener ic_de in i t $ td ;

echo $dgç ;yp1sd;

mcryp t_modu le_c lose $ td .

Listing 9. Scrpf de chiffrement du fichier envoyé

php

9 f i I e : S F I L E S

i f $ f i l e ' e r r o r '

r f i l o l

=: UPLOAD ERR OK && lEttPtY $ POST

MCRYPT RAND

i f l !e tnPty r$_POST 'name' ) j

$ f i f e ' n a m e , = $ P O S T ' n a m e ' , .

S k e Y = n d 5 $ - P . S T ' k e Y ' ' ;

Sdata = f i le_get_conten ts S f i Ie ' tmp_name' , '

$ t d = m c r y p t m o d u l e o p e n , r d e s r , " , ' e c b ' , ' ' r , '

$ s u b k e y = s u b s t r S k e y , 0 , m c r y p t e n c g e t k e y s i z e $ t d ;

$ iv_s ize = mcryp t_enc_get_ iv_s ize Std ;

S i v = m c r y p t _ c r e a t e _ i v , $ i v _ s i z e , M C R Y P T _ R À N D , ;

m c r y p t g e n e r i c i n i t $ t d , $ s u b k e y , $ i v ;

9encryp ted_data = mcryp t_gener ic $ td , $datar ;

m c r y p t g e n e r i c d e i n i t S t d ;

m . r r f n i - m n r i r r I e n l n c a $ g d , '

r n y s q l _ g u e r y " I N S E R T I N T O ' s e c u r e _ f i l e s " n a m e ' , ' m i . m e - t y p e ' , ' d a t e ' ,' I e n g t h ' ,

' k e y ' , ' d a t a r i

V A L U E S i ' { $ f i l e [ ' n a m e ' ] ] ' , ' { $ f i l e [ ' t y p e ' ] ] ' , U N I X T I M E S T A M P ( r ,' { $ f i l e [ ' s i z e ' ] ) ' , ' $ k e y ' , " ' . m y s q l * r e a I _ e s c a p e * s t r i n g($encryp ted_data) . r r r \ ' r r o r d ie 'mysq l_er ro r , I , '

PHP Solutions N" 4/2006 www.phpsolmag.org