Schutzregel: API-Schlüssel und Passwörter maskieren
# Schutzregel: API-Schlüssel und Passwörter maskieren code: lbmeln | type: guardrail | language: de | licence: MIT | version: v1 description: Schutzregel, die API-Schlüssel, Tokens, Passwörter, private Schlüssel und Verbindungszeichenfolgen maskiert, bevor ein Text, eine Datei oder ein Export an eine KI geht. Regeln, 14 Testfälle, Code. page: https://contextetech.com/de/schutzregeln/geheimnisse-api-schluessel-maskieren-lbmeln mcp: connect https://contextetech.com/mcp then call load_resource with code "lbmeln" (or ask "load lbmeln") json: https://contextetech.com/api/resources/contextetech--geheimnisse-api-schluessel-maskieren python: pip install contexte && contexte get lbmeln citation (required by the licence): contextetech. (2026). Schutzregel: API-Schlüssel und Passwörter maskieren (Version 1) [Schutzregel]. Contexte Tech. https://contextetech.com/de/schutzregeln/geheimnisse-api-schluessel-maskieren-lbmeln
Schutzregel, die API-Schlüssel, Tokens, Passwörter, private Schlüssel und Verbindungszeichenfolgen maskiert, bevor ein Text, eine Datei oder ein Export an eine KI geht. Regeln, 14 Testfälle, Code.
Regeln
Vor dem Senden an die KI jedes Geheimnis maskieren, das Zugang zu einem Konto oder Dienst gibt: - API-Schlüssel (OpenAI, Anthropic, Mistral, Stripe, AWS…) und Zugriffstokens (GitHub, JWT); - Passwörter im Klartext (passwort=…, password: …); - private Schlüssel (-----BEGIN … PRIVATE KEY-----); - Zugangsdaten in einer Adresse (postgres://nutzer:passwort@server). Durchlassen: Platzhalter (IHR_API_SCHLUESSEL, xxx, <schlüssel>), Adressen ohne Zugangsdaten, Bestell- oder Commit-Nummern, Text über Passwörter ohne ein Passwort. Anwenden, bevor eine .env-Datei, ein Datenbankexport oder Logs in einen Assistenten kopiert werden.
Testfälle
| Eingabe | Erwartet |
|---|---|
| AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE | Blockieren |
| token: ghp_000000000000000000000000000000000000 | Blockieren |
| ANTHROPIC_API_KEY=sk-ant-00000000000000000000000000000000 | Blockieren |
| STRIPE_SECRET=sk_live_0000000000000000000000 | Blockieren |
| DATABASE_URL=postgres://admin:S3cretPass@db.internal:5432/app | Blockieren |
| -----BEGIN RSA PRIVATE KEY----- MIIEpAIBAAKCAQEA0000000000000000 -----END RSA PRIVATE KEY----- | Blockieren |
| Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIwMDAwMDAifQ.0000000000000000000000 | Blockieren |
| passwort = Sommer2026! | Blockieren |
| Das Passwort muss mindestens 12 Zeichen lang sein. | Zulassen |
| Ersetzen Sie IHR_API_SCHLUESSEL durch den Schlüssel Ihres Kontos. | Zulassen |
| Die Dokumentation steht unter https://docs.beispiel.de/api. | Zulassen |
| Commit a1b2c3d behebt den Anmeldefehler. | Zulassen |
| Bestellung Nr. 2026-10-458712 wurde versandt. | Zulassen |
| Melden Sie sich mit Ihrem üblichen Konto an. | Zulassen |
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|passwort|kennwort)\s*[:=]\s*[\"']?[^\s\"']{6,}",
}
PLACEHOLDERS = ("xxx", "...", "<", "your", "ihr_", "example_value")
def mask_secrets(text: str) -> tuple[str, bool]:
"""Ersetzt Geheimnisse durch [Typ maskiert]; gibt den Text und True zurück, wenn etwas maskiert wurde."""
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} maskiert]"
text = re.sub(pattern, repl, text)
return text, found- Kennung
- contextetech--geheimnisse-api-schluessel-maskieren
- Datei
- geheimnisse-api-schluessel-maskieren.guardrail.json
- Format
- JSON (application/json)
- Größe
- 2.651 Bytes (2,6 KB)
- Kodierung
- UTF-8
- Geschätzte Tokens
- ≈ 731
- Kommerzielle Nutzung
- Erlaubt
- Personenbezogene Daten
- Keine
- Version
- 1.0
- Veröffentlicht am
- 10. Oktober 2026 um 04:24
- Aktualisiert am
- 16. Oktober 2026 um 23:20
- Speicherung
- in der Datenbank
Statistiken
Gefällt mir : 0 · Kommentare : 0
Klicken Sie auf einen Zähler, um ihn ein- oder auszublenden; fahren Sie über das Diagramm für Details. Ein Aufruf pro Besucher und Tag, ohne Bots; Zählung seit dem 30. September 2026.
Geschätzte Kosten
- Eingabe-Tokens pro Aufruf
- ≈ 1.072
| Modell | Pro Aufruf | Pro Monat |
|---|---|---|
| GPT-6 Luna · OpenAIbester Preis | 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 € |
| Selbst gehostetes Open-Source-Modell (Ollama, vLLM) | 0 € API-Kosten (nur Serverkosten) | |
Nur Eingabekosten, ohne die Antwort des Modells. Öffentliche Standardpreise der Anbieter (Mistral AI, DeepSeek, OpenAI, Anthropic) von USD in Euro umgerechnet zum EZB-Kurs vom 13. Oktober 2026. Schätzung: 1 Token ≈ 3,6 Zeichen.
Gemeinsam für alle 3 Regionen
Vom Autor erstellt, ohne externe Quelle.
Kommerzielle Nutzung erlaubt · Autor nennen · Änderungen erlaubt.
Nur Text oder Daten: kein Zugriff auf Dateien, Netzwerk oder Befehle.
Gehostet in Frankreich (Scaleway, Paris). Keine Übermittlung außerhalb der EU.
Europäische Union · 5/5
Keine personenbezogenen Daten.
Keine Trainingsdaten: keine Zusammenfassung erforderlich.
Vereinigte Staaten · 5/5
Keine personenbezogenen Daten.
Keine Trainingsdaten: keine Dokumentation zu veröffentlichen.
China · 5/5
Keine personenbezogenen Daten.
Keine Trainingsdaten; in China verbreitete KI-generierte Inhalte sind zu kennzeichnen (2025).
Unverbindliche Übersicht, Stand 30/09/2026, keine rechtliche Zertifizierung. Methode und Quellen →
Qualität des Inhalts
Die Kriterien im Detail sind Mitgliedern vorbehalten.
Jedes Kriterium, die abgezogenen Punkte und ein Tipp zur Korrektur.
Inhaltsanalyse
Die Kriterien im Detail sind Mitgliedern vorbehalten.
Jedes Kriterium, die abgezogenen Punkte und ein Tipp zur Korrektur.
Aus dem Inhalt des Eintrags nach Regeln berechnet, ohne KI. Die Note steht im Reiter Qualität.
MCP contexte
https://contextetech.com/mcp
lade lbmeln
Die Adresse in den Einstellungen deiner KI-Apps als Connector hinzufügen und dann die Anfrage oben senden.
API
import json, urllib.request url = "https://contextetech.com/api/resources/contextetech--geheimnisse-api-schluessel-maskieren" fiche = json.load(urllib.request.urlopen(url)) print(fiche["title"] or fiche["name"])
geheimnisse-api-schluessel-maskieren.guardrail.json
{
"format": "contextetech/guardrail/v1",
"id": "contextetech/geheimnisse-api-schluessel-maskieren",
"description": "Schutzregel, die API-Schlüssel, Tokens, Passwörter, private Schlüssel und Verbindungszeichenfolgen maskiert, bevor ein Text, eine Datei oder ein Export an eine KI geht. Regeln, 14 Testfälle, Code.",
"license": "MIT",
"language": "de",
"type": "other",
"action": "mask",
"rules": "Vor dem Senden an die KI jedes Geheimnis maskieren, das Zugang zu einem Konto oder Dienst gibt:\n- API-Schlüssel (OpenAI, Anthropic, Mistral, Stripe, AWS…) und Zugriffstokens (GitHub, JWT);\n- Passwörter im Klartext (passwort=…, password: …);\n- private Schlüssel (-----BEGIN … PRIVATE KEY-----);\n- Zugangsdaten in einer Adresse (postgres://nutzer:passwort@server).\nDurchlassen: Platzhalter (IHR_API_SCHLUESSEL, xxx, <schlüssel>), Adressen ohne Zugangsdaten, Bestell- oder Commit-Nummern, Text über Passwörter ohne ein Passwort.\nAnwenden, bevor eine .env-Datei, ein Datenbankexport oder Logs in einen Assistenten kopiert werden.",
"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": "passwort = Sommer2026!",
"expected": "block"
},
{
"input": "Das Passwort muss mindestens 12 Zeichen lang sein.",
"expected": "allow"
},
{
"input": "Ersetzen Sie IHR_API_SCHLUESSEL durch den Schlüssel Ihres Kontos.",
"expected": "allow"
},
{
"input": "Die Dokumentation steht unter https://docs.beispiel.de/api.",
"expected": "allow"
},
{
"input": "Commit a1b2c3d behebt den Anmeldefehler.",
"expected": "allow"
},
{
"input": "Bestellung Nr. 2026-10-458712 wurde versandt.",
"expected": "allow"
},
{
"input": "Melden Sie sich mit Ihrem üblichen Konto an.",
"expected": "allow"
}
]
}Text prüfen (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|passwort|kennwort)\s*[:=]\s*[\"']?[^\s\"']{6,}",
}
PLACEHOLDERS = ("xxx", "...", "<", "your", "ihr_", "example_value")
def mask_secrets(text: str) -> tuple[str, bool]:
"""Ersetzt Geheimnisse durch [Typ maskiert]; gibt den Text und True zurück, wenn etwas maskiert wurde."""
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} maskiert]"
text = re.sub(pattern, repl, text)
return text, found
Community
Noch keine Kommentare. Teile deine Erfahrung, sie hilft den Nächsten.