Le cryptage des données : encoder, hacher, chiffrer
Distinguer l'encodage (Base64), le hachage (SHA-256, bcrypt) et le chiffrement (AES), choisir le bon outil selon le besoin, chiffrer une donnée sensible dans la base avec openssl_encrypt (AES-256-GCM), gérer la clé, et protéger les données en transit (HTTPS) et au repos (disques, sauvegardes).
1Situer
Le service client de Souk Atlas doit parfois vérifier la CIN d'un client professionnel. Elle doit être stockée, relue par les personnes autorisées... et illisible pour quiconque volerait la base. Pour cela, il faut le bon outil : beaucoup de sites « cryptent » avec Base64, qui ne cache rien du tout.
2Comprendre
Encoder, hacher, chiffrer : trois opérations différentes
Au départ, une donnée sensible : le numéro de CIN AB123456.
1 / 4
Trois opérations à ne pas confondre
Réversible ?
Secret nécessaire ?
Usage
En PHP
Encodage
oui, par tous
non
transporter des octets dans du texte
base64_encode, urlencode
Hachage
non
non (ou une clé pour un HMAC)
empreintes, intégrité, mots de passe
hash('sha256'), password_hash
Chiffrement
oui, avec la clé
oui, la clé
cacher une donnée qu’on devra relire
openssl_encrypt / openssl_decrypt
Chiffrer une donnée dans la base
Pour chiffrer avec PHP, il faut trois éléments, en plus de la clé :
un IV (vecteur d’initialisation) aléatoire, de 12 octets pour GCM, différent à chaque chiffrement ;
le tag d’authentification, 16 octets, produit par le chiffrement ;
le texte chiffré.
On les colle ensemble puis on encode le tout en Base64 pour le ranger dans une colonne texte. Ici, Base64 ne sert qu’au transport, la protection vient d’AES.
Générer la clé avec random_bytes(32), jamais à partir d’un mot de passe court.
La ranger dans une variable d’environnement ou un fichier hors du dossier web, jamais dans le dépôt Git.
Garder la base et la clé à des endroits différents : une sauvegarde de la base ne doit pas contenir la clé.
En transit et au repos
En transit : tout échange passe par HTTPS (TLS), y compris la connexion entre l’application et la base si elles sont sur des serveurs différents (leçon C.3).
Au repos : chiffrement des disques des ordinateurs portables (BitLocker, FileVault), des sauvegardes, et des colonnes sensibles comme ici.
Exemple simple
Traduire, broyer, enfermer
Encoder, c'est traduire un texte en arabe : quiconque connaît l'alphabet le relit. Hacher, c'est passer le document au broyeur : on ne le reconstruit pas, mais deux feuilles identiques donnent les mêmes confettis. Chiffrer, c'est l'enfermer dans un coffre : seul le détenteur de la clé le ressort.
Exemple simple
Le coffre et la clé sous le paillasson
Un coffre-fort ne sert à rien si la clé est scotchée dessus. Chiffrer la base avec une clé écrite dans le même dossier, c'est la clé sous le paillasson : la protection dépend surtout de l'endroit où l'on range la clé.
Publicité
3Manipuler
Le formulaire enregistre la CIN du client... encodée en Base64, ce qui ne protège rien. Remplacez chiffrer() et dechiffrer() par un vrai chiffrement AES-256-GCM avec la clé de config.php.
Pas à pas dans le lab ↗Cliquez sur Exécuter : PHP 8.3 démarre dans votre navigateur (environ 5 Mo à télécharger, une seule fois).
La page s'affichera ici.
Le navigateur demandera /index.php au serveur, qui exécutera le PHP et renverra du HTML.
Entre le navigateur et le serveuraucun échange pour l'instant
Consignes 0 / 3
La base ne contient plus la CIN en clair ni en simple Base64
La page voir.php retrouve « CIN : AB123456 » en déchiffrant
Deux enregistrements de la même CIN donnent deux valeurs chiffrées différentes
4Pratiquer
Exercice 1 · Le bon outil
Pour chaque besoin, choisissez : encodage, hachage (password_hash ou hash), ou chiffrement. (a) stocker les mots de passe ; (b) stocker le numéro de téléphone pour l'afficher au livreur ; (c) mettre une image dans un JSON ; (d) vérifier qu'un fichier téléchargé n'a pas été modifié ; (e) stocker l'IBAN d'un fournisseur pour lui faire des virements.
Voir le corrigé
(a) Hachage lent et salé : password_hash / password_verify. On n'a jamais besoin de relire le mot de passe.
(b) Chiffrement (ou simple protection d'accès si le risque est faible) : on doit pouvoir relire le numéro.
(c) Encodage Base64 : il ne s'agit pas de cacher, mais de transporter des octets dans du texte.
(d) Hachage rapide : hash('sha256', ...) ou hash_file, comparé à l'empreinte publiée.
(e) Chiffrement : AES-256-GCM avec une clé stockée hors de la base.
Exercice 2 · Vérifier une empreinte
Le site d'un logiciel publie l'empreinte SHA-256 de son installateur. Écrivez le PHP qui vérifie le fichier téléchargé.
Voir le corrigé
<?php$attendu='9f2c...'; // empreinte publiée par l'éditeur$calcule=hash_file('sha256', __DIR__ .'/installateur.zip');
echohash_equals($attendu, $calcule) ?'Fichier intact':'ATTENTION : fichier modifié ou corrompu';