Aller au contenu
M08 · B. Assurer la confidentialité des données

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
AB123456 base64QUIxMjM0NTY= réversible par tous hachage$2y$10$Xk… sens unique, on compare AES + 🔑9fK2…pQ== réversible avec la clé

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 ?UsageEn PHP
Encodageoui, par tousnontransporter des octets dans du textebase64_encode, urlencode
Hachagenonnon (ou une clé pour un HMAC)empreintes, intégrité, mots de passehash('sha256'), password_hash
Chiffrementoui, avec la cléoui, la clécacher une donnée qu’on devra relireopenssl_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.

function chiffrer(string $clair): string
{
    $iv = random_bytes(12);
    $chiffre = openssl_encrypt($clair, 'aes-256-gcm', CLE, OPENSSL_RAW_DATA, $iv, $tag);
    return base64_encode($iv . $tag . $chiffre);
}

La clé, le vrai secret

  • 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é.

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 serveur aucun échange pour l'instant

Consignes 0 / 3

  1. La base ne contient plus la CIN en clair ni en simple Base64
  2. La page voir.php retrouve « CIN : AB123456 » en déchiffrant
  3. 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');
echo hash_equals($attendu, $calcule) ? 'Fichier intact' : 'ATTENTION : fichier modifié ou corrompu';

5Vérifier

1. Base64 est-il un chiffrement ?
2. Quelle opération ne peut pas être inversée ?
3. Pourquoi utiliser un IV (vecteur d'initialisation) aléatoire à chaque chiffrement ?