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)
Aussi dans la bibliothèque
Envoi d'email en Rust : bibliothèques lettre et mailparse pour les courriels
Migrations de bases de données en C++ : aperçu des outils et bibliothèques
Traitement d'images en C++ : redimensionnement et recadrage avec la bibliothèque OpenCV
Client OAuth pour TypeScript : authentification via GitHub, Google et autres fournisseurs