Garde-fou : masquer clés d'API et mots de passe
# Garde-fou : masquer clés d'API et mots de passe code: 108x85u | type: guardrail | language: fr | licence: MIT | version: v1 description: Garde-fou qui masque clés d'API, jetons, mots de passe, clés privées et chaînes de connexion avant d'envoyer un texte, un fichier ou un export à une IA. Règles, 14 cas de test, code. page: https://contextetech.com/garde-fous/masquer-secrets-cles-api-108x85u mcp: connect https://contextetech.com/mcp then call load_resource with code "108x85u" (or ask "load 108x85u") json: https://contextetech.com/api/resources/contextetech--masquer-secrets-cles-api python: pip install contexte && contexte get 108x85u citation (required by the licence): contextetech. (2026). Garde-fou : masquer clés d'API et mots de passe (Version 1) [Garde-fou]. Contexte Tech. https://contextetech.com/garde-fous/masquer-secrets-cles-api-108x85u
Garde-fou qui masque clés d'API, jetons, mots de passe, clés privées et chaînes de connexion avant d'envoyer un texte, un fichier ou un export à une IA. Règles, 14 cas de test, code.
Règles
Masquer avant l'envoi à l'IA tout secret qui donne accès à un compte ou à un service : - clés d'API (OpenAI, Anthropic, Mistral, Stripe, AWS…) et jetons d'accès (GitHub, JWT) ; - mots de passe écrits en clair (mot_de_passe=…, password: …) ; - clés privées (-----BEGIN … PRIVATE KEY-----) ; - identifiants dans une adresse (postgres://utilisateur:motdepasse@serveur). Laisser passer : les valeurs d'exemple (VOTRE_CLE, xxx, <clé>), les adresses sans identifiant, les identifiants de commande ou de commit, le texte qui parle de mots de passe sans en contenir. À appliquer avant de coller un fichier .env, un export de base ou des journaux dans un assistant.
Cas de test
| Entrée | Attendu |
|---|---|
| AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE | Bloquer |
| token: ghp_000000000000000000000000000000000000 | Bloquer |
| ANTHROPIC_API_KEY=sk-ant-00000000000000000000000000000000 | Bloquer |
| STRIPE_SECRET=sk_live_0000000000000000000000 | Bloquer |
| DATABASE_URL=postgres://admin:S3cretPass@db.internal:5432/app | Bloquer |
| -----BEGIN RSA PRIVATE KEY----- MIIEpAIBAAKCAQEA0000000000000000 -----END RSA PRIVATE KEY----- | Bloquer |
| Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIwMDAwMDAifQ.0000000000000000000000 | Bloquer |
| mot_de_passe = Soleil2026! | Bloquer |
| Le mot de passe doit faire au moins 12 caractères. | Laisser passer |
| Remplacez VOTRE_CLE_API par la clé de votre compte. | Laisser passer |
| La documentation est sur https://docs.exemple.fr/api. | Laisser passer |
| Le commit a1b2c3d corrige le bug de connexion. | Laisser passer |
| Commande n° 2026-10-458712 expédiée. | Laisser passer |
| Connectez-vous avec votre compte habituel. | Laisser passer |
Code
import re
PATTERNS = {
"private_key": r"-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z ]*PRIVATE KEY-----",
"aws_key": r"\bAKIA[0-9A-Z]{16}\b",
"github_token": r"\bgh[pousr]_[A-Za-z0-9]{36,}\b",
"llm_api_key": r"\bsk-(?:ant-|proj-)?[A-Za-z0-9_-]{20,}\b",
"stripe_key": r"\b[sr]k_(?:live|test)_[A-Za-z0-9]{16,}\b",
"jwt": r"\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b",
"url_credentials": r"\b[a-z][a-z0-9+.-]*://[^\s:/@]+:[^\s@/]+@",
"password_assignment": r"(?i)\b(?:password|passwd|pwd|secret|api_?key|token|mot_de_passe|mdp)\s*[:=]\s*[\"']?[^\s\"']{6,}",
}
PLACEHOLDERS = ("xxx", "...", "<", "your", "votre", "example_value")
def mask_secrets(text: str) -> tuple[str, bool]:
"""Remplace les secrets par [type masqué] ; renvoie le texte et True si quelque chose a été masqué."""
found = False
for name, pattern in PATTERNS.items():
def repl(m):
nonlocal found
if any(p in m.group(0).lower() for p in PLACEHOLDERS):
return m.group(0)
found = True
return f"[{name} masqué]"
text = re.sub(pattern, repl, text)
return text, found- Identifiant
- contextetech--masquer-secrets-cles-api
- Fichier
- masquer-secrets-cles-api.guardrail.json
- Format
- JSON (application/json)
- Taille
- 2 645 octets (2,6 Ko)
- Encodage
- UTF-8
- Tokens estimés
- ≈ 726
- Usage commercial
- Autorisé
- Données personnelles
- Aucune
- Version
- 1.0
- Publié le
- 10 octobre 2026 à 04:24
- Mis à jour le
- 16 octobre 2026 à 23:20
- Stockage
- en base
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.
Coût estimé
- Tokens d'entrée par appel
- ≈ 1 073
| Modèle | Par appel | Par mois |
|---|---|---|
| GPT-6 Luna · OpenAImeilleur prix | 0,00009 € | 0,09 € |
| DeepSeek Flash · DeepSeek | 0,00028 € | 0,28 € |
| Mistral Large · Mistral AI | 0,00047 € | 0,47 € |
| DeepSeek V4 Pro · DeepSeek | 0,00125 € | 1,25 € |
| GPT-6 Sol · OpenAI | 0,00189 € | 1,89 € |
| Claude Sonnet 5.5 · Anthropic | 0,00189 € | 1,89 € |
| Claude Opus 5.5 · Anthropic | 0,00378 € | 3,78 € |
| 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 13 octobre 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
Aucune donnée personnelle.
Pas de données d'entraînement : pas de résumé à fournir.
États-Unis · 5/5
Aucune donnée personnelle.
Pas de données d'entraînement : pas de documentation à publier.
Chine · 5/5
Aucune donnée personnelle.
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 →
Qualité du contenu
Le détail des critères est réservé aux membres.
Chaque critère, les points retirés et un conseil pour corriger.
Analyse du contenu
Le détail des critères est réservé aux membres.
Chaque critère, les points retirés et un conseil pour corriger.
Calculé à partir du contenu de la fiche, par règles, sans IA. La note est dans l'onglet Qualité.
MCP contexte
https://contextetech.com/mcp
charge 108x85u
Ajoutez l'adresse comme connecteur dans les pages des applications d'IA, puis envoyez la demande ci-dessus.
API
import json, urllib.request url = "https://contextetech.com/api/resources/contextetech--masquer-secrets-cles-api" fiche = json.load(urllib.request.urlopen(url)) print(fiche["title"] or fiche["name"])
masquer-secrets-cles-api.guardrail.json
{
"format": "contextetech/guardrail/v1",
"id": "contextetech/masquer-secrets-cles-api",
"description": "Garde-fou qui masque clés d'API, jetons, mots de passe, clés privées et chaînes de connexion avant d'envoyer un texte, un fichier ou un export à une IA. Règles, 14 cas de test, code.",
"license": "MIT",
"language": "fr",
"type": "other",
"action": "mask",
"rules": "Masquer avant l'envoi à l'IA tout secret qui donne accès à un compte ou à un service :\n- clés d'API (OpenAI, Anthropic, Mistral, Stripe, AWS…) et jetons d'accès (GitHub, JWT) ;\n- mots de passe écrits en clair (mot_de_passe=…, password: …) ;\n- clés privées (-----BEGIN … PRIVATE KEY-----) ;\n- identifiants dans une adresse (postgres://utilisateur:motdepasse@serveur).\nLaisser passer : les valeurs d'exemple (VOTRE_CLE, xxx, <clé>), les adresses sans identifiant, les identifiants de commande ou de commit, le texte qui parle de mots de passe sans en contenir.\nÀ appliquer avant de coller un fichier .env, un export de base ou des journaux dans un assistant.",
"cases": [
{
"input": "AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE",
"expected": "block"
},
{
"input": "token: ghp_000000000000000000000000000000000000",
"expected": "block"
},
{
"input": "ANTHROPIC_API_KEY=sk-ant-00000000000000000000000000000000",
"expected": "block"
},
{
"input": "STRIPE_SECRET=sk_live_0000000000000000000000",
"expected": "block"
},
{
"input": "DATABASE_URL=postgres://admin:S3cretPass@db.internal:5432/app",
"expected": "block"
},
{
"input": "-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKCAQEA0000000000000000\n-----END RSA PRIVATE KEY-----",
"expected": "block"
},
{
"input": "Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIwMDAwMDAifQ.0000000000000000000000",
"expected": "block"
},
{
"input": "mot_de_passe = Soleil2026!",
"expected": "block"
},
{
"input": "Le mot de passe doit faire au moins 12 caractères.",
"expected": "allow"
},
{
"input": "Remplacez VOTRE_CLE_API par la clé de votre compte.",
"expected": "allow"
},
{
"input": "La documentation est sur https://docs.exemple.fr/api.",
"expected": "allow"
},
{
"input": "Le commit a1b2c3d corrige le bug de connexion.",
"expected": "allow"
},
{
"input": "Commande n° 2026-10-458712 expédiée.",
"expected": "allow"
},
{
"input": "Connectez-vous avec votre compte habituel.",
"expected": "allow"
}
]
}Vérifier un texte (Python)
import re
PATTERNS = {
"private_key": r"-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z ]*PRIVATE KEY-----",
"aws_key": r"\bAKIA[0-9A-Z]{16}\b",
"github_token": r"\bgh[pousr]_[A-Za-z0-9]{36,}\b",
"llm_api_key": r"\bsk-(?:ant-|proj-)?[A-Za-z0-9_-]{20,}\b",
"stripe_key": r"\b[sr]k_(?:live|test)_[A-Za-z0-9]{16,}\b",
"jwt": r"\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b",
"url_credentials": r"\b[a-z][a-z0-9+.-]*://[^\s:/@]+:[^\s@/]+@",
"password_assignment": r"(?i)\b(?:password|passwd|pwd|secret|api_?key|token|mot_de_passe|mdp)\s*[:=]\s*[\"']?[^\s\"']{6,}",
}
PLACEHOLDERS = ("xxx", "...", "<", "your", "votre", "example_value")
def mask_secrets(text: str) -> tuple[str, bool]:
"""Remplace les secrets par [type masqué] ; renvoie le texte et True si quelque chose a été masqué."""
found = False
for name, pattern in PATTERNS.items():
def repl(m):
nonlocal found
if any(p in m.group(0).lower() for p in PLACEHOLDERS):
return m.group(0)
found = True
return f"[{name} masqué]"
text = re.sub(pattern, repl, text)
return text, found
Communauté
Pas encore de commentaire. Partagez votre retour, il aidera les suivants.