Un code remplace le nom : est-ce anonyme ?
La pseudonymisation remplace les identifiants directs d'une personne par un code. L'anonymisation va plus loin : plus personne ne peut retrouver la personne. La différence compte, car des données pseudonymisées restent des données personnelles.
Cette leçon vous apprend à remplacer des identifiants, puis à juger honnêtement si le résultat est anonyme.
À la fin de cette leçon
Remarque
Je peux pseudonymiser des données et juger si le résultat est anonyme.
Mots clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Pseudonymisation | remplacer un identifiant direct par un code | |
| Anonymisation | rendre impossible de retrouver la personne | |
| Empreinte | un texte fixe calculé à partir d'une donnée, sans retour possible | SHA2 |
| Sel | un texte secret ajouté avant de calculer l'empreinte | |
| Généralisation | remplacer une valeur précise par une plus large | date → année |
| Petit groupe | un groupe de une ou deux personnes |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Pseudonymiser, c'est remplacer l'identifiant par un code
On retire le nom, le courriel et le téléphone, et on met à la place un code : C001, C002 ou une empreinte.
Les lignes restent reliées entre elles. On peut compter, trier et suivre une personne dans le temps sans savoir qui elle est.
Mais la personne reste retrouvable pour qui détient la table de correspondance. Les données restent donc personnelles.
Fabriquer des codes dans le laboratoire
Lancez les deux premiers Runs pour préparer le terminal. Le troisième remplace l'identifiant de trois clients par un code numéroté.
Les deux derniers calculent des empreintes SHA2. La première mesure leur longueur. La seconde vérifie que la même entrée donne toujours la même empreinte.
Accepter le certificat du serveur
printf '[client]\nssl-verify-server-cert=0\n' > ~/.my.cnfAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Un nom court pour la boutique
alias sql='mariadb -h db -u student -pstudent shop -t -e'Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Remplacer l'identifiant par un code
sql "SELECT CONCAT('C', LPAD(id, 3, '0')) AS pseudo, city FROM customers ORDER BY id LIMIT 3"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
La longueur d'une empreinte
sql "SELECT LENGTH(SHA2('abc', 256)) AS longueur"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Même entrée, même empreinte
sql "SELECT SHA2('abc', 256) = SHA2('abc', 256) AS meme_entree, SHA2('abc', 256) = SHA2('abd', 256) AS entree_modifiee"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Exemple : trois façons de remplacer un identifiant
| Méthode | Exemple | Le risque |
|---|---|---|
| Code numéroté | C001 | La table de correspondance retrouve tout |
| Empreinte seule | 64 caractères | On calcule celle de chaque courriel connu et on compare |
| Empreinte avec sel | 64 caractères | Si le sel est volé, le risque revient |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Un petit groupe désigne une personne
Même sans identifiant direct, une personne seule dans son groupe est reconnaissable. Il suffit qu'on connaisse sa ville et son année d'inscription.
La généralisation réduit ce risque. On remplace une date par une année, ou une ville par un pays. Les groupes grossissent.
Les trois Runs comptent les clients seuls de leur groupe, de moins en moins précis.
Les villes qui n'ont qu'un client
sql "SELECT city, COUNT(*) AS n FROM customers GROUP BY city HAVING n < 2 ORDER BY city"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Seuls par ville et année
sql "SELECT COUNT(*) AS seuls FROM (SELECT 1 FROM customers GROUP BY city, YEAR(joined_on) HAVING COUNT(*) = 1) AS t"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Seuls par pays et année
sql "SELECT COUNT(*) AS seuls FROM (SELECT 1 FROM customers GROUP BY country, YEAR(joined_on) HAVING COUNT(*) = 1) AS t"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Exemple : plus on généralise, moins on isole
| Colonnes gardées | Clients seuls de leur groupe | Sur 40 clients |
|---|---|---|
| Ville et mois d'inscription | 30 | Trois sur quatre |
| Ville et année d'inscription | 10 | Un sur quatre |
| Pays et année d'inscription | 1 | Un seul |
| Pays seul | 0 | Aucun |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Une erreur fréquente
Attention
Beaucoup pensent qu'un code à la place du nom rend les données anonymes. Ce n'est pas le cas : la table de correspondance, ou le croisement des autres colonnes, retrouve la personne. Les données ne sont anonymes que si personne ne peut plus la retrouver.
À vous : une empreinte avec un sel
import hashlib
def pseudonyme(courriel, sel):
# Le sel est ajouté avant le calcul de l'empreinte.
texte = sel + courriel
return hashlib.sha256(texte.encode("utf-8")).hexdigest()[:12]
print(pseudonyme("[email protected]", "grain-secret"))
print(pseudonyme("[email protected]", "grain-secret"))
print(pseudonyme("[email protected]", "autre-grain"))
# Les deux premières lignes sont identiques : même courriel, même sel.
# À vous : changez le sel de la première ligne et comparez.