Vous êtes sur la page 1sur 7

Cryptographieen PHP

Niveaude difficulté : o
LukaszLach,MichalStanowski

Voussavezprobablementtous en quoi
consistela cryptographie. Vousdisposez
d'une information(parexempletexte)et vous
fa chiffrezde sorte qu'unepersonnenon
autoriséene puissepas le lire.Vousvoyezla
cryptographie tous les jours : en utilisantune
banquelnternetou en envoyantun courriel
chiffré.Toutcelaest possibleavec PHP.

ikipediadéfinitla cryptograPhie tenu de fichiers.Une partied'entreelles


commeune disciplinede cryP- est disponiblenativement maisla plupart
tologie, s'attachantà protéger sontutiliséesà I'aided'uneextensionex-
des messages. Son objectif consiste térieure,jointeà PHP.Nous montrerons
à chiffrer les informations. En pratique,il dans cet article comment utiliserces
s'agitde convertir une information en une fonctionsde manière efficace sur trois
autreà I'aide des calculs mathématiques exemplespratiques.
Auteur complexes(chiffrement)et de convertir
Lukasz Lach étudie l'informatiqueà la éventuellement cette informationen son Système
faculté de Cybemétique de l'Académie état initial (déchiffrement). C'est un do- de connexionsécurisée
Militaire de Technologie à Varsovie. présent dans le contexte Dansun premiertemps,créezun système
mainesouvent
Depuis plusieurs années, il crée des
des applications Internet,aussibiendans de connexion C'estun exemple
sécurisée.
applicationslntemet à faide des techno-
logies,comme PHn XHTML, JavaSciPt les petitsservicesque les grandsservices
et XML. ll a le certificat Zend Ceftified commerciaux ; lorsde la connexion à une
Engineer. Il a écit et publié plusieurs
banqueInternet,les donnéessaisiessont
Ce qu'il faut savoir...
afticles de presses dans /es magazines ll sera utile de connaîtredes bases de la
polonais et étrangers. lls concement la envoyéesvia une connexionSSL sécu- cryptographieet de PHP.
création des applications lntemet et la risée, chiffréeet lorsque vous envoyez
prcgrammafibnsécunséeen PHP.
Cet article explique...
des courrielsconfidentiels, vous utilisez Vous apprendrez comment créer un
le systèmePGP qui protège le contenu système sécurisé de connexionet une
Michal Stanowski esf caPable de appticationpour stocker et chiffrerles
programmer des applications orientées contrelestiercespersonnes.
fichiers sur un serveur Web. Nous pré-
objets en PHPS de manièrc avancée. ll PHP contientde nombreusesfonc-
senterons les meilleures solutions les
s'rhféresseà la sécurité des applications tions,permettantde chiffreret de générer plus populairesde cryptographieen PHP
lntemetet leur utilité. llpasse son femps
les fonctionsde hachagede n'importe sur ces exemples.
libre à visiter la Pologne à vélo.
quelle chaîne de caractèresou de con-

www.phpsolmag.org PHP SolutionsN'4/2006


parfaitd'utilisationde fonctions crypto-
hachagedu
graphiques disponibles en PHP.Dansce
mot de passe -[ffi] mot de passe
rrruruE'P"ùùnLl
de passe saisi u À r ^ r ._[rnÂ
système sécurisé, le mot CLIENT
sera envoyé sous forme
par I'utilisateur
hachagedu mot
hachag
chiffréedeuxfois : la premièrefois via I'al- de passe,
pasr
clé
gorithme MDSet ensuitevia HMAC-MDS. .
publique
rque combin avec
combinée
La valeur envoyéesera correcteune la clé publique
p

seulefois car la clé publique,nécessaire


SER\
dansle processusde chiffrement,sera
uniqueà chaquefois - créé dynamique- début de
mentdu cotédu serveur. la connexion
Ce systèmes'avèretrès utile lorsque
vous n'avez pas SSL sur le serveur et . ^ .^r-^ )^t^-^ti^^^^^^^tA,,
Figure 1" schémade fonctionnement du asystème
, , a t À m ade
r l z connexionsécurtsêe
vousvourezenvoyerdes donné",
"nit_ Dans ce système, nous admet-
frées.Contrairement au systèmetradition- et permetd'ajouterune clé supplémentai-
nelde connexion,celui-làprotègeeffica- re. La chaînede caractèresainsigénérée tons que le mot de Passe envoYéPar
cementles utilisateurscontreles attaques peutalorsêtreenvoyéeau destinataire. Ce I'utilisateursous forme de HMAC-MDS
du typesniffing,consistantà écouterles destinataire peutvérifiersi la suiteenvoyée ne sera vrai qu'une seule fois. Si vous
informations échangéesentre le clientet est correcteà I'aidede cette clé secrète. ouvrezou générezde nouveaula page,
leserveur, ce qui permeten conséquence Dans le systèmede connexiondans cet une nouvelleclé sera généréeet donc,
derécupérer et le mot
le logind'utilisateur article,vous utiliserezI'algorithmeHMAC le hachagecréé aura une autre valeur.
de passesaisiset de les utiliserpour se pourgénérerle hachagedu mot de passe, Qu'est-ceque celavousdonne? Mêmesi
connecter. De plus,tous les motsde pas- en y ajoutantune clé aléatoire,générée une tierceperSonneécouteles données,
seserontstockésuniquement sousforme du côté du serveur.PHP n'est pas doté les informations ainsi obtenueslui seront
de MDSet les personnesnon autorisées de I'implémentation HMACde I'algorithme complètement inutiles. Concentrez-vous
nepounontpas les connaître(en admet- MDs. ll est donc nécessairede la décrire dansun premiertempssur la partieHTML
tantque les mots de passecomprennent en vous basantsur la documentation dis- du codesource,présentdans le Listing2.
au moins4 ou 5 caractères).L'encadré ponible (httpt/www.ietf.org/rfclrtc2104.ffi). Dans les premièreslignesdu script,vous
Atgorithmeset fonctions de hachage Le code source de la fonction r'mac md5sê ajouterezle fichierdu langageJavaScript
contientles informationsélémentaires trouve sur le Listing1. appefé md1is, contenantdeux fonctions
concernant les fonctionsde hachage.La L'atoutsupplémentaire de I'implémen- cléS : n"*-*ds et hex-hmac-mds ; elles sont
Figure1 présenteun schémadu système tation présentée réside dans le fait qu'elle équivalentes aux fonctions md5 êt hmac-

deconnexion sécurisée. permet non seulement de générer le mas,disponiblesdu coté du script PHP. Le
Dans I'exemplede cet article,vous hachageHMAC-MDSmais aussi HMAC- code source de la fonction parseFormsê
égalementdes versionsHMAC
utiliserez SHAI ; vousdisposezdoncde deuxalgo- trouve ci{essous. Elle est appelée avant
deI'algorithme MDS.HMAC-MDS est une rithmessupplémentaires pour les utiliser d'envoyer le formulaire. Ce formulaire se
extensionde la fonctionde hachageMD5 dansvos projets. trouve dans la partie body du document et
contient quatre champs importants :

nainage key - champ du tYPehidden conte-


direction- nant la clé unique,généréedu côté
de calcul du serveur.Elle est utiliséeà l'étape
énormeet est pratiquementimpossible.Une caractéristiqueimportantede la fonctionde de connexionpar les versionsHMAC
hachageest que la modificationd'au moins un caractèrede la chaîne initiale,indépen- de la fonctionde hachage,
js - champdu typehiddendontla va-
leurdéterminesi le navigateurde l'uti-
lisateursupporteJavaScript. Sa valeur
par défauts'élèveà o (zéro),remplacé
par r (un) avantI'envoidans les der-
nièreslignesde la fonctiondolosin,
username - chamPdu tYPetext, coî-
encoremodifiés. tenantle nomd'utilisateur saisi,
Malgrécela, les algorithmesde hachage disponiblesnativementen PHP suffisent
pleinemént,indépendamment de la taille du projetcréé. Les algorithmestels que CRC32 password- chamPdu tYPetext, GoIl-
et MDb sont courantset utiliséspour créer des sommes de contrôlede fichiers ou de tenantle motde passesaisi.
donnéesconfidentielles,qui doivent être accessibleseulementsous forme permettantune
(parexempled'un mot de passe).Le Tableau1 contientles algorithmesdisponi-
validation Le rôle du champ js est très important:
blesnativementen PHP et via I'extensionMHASH.
lorsquesa valeurestégaleà 0, voussavez

N'4/2006
PHPSolutions www.phpsolmag.org
que lesdonnéesconcemant le nomd,utili- Notions de la cryptogra-
sateuret le motde passeserontenvoyées p h i e - c r y p t
- de déchiffrerI'information, n'existepas.
En pratique,il s'agitd'uneautrefonction
sousformevisible.Malgrécela,vousêtes Contrairement aux suppositions, la fonc- de hachage.Regardezcommentvous
toujourscapablesde vousconnectersans tioflcrypt permetde chiffreren une seule pouvez
créer un script d'authentification
problèmes. Retournons au codesourcede direction,la fonctiondecrypr,permettant plus simple,à I'aide
de cettefonctionet
la fonctionanalysée. Si le nomd'utilisateur
ou le mot de passene sont pas précisés,
Listing 1. lmplémentation de l'atgorithme HMAC-MD|pourpHp
affichezun messageadéquatet placez
le curseurdans le champ vide. Sinon, ' php
modifiezle contenudu champ,contenant d e f i n e ' H M A C _ M D' 5 , I, ;
le mot de passeen hachageHMAC-MDS d e f i n er ' H M A C _ S H A I ' 2, , ;
function hmaci$strin9, $key, $algorithm = HMAC
de MDSdu motde passesaisiet de la clé MD5,
$algorithm = $algorithm == HMAC_MD5 'md5' : 'sha1,;
unique,disponible dansle champrey. De 'hash_hmac'
if rf u n c t i o n _ e x i s t s ,
plus,paramétrez la valeurdu champ1s 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 , -
en 1 et autorisezI'envoidu formulaireen if i s s e t r$ k e v 6 4 l
retournant la valeurtrue. $ k e y = p a c k , ' H * ' , $ a l g o r i t h m g k e y r, ;

Observezà présentce qui se passe $key = str_pad,$key, 64, "\0" ;


$iPad = str_repeat,"\x36", 64 ;
du côté du serveur: le code complet
$oPad = str_repeat "\x5c,', 64 ;
PHP de I'exemple décritse trouvesur le 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 * '
$algorithm $key ^ çip"6
Listing3. La fonctiondolosinconstituela $strj.ng , , ;
grandepartiedu script; elle est chargée
function hmac_mdS ($string, gksy
de vérifierle nom d'utilisateuret le mot
return hmac $string, S k e y , H M A CM D 5 ,;
de passe.Si I'unede ces donnéesn'est
pas précisée,la valeur-1 est retournée.
Ensuite,véifiez si la clé, envoyéedu for-
mulaire(champrey), correspond à celle Listing 2. code HTMLdu systèmede connexionsécurisée
enregistrée dans la session.Si tout réus-
I DOCTYPEhtMl PUBLIC " - / /W3C/ / DTD XHTI"IL1 . 1/ /EN"
sit, connectez-vous à la basede données "http: / /www.w3.orglTR/xhtml11/DTD/xhtmll1.drd,,,
et chargez le nom d'utilisateuret MDS 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
du mot de passe.Si la personne,dont le , head

nomd'utilisateur est cherché,n'existepas, title PHPSolutions : : hmac md5 /title,


meta http-equiv="Content-Type"
retournezla valeur -3. Sinon,vérifiezsi content="text/htm]; charset:utf_g" /
. scrrpt type="text/javascript"
s r c = " m d 5 .j s " . . / s c r l p t ,
le mot de passeenvoyéest correctselon scrlpt type=" text/ j avascr j-pt"
que le navigateur de I'utilisateur
a effectué function g,i6r, return document.getEl-ementByldiidr
la fonctionJavaScript. Si le mot de passe function parseForm, j
correspond, retournezle nom d'utilisateul Vêr u = Si'username'), p = $:'password,),.

sinon,retournezla valeur4. Les valeurs if u.valge == t'


a l e r t ' S a i s i s s e z I e n o md \ ' u t j . l i s a t e u r . ' r ;
numériques négatives susmentionnées
u.focus: j ; return fal-se;
sont employéesdans la partieprincipale
du codepourafficherle messaged'erreur if ip.value -= " : l
approprié.Si la valeur retournéepar la a f e r t i ' S a i s i s s e z l _ em o t d e p a s s e . ' t , .
p.focusr r ; return false,.
fonctiondolosin est une chaîne de ca-
ractères,traitezJacommeun nom d'utili- p . v a l u e = h e x h m a c m d 5i $ j . v a l u e , h e x _ m d Si p . v a f u e t ) . .
"key'
sateuret enregistrez-la dans la variabte $(' js' j.vaLue = 1,. return true,.
de sessionen redirigeant en mêmetemps
I'utilisateursur la page du panneaude /script ,/head; body
php
I'administration. Enfin, modifiezla valeur
if I !enrptyiSerrorString) ;
de la variablede la clé, en y enregistrant echo' div id="errqr"',$errorString.',t/div,',.
unenouvelle valeurunique.
Résumons:vous avez créé un petit :form metho6="post'r action="rogin.php" onsubmit="return parseFormo,,;..-.div
' Lnput type="hidden" name="key"
script avec de grandes fonctionnalités id=")çsy" vaLue="
: ? p h p e c h o $ _ S E S S I O[N' k e y ' ) ? , " .
à I'aided'uneseulefonctionde hachage. /
.:InPut type="hidden" name="jSil id="jstr value="0"
Ce scriptgarantitaux utilisateurs connec- . : l a b e l f o r = " u s e r n a m e " : , 1 q 6d
/).
p' u t i l i s a t e u r :.:/IabeI,
tés à votre serviceun niveau élevé de ",input type="textÙ name="username" id=t'usernamer' /.>..bt / ;.
sécurité.Regardezuneautrefonction,dis- :IabeI for='tpasslvord",Mot de passe :.:/labeI>
poniblenativement en PHp,permettant de :rnput type="pass$rord,' name="password" id="passlvordr,
/..,,.br /..,
.lrnput type="submit" value="OK" /...
chiffrerles chaînesde caractèresà l,aide
, / d i v > , / f o r m , . :/ b o d y : , , / h t m l ,
desalgorithmes, commeDESet Blowfish.
ll s'agitde la fonctioncrypr.

www.phpsolmag.org PHP SofutionsN'4/2006


basésur le protocoleHTTPet I'algorithme Tableau 1. Algorithmesdisponiblesnativementen PHP etvia I'extensionMHASH
DES.
Le principedu fonctionnement de tout
systèmed'authentification est quasi identi- ALDER32 X. MHASHADLER32
que.Unefois le nom d'utilisateuret le mot
de passeprécisés,le script compareces X-MHASH GOST
GOST
donnéesaux informationsstockéesdans
la base de données ou dans le fichier.
HAVALI60 X- MHASH HAVALI6O
Pourdes raisonsde sécurité,le mot de
passede I'utilisateur n'estpas stockésous
formevisible: le hachagedu mot de passe HAVAL256 X-MHASH HAVAL2Sô
est enregistrédans la base de données.
Afinde créerce type de hachage,utilisez MD5 X - md5( ), mdS_file() X-MHASH MDs
h fonctioncrtpr. Elle est disponiblepar
défautdans toute installationde PHP, il
X-sha1( ), shal_file() X-MHASH SHA1
n'estdonc pas nécessairede modifierpar
exemple le fichierde configuration.
Dansun premiertemps,crêezun sim- TIGER X - MHASHTIGER
pleexemplebasésur la fonctionc'ypt. Le
Listing4 présenteson codesource. TIGERI60 X- MHASHTIGERI6O
À chaquechargementde la page ou
du script,vous obtiendrezune valeur unl le processusde créationdu hachage.Le employépour la valeurà deux caractères
quede hachage. llen estainsicarunesui- employédépenddu
choixde I'algorithme de la variable$satr et I'algorithme DES,
te de caractèresaléatoire,gsatr, est créée deuxièmeargumentd'appelde la fonction version étendue- pour la valeur à neuf
à chaquefois ; elleest indispensable dans analysée.L'algorithmeDES standardest caractères.Afin d'utiliserI'algorithmeMDS,

Listing 3. CodePHPdu sysfèmede ænnexionsécurisée


<?PhP // JavaScript a été utilisé
function dologin() i if ($js) r
reguire'hmac_mdS.php' ;
// Le non et l-e not de passe non renseignés if (hmac_mdS($row i 'password' J, $key) !=
if (eryty($_PosTIrusernamer ] ) | | $ P O S TI r p a s s w o r d r : )
- - F t y ( $ _ P O S TI ' p a s s w o r d r I ) ) return -4;
return -1; i else i
$ j s = $ _ P O S [T' j s ' ] ; if ( 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 )

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


I

// La cLé envoyée dans la requête HTTP // La connexion a réussi, nous retournons

// ne correspond pas à celle // le nom dtutilisateur


// enregistrée dans -la sessjon return $rowI rusernamet ] ;
if ( $ k e y ! = $ _ P o S T[ ' k e y ' ] )
return -2; session start O;
t';
$errorStrj-ng =
// recherche de l'enregistrenent de 1'adninistrateur $loginResult = dologinO,'
// du non saisi sritch ($loginResult) {
$ 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 ' ,
'passwordt
) case -1: break;
case -2: $errorString =
rLa valeur de la cIé incorrecter; break;
or die 1nyeql_error () ) ;
ryegl_select_db (' test
r, $mysql_handle) case -3: $errorString =
rLe nom d\tutilisateur incorrect',' break;
or die (rysql-error O);
$rnysql_result = uyaql_qrery('SELECT username' password case -4: $errorString =
tLe mot de passe incorrect'; break;
FROMadmin
WHEREusernême = rr' .mysql_real_escape_etring(
$ _ P O S T [ ' u s e r n a m e 'J , $ m y s q l _ h a n d l e ) . " " ); default:
$ SESSIONI'username'l = $loginResult;
// Itbsence de 1'enregistrement de l'adninistrateut header ( 'Location:
// du non d'utiTisateur saisi http: / /server . com/admin/panel . php' ) ;
if (uycql_nun_rors ($mysql_result) == 0) die();
return -3; l

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


// validation du not de passe se.lon gue

N' 4/2006
PtlPSolutions www.phpsolmag.org
la variable$salt doit comprendre douze Cr y p t o gr a ph i e présentecommentinstalleret configurer
caractèresavec la chaîne$1$au début. a v a n c é e M C r y p t - la bibliothèque.
ll s'agira de seize caractèresqui com- MCryptest une extensionPHP proposant MCryptest un outilpuissant.En vousy
mencentpar s2sou $2a$pourI'algorithme les méthodesqui permettentde chiffrer basant,vouscréerezdoncun exempleas-
Blowfish.La variablessat-r est ensuite les données à I'aide des algorithmes sez complexe.Vous écnrezune application
ajoutéeau hachagegénéré. commeDES,TripleDES, Blowfish, RC2et quivouspermettra de stockersurle serveur
Retournonsà notreexempleoù vous d'autres.La listedes algorithmes les plus les fichiersde touttypesousformechifirée.
créez un script d'authentification via le populaires,disponiblespour cette exten- Pourles chargersur le disquelocal,il fau-
protocoleHTTP.Les nomsd'utilisateurs et sion, se trouvedans le Tableau2. L'en- dra préciserun mot de passe,identique
leursmotsde passese trouverontdansle cadré lnstallationde l'ertension MCrypt à celuiutilisélors du chiftementdu docu-
fichiertexte(Listing5).
Mentionnons toutd'abordune caracté-
Listing 4. Exemplede l'utilisationde la fonctioncrypt
ristiqueintéressante de la fonctiollcrypt.
Si vous essayezde créerun hachagede php
l'information envoyéepar I'utilisateur (par $password:
rqwert!ri
'$lSabcde$','
exemple,le mot de passe)en précisant $sa1t =
$hash = crypt ! $password, $saItl ;
le hachagestockédans la base de don-
echo Shash;
néesou dansle fichier(modèledu mot de
passe)en tantQUê$sarr,la fonctiondevra
retoumerle même hachage.Cette situa- Listing 5. Format de données du fichier contenant les données des utilisateurs
' tionn'a lieuque si le motde passeprécisé
a d m i n : $ 1 $ L p 5. 2 / / . S U M L I A W J J B 9 f L R F .U 4 g S A w t
conespondà celuiutilisépourla première
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
fois pour créer le hachage.Utilisezcette
caractéristique dansvotrescriptd'authenti- Listing 6. Scnpf de validation de données /ors de l'autorisation
fication.N'oubliezpasque I'authentification
lphp
baséesur le protocoleHTTPestdisponible
d e f i n ei ' U S E R SF I L E ' , ' u s e r s . t x t ' r ;
seulementquandvotrePHPfonctionneen i f i i s s e t r $ _ S E R V E R ' P H P _ A U T H _ U S Er iR ' & & i s s e t i $ _ S E R V E R , ' P H P - A U T H - P W I ;'
tant que moduleApache.Si ce n'est pas
le cas (doncPHP fonctionneen tant que $ 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) ;)
CGI),votreexemplene fonctionnera pas. foreachi$users as $userl

Observezle Listing6. Dans un pre- ':',


$user = e:çloder trimi$useri , 21,'
mier temps, il faut vérifiersi I'utilisateur ifl$user 0 = = ' P H P A U T HU S E R ' j
$ SERVER
a envoyéson loginet sonmotde passe.S'il
ne I'a pas fait, envoyezles en-têtesHTTP i f i c r y p t ( $ _ S E R V E R' P H P _ À U T H _ P W '
, $user 1. . $user 1' r

appropriés pour demander au navigateur


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 " ' ) ;
d'afficherla fenêtre de connexionappre
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 ;
priée.Les mêmesen-têtessontenvoyéssi
exit,'
les donnéesde connexionsontinconectes.
Si I'utilisateur vous envoieles bonnesdon- break;
nées,il faut récupérerle contenudu fichier
qui sertde votrebaseet stockeles motsde
passedesutilisateurs. Séparezlesdonnées else
chargéesà l'aidede la fonctiollexprode€I1
séparantles nomsd'utilisateurs et les mots headeri'WWW-AuthenticateB : a s i c r e a l m = " P r i . v a t e " ' \;

de passe. La demièreétapeest une boucle headeri 'HTTP//1 .0 401 Unauthorized') ,'


exit,'
qui traversetous les enregistrements et vé-
peut
rifiesi I'utilisateur accétlerà la page en
question.Afin de vérifiersi le mot de passe
est conect,utilisezla caractéristique de la Listirrg 7^ Structurede Ia tablecontenantlesdonnéesdes fichierschiffrés
fonctioncrypt déct'itecidessus.
CREATETABLE I secure files' (
Comme vous pouvez le remarquer, 'id' int(11) unsigned NOTNULLauto_increment,
elle peut être employéesans problème 'name' varchar i100i default NttLL'
pour réaliserun simplesystèmed'authen- tm imc r vnot rr: rch3a iJ[ ) defaUlt NIILL,

tification.ll est toutefoisrecommandéd'uti- 'daIe' int '10I unsigned default ' 0 ',
'Iength' varchar i255; default r0',
liserles algorithmes commeMDSet SHAI
' key' varch ar ',32) default NULL,
(donc les fonctionsmd5,srrar)câr I'algo- 'data'text,
rithmeDES n'estpas aussicomplexe.De PRIMARYKEY { 'id')
plus,lorsde la créationdu hachage,seuls ) TYPE=MyISAM,'
8 premierscaractèressontutilisés.

www.phpsolmag.org PHP SolutionsN'4/2006


ment. Vous stockerez toutes les données Tabteari 2. Les algorithmesde chiffrement les pluspopulaires, disponiblesdans
(donc les fichiers chifirés et les informations l'extension MCrypt
détaillées les concemant, comme la taille
ou le type MIME)dans la base de données. MCRYPT 3DES DESdouble 168 64
Le Listing 7 présente une requête SQL, 96
MCRYPT THREEWAY 3way 96
chargée de créer un tableau adéquat. Les
MCRYPT BLOWFISH Blowfish do 448 64
colonnes appropriées stockeront le nom
MCRYPT CRYPT Chifrement 1M I
du fichier,la date d'ajout à la base, le type
MIME ainsique la tailledu fichieroriginal,la MCRYPT DES DES 56 64
clé et le fichiersous forme chifirée. MCRYPT GOST SowietGosudarswiennyj 256 64
MCRYPT IDEA Data
International 128 64
Quelquechose de très simple Algorithm
Encryption
pour commencer : chiffrer un MCRYPT SERPENT Serpent 128,192ou 256 128
fragment du texte MCRYPT TWOFISH Twofish 128,192ou 256 128
Avant de passer à I'implémentationde
votre stockage sécurisé de données, ob- vous utiliserez le mode ecn. Lê Tableau la clé, utilisée lors du chiffrement.La clé a
servez le schéma de fonctionnement et 3 présente tous les modes possibles de été coupée à une longueurmaximale,sup-
de fonctionnalités de I'extension MCrypt. chifirement ainsi que leurs descriptions. portée par I'algorithmesélectionné.Appelez
Le Listing 8 présente un exemple de code Enregistrez le résultat du fonctionnement ensuite la fonctionmcrypt seneric dont le
PHP dont I'objectif consiste à chiffrer la de la fonction analysée dans la variable résultat est une chaîne de caractères chif-
chaîne de caractères donnée à I'aide auxiliaire srd. L'étape suivante consiste frée. Ensuite, libérez la mémoire réservée
d'une clé et ensuite à la déchiffrer. à créer un vecteur d'initiationau moyen de à I'aide de la fonction mcrypt-generic-
Afin d'initialiserles mécanismes de la la fonctionmcrtæt_create_iv.Cette fonction deinir. Pour terminer le travail avec la bi-
bibliothèque Mcrypt, appelez la fonction nécessitela trailledu vecteuret la source de bliothèqueMcrypt,appelez mcrypt_module-
mcrypt_module_open ; elle prend en premier données aléatoires. ll est recommandé cr-ose.Le déchifrementdes informationsse
argument le nom de l'algorithmeque vous d'utiliser la constianteMcRyprRAI.Jo
car ceci déroule de manière quasi analogue à cette
voulez utiliser.Le deuxièmeet le quatrième fonctionneaussi bien sous Linux que sous difiérence près que vous utiliserezla fonc-
paramètre comprennent des chemins aux Windows. La bibliothèque MCrypt est ici tion mdec.yptseneric au lieu de la fonction
modules appropriés. lls permettent d'utili- prête à accepter les données à chifter. mcrypt seneric ; cette première prend les
ser I'algorithmedonné. Si vous les laissez Dans un premier temps, réservez I'espace mêmes argumentsque cette demière.
vides, comme dans I'exemple,les chemins adéquat dans la mémoire.Pour ce faire, uti-
définis dans le fichier de configuration lisez la foncti on mcr]æt_generic_init,êrl Dépôt sécurisé de données
php.ini seront alors utilisés. Le troisième lui transmettantles poignées du module et Puisquevous avez les notionsindispen-
argument définit le mode de chiftement; du vecteur d'initiationainsi que la valeur de sablesconcernantla bibliothèque MCrypt,
écrivez à présent les fonctions appro-
priéespour votreapplication.Le Listing9
présentele code sourcedu scriptde chif-
frementdu fichierenvoyé.
Avant d'ajouter un enregistrement
a saisila clé
à la table,vérifiezsi l'utilisateur
demandéeet si le fichiera été bienenvoyé
sur le serveur.Ensuite,créezle hachagede
la clé à I'aidede l'algorithme MDSpourvâ
rifierrapidementsi elle est conectelorsdu

Installation
MCrypt
de I'extension
Si vous disposez du système Win-
dows, vous avez sûrement le fichier
libmcrypt.arr disponibleà télécharger
sur le site httpt/ftp.emini.dUpub/php/
win32/mcryptl. ll faut le placer dans le
répertoirec:\wndorvs\system32\.Si vous
disposez d'un autre système, visitez le
site httpt/mcrypt.sourceforge.neV,télé-
chargez les sources de la bibliothèque
et compilez-les.Afin d'utiliserl'extension
MCrypt en PHP, compilez-laavec la di-
rective-with-mcrypt [=DrR]où DIR est
d'un stockagesécunséde fichierssurle serueursousforme
Figure 2. Apptication un cheminde la bibliothèquelibmcrypt.
chiffrée

www.phpsolmag.org PHP SolutionsN" 4/2006


chargementdu fichier. Vous éviterez ainsi Observez la fonction de chargement possiblede déchifirerle contenu du fichier.
qu'un utilisateurtélécharge un fichier pour des fichiers ajoutés auparavant. Dans un Ce processus ne se difière pas beaucoup
se rendre compte d'avoir confondu les clés premier temps, comparez la clé envoyée du simple chifirementet il vous a été déjà
et que le fichierest inutile.Une fois le fichier par I'utilisateurà celle attribuée au fichier présenté. Puisque I'utilisateurdoit disposer
chargé,chiffrezson contenu et ajoutez une donné. Si les clés (et en pratique, leurs d'une option permettant d'enregistrer le
entréeadéquateà la base de données. hachages MD5) sont identiques, il est fichier sur son disque, il est nécessaire
d'envoyer les entêtes appropriés à son
par l'extension
Tableau3. Modesde chiffrementsupportés MCrypt navigateur.Pour ce faire, utilisez la fonc-
tion headeret les en-têtescontent-rype êt
MCRYPTMODE ECB Modede livresélectroniques conrent-DisposiLion. A la fin, avant d'gn-
voyer le contenu du fichier, il faut suppri-
MCRYPT MODE CBC Mode de chiffrementpar chaînagede blocs
mer les caractèresvides que les fonctions
MCRYPTMODE CFB à rétroaction
Modede chiffrement
de chiffrementpeuvent laisser à la fin du
MCRYPT MODE OFB Mode de chiffrementà rétroactionde sortiede B bits fichier. Ces caractères peuvent provoquer
MCRYPTMODE NOFB Modede chiffrement de sortiede n bits
à rétroaction des problèmes ultérieursdans sa lecture.
MCRYPT MODE STREAM Mode de chiffrementde flux Puisque vous connaissezla longueur du
fichier original,vous pouvez I'effectuersans
problèmeau moyen de la fonctionsubsrr.
MCrypt
Listing 8. Exemplecommentutiliserl'extension L'exemple présenté a démontré
que vous pouviez chiffre vos données
php
rapidement et les stocker dans la base.
// Notre clé et chaine de caractères à chiffrer
$key :
'cIé secrète'; ll peut s'agiraussi bien des mots de passe
'données confidentj.elles à chiffrer'; que des contenus de fichiers entiers.
$plain text =
// tnitiaLisation des mécanismes de chiffrenent N'oubliez pas toutefois que le processus
'blowfish', ' ', 'ecb', ' '
S t d = m c r y p t m o d u l - eo p e n ;
de chiffrementd'un fichier de 40Mo peut
$key = substr $key, 0, mcrypr enc get key size $td
mcrypt create iv mcrypt enc get iv size $td, MCRYPT RAND
charger considérablementle processeuret
$iv:
// Chiffrenent provoquerune surcharge de la mémoire,
mcrypt_generj-c_init $td, $key, $iv,; attribuée à PHP. Le message d'erreur
$encrypted = mcrypt generic Std, SpIain text ; s'afficheraalors et le script interromprason
mcrypr generrc deinit Std;
fonctionnement. La durée de chiffrement
echo $encrypted;
peut être longue si vous sélectionnezun
/ / Déchiffrenent
mcrypt generic init $td, $key, Siv,,' algorithmecomplexe. Une bonne solution
$decrypted = mdecrypt generic Std, $encrypted ; consiste alors à chiffrer les blocs indivi-
mcrypt_generic_deinit $td ; duels de données. Pour connaîtrela taille
echo $dgç;yp1sd;
du bloc pour un algorithmede chiffrement,
mcrypt_module_close $td .
vous disposez de la fonctionmcrypr_ser_
bfock size OU mcrypt enc get bl-ock

Listing 9. Scrpf de chiffrementdu fichier envoyé sl-ze.

php
9fiIe: S FILES r f i l o l
Conclusion
if $file 'error' =: UPLOADERR OK && lEttPtY $ POST Nous avons présentédans cet article
une partieseulementdes fonctionnalités
i f l ! e t n P t yr $ _ P O S T ' n a m e ' ) j des fonctionscryptographiquesque vous
$fife 'name, = $ POST'name' ,. pouvezutilisezdansles applications
PHP.
SkeY = nd5 $-P.ST 'keY' ';
Dans nos exemples,nous vous avons
Sdata = file_get_contents SfiIe 'tmp_name','
$td = mcrypt module open,rdesr, " ,
'ecb', ' 'r
,'
expliquécommentprotégerles donnéeset
$subkey = substr Skey, 0, mcrypt enc get key size $td ; créer des systèmesd'authentification
sé-
$iv_size = mcrypt_enc_get_iv_size Std ; curisée.Dansles prochainsarticles,nous
Siv = mcrypt_create_iv,$iv_size, MCRYPT_RÀN
; D, vous parleronsnotammentde la bibliothè-
mcrypt generic init $td, $subkey, $iv ;
que OpenSSLet de I'envoides courriels
9encrypted_data = mcrypt_generic $td, $datar ;
mcrypt generic deinit Std; sécurisésdepuisPHP.r
m.rrfni- mnrirr I e nl nca $gd ,'

r n y s q l _ g u e r y " I N S E R TI 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 ' ,


' Iength' 'key' 'datar i Sur Internet
, ,
V A L U E Si ' { $ 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 ,
'
. - MCrypt
http://php.net/mcrypf
{$file['size' ] )','$key', "'.mysql*reaI_escape*string
( $ e n c r y p t e d _ d a t a ) . r r r\ ' r r o r d i e ' m y s q l _ e r r o r , I , '
. - MHash
http://php.net/mhash
. - PHP Security
http://phpsec.org/
Consortium

PHP SolutionsN" 4/2006 www.phpsolmag.org

Vous aimerez peut-être aussi