Scripts et Programmation

PHP : Chiffrer et déchiffrer des données

Table des matières

Introduction



Dans cet article, nous allons voir comment chiffrer et déchiffrer des données en PHP.
L'idée est de pouvoir stocker ces données en base.

On va identifier 2 cas.

1 : Le premier cas est le chiffrement de données qui ont besoin d'être déchiffrées plus tard. L'idée est de stocker l'information de façon chiffrée en base afin d'éviter le vol d'information en cas de fuite de la base. Cependant, on aura besoin de déchiffrer cette info pour la mettre à disposition au travers de notre interface web.
2 : Le deuxième cas est le chiffrement de données qui n'ont pas besoin d'être déchiffrées. Ce cas d'usage est pour stocker un mot de passe. On chiffrera la donnée, mais on n'a pas besoin de connaitre la donnée originale. Dans le cas d'un mot de passe, la vérification de l'exactitude de la donnée consistera à rejouer le chiffrement et comparer les chaines chiffrées. De plus, l'administrateur de l'interface web et de la base de données n'a pas à connaitre cette information.


Chiffrer une information



Ici, nous aurons besoin de chiffrer une donnée pour la stockée en base de façon sécurisée.

On va dans un premier temps, se définir une clé de chiffrement :

Code PHP :
$encryption_key="super_cle_de_chiffrement_de_donnees";


On va ensuite évidemment récupérer le texte à chiffrer envoyé depuis le formulaire :
Code PHP :
$text=$_POST['text'];


Pour chiffrer la chaine $text, on va utiliser une fonction dans PHP qui nous permet de chiffrer : openssl_encrypt

Code PHP :
$encrypted_text = openssl_encrypt($text, 'aes-256-cbc', $encryption_key);

Le premier argument est la donnée à chiffrer évidemment.
Le deuxième argument est la méthode de chiffrement. On peut récupérer la liste des méthodes disponibles via openssl_get_cipher_methods. J'ai utilisé ici aes-256-cbc
Le troisième argument est notre clé de chiffrement.

On pourra par la suite envoyer dans la base de données le contenu de cette variable $encrypted_text.

Maintenant, pour déchiffrer la donnée, après l'avoir récupérée (de la base de données par exemple), on pourra la déchiffrer avec la fonction openssl_decrypt. On aura besoin de la clé de chiffrement évidemment :

Code PHP :
$decrypted_text = openssl_decrypt($encrypted_text, 'aes-256-cbc', $encryption_key);


Et à ce stade, la variable $decrypted_text contient le texte déchiffré, qui a été initialement saisi.


Chiffrer les mots de passe



Dans cet exemple, on récupère le mot de passe envoyé depuis le formulaire :

Code PHP :
$mdp=$_POST['mdp'];


Pour chiffrer la chaine $mdp, et qu'elle ne soit pas déchiffrable, on va créer un hash. Il existe une fonction dans PHP faite pour cela : password_hash.
Cette fonction est beaucoup plus fiable que de transformer la chaîne avec les fonctions md5 ou sha1.

On chiffrera comme ceci :

Code PHP :
$hash_mdp = password_hash($mdp, PASSWORD_DEFAULT);


PASSWORD_DEFAULT est la définition de l'algorithme de hashage. Il s'agit de bcrypt depuis PHP 5.5. Il faut prévoir un champ de 255 caractères dans la base de données, si l'algorithme change dans les versions suivantes de PHP.
On pourra par la suite envoyer dans la base de données le contenu de cette variable $hash_mdp.

Par définition, avec un hash, on ne pourra pas retrouver la chaine d'origine. Pour vérifier une saisie du mot de passe avec l'information en base, on utilisera la fonction dédiée à cela : password_verify.

Après lecture de la variable $mdp (depuis la saisie du formulaire) et la lecture de la variable $hash_mdp (depuis le champ de la base de données), on pourra utiliser cette fonction. Elle renvoie true si le mot de passe et le hashage correspondent :

Code PHP :
if ( password_verify($mdp, $hash_mdp) )
{
        echo "MDP CORRECT";
}

Cette page a été vue 9317 fois