cryptographie en php
description
Transcript of 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
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
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
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
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
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
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