Cryptographie en PHP : chiffrement et hachage — guide complet

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 — guide complet



Dans le développement web moderne, la sécurité des données est l'une des priorités clés. PHP offre des outils intégrés puissants pour la protection cryptographique : du simple hachage de mots de passe au chiffrement asymétrique complexe. Dans cet article, nous allons examiner les approches principales, les bibliothèques et les meilleures pratiques pour travailler avec la cryptographie en PHP.



1. Hachage des données



Le hachage est une transformation irréversible des données en une chaîne de longueur fixe. Il est utilisé pour stocker les mots de passe, vérifier l'intégrité des fichiers et créer des signatures numériques.



1.1. Hachage des mots de passe (password_hash)



Depuis PHP 5.5, il est recommandé d'utiliser la fonction password_hash() pour le hachage des mots de passe. Elle sélectionne automatiquement un algorithme robuste (par défaut bcrypt) et génère un sel.



<?php// Hachage du mot de passe$password = 'MySecurePassword123!';$hash = password_hash($password, PASSWORD_DEFAULT);

echo "Hash : " . $hash . "";

// Vérification du mot de passeif (password_verify($password, $hash)) { echo "Mot de passe correct !";} else { echo "Mot de passe incorrect !";}?>


1.2. Hachage avec hash()



Pour d'autres usages (par exemple, les sommes de contrôle de fichiers), utilisez la fonction hash() avec les algorithmes SHA-256, SHA-512 ou BLAKE2.



<?php$data = "Données secrètes";$sha256_hash = hash('sha256', $data);$blake2b_hash = hash('blake2b', $data);

echo "SHA-256 : " . $sha256_hash . "";echo "BLAKE2b : " . $blake2b_hash . "";?>


2. Chiffrement symétrique



Le chiffrement symétrique utilise la même clé pour chiffrer et déchiffrer les données. En PHP, l'extension OpenSSL est utilisée à cette fin.



2.1. Chiffrement avec AES-256-GCM (chiffrement authentifié)



Le mode recommandé est AES-256-GCM, qui assure la confidentialité et la vérification de l'intégrité.



<?php$plaintext = "Message confidentiel";$key = random_bytes(32); // Clé de 256 bits$iv = random_bytes(12);  // Vecteur d'initialisation de 96 bits

// Chiffrement$ciphertext = openssl_encrypt( $plaintext, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $iv, $tag);

echo "Données chiffrées (base64) : " . base64_encode($ciphertext) . "";echo "Tag d'authentification : " . bin2hex($tag) . "";

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

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


2.2. Chiffrement avec AES-256-CBC (pour la compatibilité)



Si une compatibilité avec les anciens systèmes est nécessaire, utilisez AES-256-CBC avec HMAC pour vérifier l'intégrité.



<?phpfunction encryptAesCbc($plaintext, $key) {    $iv = random_bytes(16);    $ciphertext = openssl_encrypt($plaintext, 'aes-256-cbc', $key, OPENSSL_RAW_DATA, $iv);    $hmac = hash_hmac('sha256', $iv . $ciphertext, $key, true);    return base64_encode($hmac . $iv . $ciphertext);}

function decryptAesCbc($data, $key) { $data = base64_decode($data); $hmac = substr($data, 0, 32); $iv = substr($data, 32, 16); $ciphertext = substr($data, 48); $expectedHmac = hash_hmac('sha256', $iv . $ciphertext, $key, true); if (!hash_equals($hmac, $expectedHmac)) { throw new Exception("Intégrité des données compromise !"); } return openssl_decrypt($ciphertext, 'aes-256-cbc', $key, OPENSSL_RAW_DATA, $iv);}

$key = random_bytes(32);$encrypted = encryptAesCbc("Données secrètes", $key);echo "Chiffré : " . $encrypted . "";echo "Déchiffré : " . decryptAesCbc($encrypted, $key) . "";?>


3. Chiffrement asymétrique



Le chiffrement asymétrique utilise une paire de clés : une clé publique (pour le chiffrement)

Recommendations