Cryptographie en PHP : chiffrement et hachage (guide pratique)

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Cryptographie en PHP : chiffrement et hachage de données



Dans le développement web moderne, la sécurité des données n'est pas une option, mais une exigence obligatoire. PHP offre un arsenal puissant d'outils pour la protection cryptographique, divisé en deux directions principales : le chiffrement (transformation réversible des données) et le hachage (transformation irréversible). Dans cet article, nous examinerons les bibliothèques et fonctions clés de PHP pour ces deux tâches avec des exemples pratiques.



1. Concepts de base de la cryptographie en PHP



Avant de passer au code, il est important de distinguer deux types d'opérations :

  • Le chiffrement — transformation des données avec possibilité de restaurer le texte original à l'aide d'une clé. Utilisé pour transmettre des informations confidentielles.
  • Le hachage — transformation unidirectionnelle où il est impossible de restaurer les données originales. Utilisé pour stocker les mots de passe et vérifier l'intégrité.


PHP utilise les extensions openssl (pour le chiffrement) et password_hash/hash (pour le hachage).



2. Chiffrement des données en PHP



2.1. Chiffrement symétrique (AES)



L'algorithme le plus populaire est AES-256-GCM, qui offre des performances élevées et une authentification intégrée.



<?php// Chiffrement$data = "Message secret";$key = openssl_random_pseudo_bytes(32); // Clé de 256 bits$iv = openssl_random_pseudo_bytes(12);  // Vecteur de 96 bits pour GCM

$encrypted = openssl_encrypt( $data, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $iv, $tag);

// Encodage en base64 pour la transmission$encrypted_base64 = base64_encode($iv . $tag . $encrypted);

// Déchiffrement$decoded = base64_decode($encrypted_base64);$iv = substr($decoded, 0, 12);$tag = substr($decoded, 12, 16);$ciphertext = substr($decoded, 28);

$decrypted = openssl_decrypt( $ciphertext, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $iv, $tag);

echo "Déchiffré : " . $decrypted; // Message secret?>


Important : N'utilisez jamais le mode ECB — il n'est pas sécurisé. Utilisez toujours GCM ou CBC avec HMAC.



2.2. Chiffrement asymétrique (RSA)



Pour l'échange de clés et les signatures numériques, on utilise RSA. PHP utilise une paire de clés (publique/privée).



<?php// Génération des clés$config = [    "private_key_bits" => 2048,    "private_key_type" => OPENSSL_KEYTYPE_RSA,];$res = openssl_pkey_new($config);openssl_pkey_export($res, $privateKey);$publicKey = openssl_pkey_get_details($res)['key'];

// Chiffrement avec la clé publique$data = "Données confidentielles";openssl_public_encrypt($data, $encrypted, $publicKey);

// Déchiffrement avec la clé privéeopenssl_private_decrypt($encrypted, $decrypted, $privateKey);

echo $decrypted; // Données confidentielles?>


3. Hachage des mots de passe



Le hachage des mots de passe est une tâche critique. PHP fournit des fonctions spécialisées qui choisissent automatiquement le sel et le coût de calcul.



3.1. bcrypt (recommandé par défaut)



La fonction password_hash() avec l'algorithme PASSWORD_BCRYPT crée un hachage sécurisé avec un sel automatique.



<?php$password = "UserPassword123!";

// Hachage$hash = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]);echo "Hachage : " . $hash . ""; // $2y$12$...

// Vérificationif (password_verify($password, $hash)) { echo "Mot de passe correct !";} else { echo "Mot de passe incorrect";}

// Vérification de la nécessité de rehacherif (password_needs_rehash($hash, PASSWORD_BCRYPT, ['cost' => 12])) { $newHash = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]);}?>


3.2. Argon2 (standard moderne)



Depuis PHP 7.2

Recommendations