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 des données



La sécurité des applications web est l’une des tâches clés du développeur. PHP fournit des outils intégrés puissants pour la protection cryptographique des données. Dans cet article, nous aborderons deux directions principales : le chiffrement (transformation des données avec possibilité de restauration inverse) et le hachage (transformation unidirectionnelle pour vérifier l’intégrité).



1. Hachage en PHP



Le hachage est utilisé pour stocker les mots de passe, les sommes de contrôle et vérifier l’intégrité des données. En PHP, les fonctions password_hash() et hash() sont utilisées à ces fins.



1.1. Hachage sécurisé des mots de passe



N’utilisez jamais md5 ou sha1 pour stocker les mots de passe. Utilisez l’algorithme bcrypt via password_hash() :



<?php// Hachage du mot de passe$password = 'MySecureP@ss123';$hash = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]);

echo $hash; // $2y$12$...

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


La fonction password_hash() génère automatiquement un sel et utilise un algorithme sécurisé. Le paramètre cost ajuste la complexité de calcul (recommandé 10-12).



1.2. Hachage de données arbitraires



Pour vérifier l’intégrité des fichiers ou des données, utilisez les algorithmes SHA-256 ou SHA-3 :



<?php$data = "Données importantes à vérifier";$hash_sha256 = hash('sha256', $data);$hash_sha3_256 = hash('sha3-256', $data);

echo "SHA-256 : " . $hash_sha256 . PHP_EOL;echo "SHA3-256 : " . $hash_sha3_256 . PHP_EOL;

// Vérification de l’intégrité du fichier$file_hash = hash_file('sha256', '/chemin/vers/fichier.zip');echo "Hachage du fichier : " . $file_hash;?>


2. Chiffrement symétrique en PHP



Le chiffrement symétrique utilise une seule clé pour chiffrer et déchiffrer les données. PHP prend en charge OpenSSL et Sodium.



2.1. Chiffrement via OpenSSL (AES-256-GCM)



Le mode recommandé est AES-256-GCM, qui assure l’authentification des données :



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

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

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

echo "Données originales : " . $data . PHP_EOL;echo "Données déchiffrées : " . $decrypted . PHP_EOL;echo "Tag d’authentification : " . bin2hex($tag);?>


Important : conservez $key et $iv (ou leur combinaison) pour le déchiffrement. Le tag $tag vérifie l’intégrité des données.



2.2. Chiffrement via Sodium (libsodium)



Depuis PHP 7.2, Sodium fait partie du noyau. Il est plus simple et plus sécurisé :



<?php$data = "Informations confidentielles";$key = sodium_crypto_secretbox_keygen(); // Génération de la clé$nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);

// Chiffrement$ciphertext = sodium_crypto_secretbox($data, $nonce, $key);

// Déchiffrement$decrypted = sodium_crypto_secretbox_open($ciphertext, $nonce, $key);

echo "Chiffré : " . base64_encode($ciphertext) . PHP_EOL;echo "Déchiffré : " . $decrypted . PHP_EOL;

// Nettoyage de la mémoiresodium_memzero($key);?>


3. Chiffrement asymétrique (RSA)



Le chiffrement asymétrique utilise une paire de clés (publique/privée). Il est utilisé pour la transmission sécurisée des données :



<?php// Génération des clés$config = [    'private_key_bits' => 2048,    'private_key_type' => OPENSSL_KEYTYPE_RSA,                    

Recommendations