YBET informatique

Rue Albert 1er, 7

6810 Pin - Chiny

Route Arlon - Florenville

(/fax: 061/32.00.15

Les formations sur la création de sites internet et les langagues

Magasin YBET informatique   Comment créer un site

26. Le cryptage des données en PHP.

1 Introduction - 2. Méthodes d'encryptage - 3. Exemple d'utilisation

Lorsque nous avons utilisé les Cookies, nous n'avons pas coder le mot de passe. Ceci pose quelques problèmes de sécurité. Cette partie va nous permettre d'étudier quelques fonctions. J'essayerais d'être le plus simple possible. Pourtant, les fonctions PHP permettant de crypter et de décrypter un texte sont suffisamment nombreuses pour en rebuter plus d'un. En plus, les fonctions PHP permettent une multitude de possibilités liées à la méthode de cryptage (encore une bonne raison d'essayer de faire simple en n'en voyant que quelques unes).

Reprenons la gestion des cookies comme vu précédemment lors de la connexion d'un utilisateur (sans la partie vérification dans la base de donnée). Dans l'exemple ci-dessous, le nom du cookies est YBET. Le contenu reprend le login suivi de -pw- puis seulement le mot de passe. Nous avons volontairement supprimé le timestamp pour ne pas compliquer. Cette partie vérifie donc la présence du cookies ybet, et récupère le login et mot de passe s'il n'existe pas.

if(!isset($_COOKIE['ybet']))
{
echo"Vous n'êtes pas encore inscrit ou connecté";
}else{
$cookies=$_COOKIE['ybet'];
$cookies_array=array();
$cookies_array=Explode("-pw-",$cookies);
$login=$cookies_array[0];
$password=$cookies_array[1];
)

A l'inverse, lorsque nous récupérons le login et le mot de passe dans la base de donnée, la création du cookie est

Setcookie('ybet',$login."-pw-".$password);

2. Méthodes d'encryptage.

Dans le cas général, le cryptage utilise une clé. C'est une suite de lettres (ou une phrase) qui est connue des deux parties. Dans notre cas, la clé est uniquement connue par le serveur qui crypte le mot de passe lors de la création et le décrypte lors de la récupération par le cookies.

D'un autre coté, il y a différentes méthodes, on parle d'algorithme, du plus simple au plus compliqué.

En dernier, il y a la méthode de gestion du login et du mot de passe (vous pouvez éventuellement ne crypter que le mot de passe).

La fonction (ou plutôt la bibliothèque) mcrypt accessible depuis PHP 4.0.2 permet une large panoplie d'algorithmes de chiffrement, tels que DES, DES, TripleDES, Blowfish (par défaut), 3-WAY, SAFER-SK64, SAFER-SK128, TWOFISH, TEA, RC2 et GOST en modes CBC, OFB, CFB et ECB. Elle accepte également RC6 et IDEA qui ne sont pas considérés comme libres de droits. La majorité utilisent un chiffrement sur 64 bits.

La commande de chiffrement est:

$texte_chiffre = mcrypt_encrypt($algo, $clef, $texte, $mode, $iv);

où:

  • $algo est l'algorithme utilisé, différentes variables sont associées (voire ci-dessous)
  • $clef est la clé de chiffrement, connue uniquement par le serveur. C'est une phrase de 64 bits (lettres) maximum.
  • $texte, le texte (mot de passe, login, ...) à chiffrer.
  • $mode, est spécifique à chaque méthode de chiffrement (algorithme).
  • $iv est un vecteur d'initialisation utilisé pour quelques modes (CBC, CFB, OFB, et dans certains algorithmes de mode STREAM). Si ce vecteur est nécessaire, la fonction renvoie une alerte et utilise une suite de caractère \0

La commande de déchiffrement est:

$texte_dechiffre = mcrypt_decrypt($algo,$clef,$texte_chiffre,$mode,$iv);

où:

  • $algo est l'algorithme utilisé
  • $clef est la clé de chiffrement, connue uniquement par le serveur. C'est une phrase de 64 bits (lettres) maximum.
  • $texte_chiffre est le texte à décrypter. 
  • $mode, est spécifique à chaque méthode de chiffrement (algorithme).
  • $iv est le vecteur d'initialisation.

Les modes de chiffrement et de déchiffrage doivent forcément être les mêmes!.

Des variables sont préprogrammées pour les différentes méthodes de cryptage comme par exemple::
  • MCRYPT_MODE_CBC pour le mode CBC
  • MCRYPT_BLOWFISH
  • MCRYPT_CAST_256
  • MCRYPT_DES
  • MCRYPT_TRIPLEDES
  • .....

Au niveau du mode de cryptage, on en retrouve 4 utilisables avec la commande Mcrypt:

  • cfb, associé à MCRYPT_MODE_CFB, chiffrement par flux de clés qui est ensuite appliqué sur le texte, le flux suivant est obtenu à partir du précédant bloc,  iv obligatoire
  • ofb, associé à MCRYPT_MODE_OFB, similaire au mode cfb, iv obligatoire
  • cbc, associé à MCRYPT_MODE_CBC, enchaînement des blocs avec une fonction OU exclusif avec le chiffrage du bloc précédant, iv optionnel
  • ecb, associé à MCRYPT_MODE_ECB, la méthode la plus simple. Le texte est découpé en blocs cryptés les uns après les autres.
  • nofb, associé à la variable MCRYPT_MODE_NOFB, identique à OFB mais plus sécurisé, avec iv.

3. Exemples d'utilisation.

Une remarque, certaines erreurs sont liées au paramétrage du fichier php.ini et tous les algorithme ne sont pas implantés sur tous les serveurs. EasyPhp n'accepte normalement aucune méthode de chiffrement. Ces tests doivent dont être exécutés directement sur un serveur Internet.

Commençons par un cryptage simple, algorythme BLOWFICH en mode CBC (donc sans vecteur d'initialisation)

<?php
echo "------------ mode CBC";

$algo = MCRYPT_BLOWFISH;
$mode = MCRYPT_MODE_CBC;

$key_size = mcrypt_module_get_algo_key_size($algo);
$iv = mcrypt_create_iv(mcrypt_get_iv_size($algo, $mode), MCRYPT_RAND);

// choix d'une clé secrète de cryptage/décryptage et mise à longueur
$cle= "Ceci est la clé du cryptage utilisée par nous";
$cle= substr($cle, 0, $key_size);
// Phrase à crypter et cryptage
$texte= "texte à crypter";
$chiffre= mcrypt_encrypt($algo, $cle, $texte, $mode,$iv);
// Décryptage de contrôle
$dechiffre = mcrypt_decrypt($algo, $cle, $chiffre, $mode,$iv);
// affichage de contrôle
echo "<p>Texte à crypter: <b>".$texte. "</b></p><p> Texte chiffre: <b>" .$chiffre. "</b></p>
<p> Mot de passe décrypter: <b>" .$dechiffre."</b><br />";

?>

Une autre méthode utilisant un vecteur d'initialisation, plus sécurisée mais plus complexe à mettre en oeuvre:

<?php
echo "------------ BLOWFISH avec mode NOFB -----------";

// choix d'un algo, mode
$algo = MCRYPT_BLOWFISH;
$mode = MCRYPT_MODE_NOFB;
// calcul des longueurs max de la clé et de l'IV
$key_size = mcrypt_module_get_algo_key_size($algo);
$iv = mcrypt_create_iv(mcrypt_get_iv_size($algo, $mode), MCRYPT_RAND);
// choix d'une clé secrète de chiffrement et mise à longueur suivant l'algorithme et le mode associé
$cle= "Ceci est la clé du cryptage utilisée par nous";
$cle= substr($cle, 0, $key_size);
// Phrase à crypter et cryptage
$texte= "Mon mot de passe à crypter";
$chiffre= mcrypt_encrypt($algo, $cle, $texte, $mode, $iv);
// Décryptage
$dechiffre = mcrypt_decrypt($algo, $cle, $chiffre, $mode, $iv);
// affichage
echo "

Mot de passe à crypter: ".$texte. "


Mot de passe crypté: " .$chiffre. "


Mot de passe décrypté: " .$dechiffre."

";
?>

Le résultat nous donne:

------------ BLOWFISH mode CBC ------------------

Mot de passe à chiffrer: texte à crypter

Mot de passe chiffre:

Mot de passe déchiffrer:

------------ BLOWFISH avec mode NOFB -----------

Mot de passe à crypter: Mot de passe à crypter

Mot de passe crypté:

Mot de passe décrypté:

Pas très difficile en théorie, tant que vous avez correctement sélectionner les paramètres. Il ne reste plus qu'à l'implanter dans la gestion des cookies et la relier à la table utilisateurs. Mais çà c'est une autre histoire.

Cette partie va être modifiée dans les semaines qui viennent, la gestion ci-dessus du cryptage - décryptage ne fonctionne pas avec les dernières versions de PHP 5.3, avec en plus des messages d'erreurs.

> 26.1 . Les cookies avec contenu crypté
<25 . Gestion FTP, dossiers et fichiers en FTP

Mise en ligne: 27/03/2008