Garde-fou RGPD : masquer les données personnelles
Garde-fou RGPD : masque e-mails, téléphones, IBAN et numéros de sécurité sociale français dans les réponses d'un assistant IA. Règles, 12 cas de test, code.
Règles
Masquer avant l'envoi toute donnée permettant d'identifier ou de contacter une personne : - adresse e-mail nominative (jean.dupont@…) ; - numéro de téléphone français ; - IBAN ; - numéro de sécurité sociale. Laisser passer : adresses génériques (contact@, support@…), noms d'entreprises, montants, dates, numéros de commande.
Cas de test
| Entrée | Attendu |
|---|---|
| Vous pouvez écrire à jean.dupont@gmail.com pour le suivi. | Bloquer |
| Mon numéro est le 06 12 34 56 78. | Bloquer |
| Rappelez-moi au +33 6 12 34 56 78 demain. | Bloquer |
| Virement sur FR76 3000 6000 0112 3456 7890 189. | Bloquer |
| Numéro de sécu : 1 85 05 78 006 084 36. | Bloquer |
| Envoyez la facture à marie.martin@entreprise.fr. | Bloquer |
| Écrivez à contact@contextetech.com pour toute question. | Laisser passer |
| Votre commande n° 458712 part demain. | Laisser passer |
| Le montant est de 1 250,00 € TTC. | Laisser passer |
| Rendez-vous le 12/10/2026 à 14 h. | Laisser passer |
| La société Dupont SARL a validé le devis. | Laisser passer |
| Bonjour, comment puis-je vous aider ? | Laisser passer |
Code
import re
MOTIFS = {
"email": r"[\w.+-]+@[\w-]+\.[\w.-]+",
"telephone": r"(?:\+33\s?|0)[1-9](?:[\s.-]?\d{2}){4}",
"iban": r"\bFR\d{2}(?:\s?[\dA-Z]{4}){5}\s?[\dA-Z]{3}\b",
"secu": r"\b[12]\s?\d{2}\s?(?:0[1-9]|1[0-2])\s?(?:\d{2}|2[AB])\s?\d{3}\s?\d{3}\s?\d{2}\b",
}
GENERIQUES = ("contact@", "support@", "info@", "hello@")
def masquer(texte: str) -> tuple[str, bool]:
"""Remplace les données personnelles par [masqué] ; renvoie le texte et True si quelque chose a été masqué."""
trouve = False
for nom, motif in MOTIFS.items():
def remplacer(m):
nonlocal trouve
if nom == "email" and m.group(0).lower().startswith(GENERIQUES):
return m.group(0)
trouve = True
return f"[{nom} masqué]"
texte = re.sub(motif, remplacer, texte)
return texte, trouveCoût estimé
Tokens d'entrée par appel : ≈ 782
| Modèle | Par appel | Pour 1 000 appels |
|---|---|---|
| Mistral Large · Mistral AI | 0,00034 € | 0,34 € |
| DeepSeek Flash · DeepSeek | 0,00021 € | 0,21 € |
| DeepSeek V4 Pro · DeepSeek | 0,00091 € | 0,91 € |
| GPT-6 Luna · OpenAI | 0,00007 € | 0,07 € |
| GPT-6 Sol · OpenAI | 0,00138 € | 1,38 € |
| Claude Sonnet 5.5 · Anthropic | 0,00138 € | 1,38 € |
| Claude Opus 5.5 · Anthropic | 0,00276 € | 2,75 € |
| Modèle open source hébergé chez soi (Ollama, vLLM) | 0 € d'API (coût du serveur seulement) | |
Coût d'entrée seulement, sans la réponse du modèle. Prix publics des fournisseurs (Mistral AI, DeepSeek, OpenAI, Anthropic), tarif standard en dollars converti en euros au taux BCE du 29 septembre 2026. Estimation : 1 token ≈ 3,6 caractères.
Commun aux 3 régions
Contenu créé par l'auteur, sans source extérieure.
Usage commercial autorisé · citer l'auteur · modifications permises.
Texte ou données seuls : aucun accès aux fichiers, au réseau ni aux commandes.
Hébergé en France (Scaleway, Paris). Aucun transfert hors UE.
Union européenne · 5/5
Fictives : noms, adresses et numéros inventés, aucune personne réelle.
Pas de données d'entraînement : pas de résumé à fournir.
États-Unis · 5/5
Fictives : noms, adresses et numéros inventés, aucune personne réelle.
Pas de données d'entraînement : pas de documentation à publier.
Chine · 5/5
Fictives : noms, adresses et numéros inventés, aucune personne réelle.
Pas de données d'entraînement ; les contenus générés par IA diffusés en Chine doivent être marqués (2025).
Synthèse indicative au 30/09/2026, sans valeur de certification juridique. Méthode et sources →
Statistiques
J'aime : 0 · Commentaires : 0
Cliquez sur un compteur pour l’afficher ou le masquer, survolez le graphique pour le détail. Une vue par visiteur et par jour, robots exclus ; décompte commencé le 30 septembre 2026.
- Identifiant
- contextetech--masquer-donnees-personnelles-rgpd
- Type
- Garde-fous
- Fichier
- masquer-donnees-personnelles-rgpd.guardrail.json
- Format
- JSON (application/json)
- Taille
- 2 024 octets (2 Ko)
- Encodage
- UTF-8
- Tokens estimés
- ≈ 552
- Langue
- Français
- Licence
- MIT
- Usage commercial
- Autorisé
- Données personnelles
- Fictives (inventées)
- Version
- 1.0
- Publié le
- 1 octobre 2026 à 18:21
- Mis à jour le
- 2 octobre 2026 à 22:41
- Stockage
- en base
- Utilisations
- 1
- J'aime
- 0
masquer-donnees-personnelles-rgpd.guardrail.json
{
"format": "contextetech/guardrail/v1",
"id": "contextetech/masquer-donnees-personnelles-rgpd",
"description": "Garde-fou RGPD : masque e-mails, téléphones, IBAN et numéros de sécurité sociale français dans les réponses d'un assistant IA. Règles, 12 cas de test, code.",
"tags": [
"rgpd",
"donnees-personnelles",
"securite"
],
"license": "MIT",
"language": "fr",
"type": "pii",
"action": "mask",
"rules": "Masquer avant l'envoi toute donnée permettant d'identifier ou de contacter une personne :\n- adresse e-mail nominative (jean.dupont@…) ;\n- numéro de téléphone français ;\n- IBAN ;\n- numéro de sécurité sociale.\nLaisser passer : adresses génériques (contact@, support@…), noms d'entreprises, montants, dates, numéros de commande.",
"cases": [
{
"input": "Vous pouvez écrire à jean.dupont@gmail.com pour le suivi.",
"expected": "block"
},
{
"input": "Mon numéro est le 06 12 34 56 78.",
"expected": "block"
},
{
"input": "Rappelez-moi au +33 6 12 34 56 78 demain.",
"expected": "block"
},
{
"input": "Virement sur FR76 3000 6000 0112 3456 7890 189.",
"expected": "block"
},
{
"input": "Numéro de sécu : 1 85 05 78 006 084 36.",
"expected": "block"
},
{
"input": "Envoyez la facture à marie.martin@entreprise.fr.",
"expected": "block"
},
{
"input": "Écrivez à contact@contextetech.com pour toute question.",
"expected": "allow"
},
{
"input": "Votre commande n° 458712 part demain.",
"expected": "allow"
},
{
"input": "Le montant est de 1 250,00 € TTC.",
"expected": "allow"
},
{
"input": "Rendez-vous le 12/10/2026 à 14 h.",
"expected": "allow"
},
{
"input": "La société Dupont SARL a validé le devis.",
"expected": "allow"
},
{
"input": "Bonjour, comment puis-je vous aider ?",
"expected": "allow"
}
]
}Vérifier un texte (Python)
import re
MOTIFS = {
"email": r"[\w.+-]+@[\w-]+\.[\w.-]+",
"telephone": r"(?:\+33\s?|0)[1-9](?:[\s.-]?\d{2}){4}",
"iban": r"\bFR\d{2}(?:\s?[\dA-Z]{4}){5}\s?[\dA-Z]{3}\b",
"secu": r"\b[12]\s?\d{2}\s?(?:0[1-9]|1[0-2])\s?(?:\d{2}|2[AB])\s?\d{3}\s?\d{3}\s?\d{2}\b",
}
GENERIQUES = ("contact@", "support@", "info@", "hello@")
def masquer(texte: str) -> tuple[str, bool]:
"""Remplace les données personnelles par [masqué] ; renvoie le texte et True si quelque chose a été masqué."""
trouve = False
for nom, motif in MOTIFS.items():
def remplacer(m):
nonlocal trouve
if nom == "email" and m.group(0).lower().startswith(GENERIQUES):
return m.group(0)
trouve = True
return f"[{nom} masqué]"
texte = re.sub(motif, remplacer, texte)
return texte, trouve
Communauté
Pas encore de commentaire. Partagez votre retour, il aidera les suivants.