Vangrail: API-sleutels en wachtwoorden maskeren
# Vangrail: API-sleutels en wachtwoorden maskeren code: 1wl94sp | type: guardrail | language: nl | licence: MIT | version: v1 description: Vangrail die API-sleutels, tokens, wachtwoorden, privésleutels en verbindingsstrings maskeert voordat een tekst, bestand of export naar een AI gaat. Regels, 14 testgevallen, code. page: https://contextetech.com/nl/vangrails/geheimen-api-sleutels-maskeren-1wl94sp mcp: connect https://contextetech.com/mcp then call load_resource with code "1wl94sp" (or ask "load 1wl94sp") json: https://contextetech.com/api/resources/contextetech--geheimen-api-sleutels-maskeren python: pip install contexte && contexte get 1wl94sp citation (required by the licence): contextetech. (2026). Vangrail: API-sleutels en wachtwoorden maskeren (Version 1) [Vangrail]. Contexte Tech. https://contextetech.com/nl/vangrails/geheimen-api-sleutels-maskeren-1wl94sp
Vangrail die API-sleutels, tokens, wachtwoorden, privésleutels en verbindingsstrings maskeert voordat een tekst, bestand of export naar een AI gaat. Regels, 14 testgevallen, code.
Regels
Maskeer vóór het versturen naar de AI elk geheim dat toegang geeft tot een account of dienst: - API-sleutels (OpenAI, Anthropic, Mistral, Stripe, AWS…) en toegangstokens (GitHub, JWT); - wachtwoorden in leesbare tekst (wachtwoord=…, password: …); - privésleutels (-----BEGIN … PRIVATE KEY-----); - inloggegevens in een adres (postgres://gebruiker:wachtwoord@server). Doorlaten: voorbeeldwaarden (JOUW_API_SLEUTEL, xxx, <sleutel>), adressen zonder inloggegevens, order- of commitnummers, tekst over wachtwoorden zonder wachtwoord. Toepassen voordat je een .env-bestand, een database-export of logs in een assistent plakt.
Testgevallen
| Invoer | Verwacht |
|---|---|
| AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE | Blokkeren |
| token: ghp_000000000000000000000000000000000000 | Blokkeren |
| ANTHROPIC_API_KEY=sk-ant-00000000000000000000000000000000 | Blokkeren |
| STRIPE_SECRET=sk_live_0000000000000000000000 | Blokkeren |
| DATABASE_URL=postgres://admin:S3cretPass@db.internal:5432/app | Blokkeren |
| -----BEGIN RSA PRIVATE KEY----- MIIEpAIBAAKCAQEA0000000000000000 -----END RSA PRIVATE KEY----- | Blokkeren |
| Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIwMDAwMDAifQ.0000000000000000000000 | Blokkeren |
| wachtwoord = Zomer2026! | Blokkeren |
| Het wachtwoord moet minstens 12 tekens lang zijn. | Toestaan |
| Vervang JOUW_API_SLEUTEL door de sleutel van je account. | Toestaan |
| De documentatie staat op https://docs.voorbeeld.nl/api. | Toestaan |
| Commit a1b2c3d lost de inlogfout op. | Toestaan |
| Bestelling nr. 2026-10-458712 is verzonden. | Toestaan |
| Log in met je gewone account. | Toestaan |
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|wachtwoord)\s*[:=]\s*[\"']?[^\s\"']{6,}",
}
PLACEHOLDERS = ("xxx", "...", "<", "your", "jouw_", "example_value")
def mask_secrets(text: str) -> tuple[str, bool]:
"""Vervangt geheimen door [type gemaskeerd]; geeft de tekst terug en True als er iets gemaskeerd is."""
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} gemaskeerd]"
text = re.sub(pattern, repl, text)
return text, found- Identificatie
- contextetech--geheimen-api-sleutels-maskeren
- Bestand
- geheimen-api-sleutels-maskeren.guardrail.json
- Formaat
- JSON (application/json)
- Grootte
- 2.581 bytes (2,5 KB)
- Codering
- UTF-8
- Geschatte tokens
- ≈ 714
- Commercieel gebruik
- Toegestaan
- Persoonsgegevens
- Geen
- Versie
- 1.0
- Gepubliceerd op
- 10 oktober 2026 om 04:24
- Bijgewerkt op
- 16 oktober 2026 om 23:20
- Opslag
- in de database
Statistieken
Likes : 0 · Reacties : 0
Klik op een teller om hem te tonen of te verbergen, beweeg over de grafiek voor details. Eén weergave per bezoeker per dag, bots uitgezonderd; geteld sinds 30 september 2026.
Geschatte kosten
- Invoertokens per aanroep
- ≈ 1.059
| Model | Per aanroep | Per maand |
|---|---|---|
| GPT-6 Luna · OpenAIbeste prijs | € 0,00009 | € 0,09 |
| DeepSeek Flash · DeepSeek | € 0,00028 | € 0,28 |
| Mistral Large · Mistral AI | € 0,00047 | € 0,47 |
| DeepSeek V4 Pro · DeepSeek | € 0,00123 | € 1,23 |
| GPT-6 Sol · OpenAI | € 0,00187 | € 1,87 |
| Claude Sonnet 5.5 · Anthropic | € 0,00187 | € 1,87 |
| Claude Opus 5.5 · Anthropic | € 0,00373 | € 3,73 |
| Zelf gehost open-sourcemodel (Ollama, vLLM) | € 0 aan API-kosten (alleen de server) | |
Alleen de invoerkosten, zonder het antwoord van het model. Openbare standaardprijzen van de aanbieders (Mistral AI, DeepSeek, OpenAI, Anthropic), omgerekend van USD naar euro tegen de ECB-koers van 13 oktober 2026. Schatting: 1 token ≈ 3,6 tekens.
Gemeenschappelijk voor de 3 regio's
Gemaakt door de auteur, zonder externe bron.
Commercieel gebruik toegestaan · auteur vermelden · wijzigingen toegestaan.
Alleen tekst of gegevens: geen toegang tot bestanden, netwerk of opdrachten.
Gehost in Frankrijk (Scaleway, Parijs). Geen doorgifte buiten de EU.
Europese Unie · 5/5
Geen persoonsgegevens.
Geen trainingsgegevens: geen samenvatting nodig.
Verenigde Staten · 5/5
Geen persoonsgegevens.
Geen trainingsgegevens: geen documentatie te publiceren.
China · 5/5
Geen persoonsgegevens.
Geen trainingsgegevens; door AI gegenereerde inhoud die in China wordt verspreid, moet worden gemarkeerd (2025).
Indicatieve samenvatting per 30/09/2026, zonder waarde als juridische certificering. Methode en bronnen →
Kwaliteit van de inhoud
De criteria in detail zijn voorbehouden aan leden.
Elk criterium, de afgetrokken punten en een tip om elk punt te verbeteren.
Inhoudsanalyse
De criteria in detail zijn voorbehouden aan leden.
Elk criterium, de afgetrokken punten en een tip om elk punt te verbeteren.
Berekend op basis van de inhoud van de resource, met regels, zonder AI. De score staat op het tabblad Kwaliteit.
MCP contexte
https://contextetech.com/mcp
laad 1wl94sp
Voeg het adres als connector toe in de instellingen van je AI-apps en stuur daarna het verzoek hierboven.
API
import json, urllib.request url = "https://contextetech.com/api/resources/contextetech--geheimen-api-sleutels-maskeren" fiche = json.load(urllib.request.urlopen(url)) print(fiche["title"] or fiche["name"])
geheimen-api-sleutels-maskeren.guardrail.json
{
"format": "contextetech/guardrail/v1",
"id": "contextetech/geheimen-api-sleutels-maskeren",
"description": "Vangrail die API-sleutels, tokens, wachtwoorden, privésleutels en verbindingsstrings maskeert voordat een tekst, bestand of export naar een AI gaat. Regels, 14 testgevallen, code.",
"license": "MIT",
"language": "nl",
"type": "other",
"action": "mask",
"rules": "Maskeer vóór het versturen naar de AI elk geheim dat toegang geeft tot een account of dienst:\n- API-sleutels (OpenAI, Anthropic, Mistral, Stripe, AWS…) en toegangstokens (GitHub, JWT);\n- wachtwoorden in leesbare tekst (wachtwoord=…, password: …);\n- privésleutels (-----BEGIN … PRIVATE KEY-----);\n- inloggegevens in een adres (postgres://gebruiker:wachtwoord@server).\nDoorlaten: voorbeeldwaarden (JOUW_API_SLEUTEL, xxx, <sleutel>), adressen zonder inloggegevens, order- of commitnummers, tekst over wachtwoorden zonder wachtwoord.\nToepassen voordat je een .env-bestand, een database-export of logs in een assistent plakt.",
"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": "wachtwoord = Zomer2026!",
"expected": "block"
},
{
"input": "Het wachtwoord moet minstens 12 tekens lang zijn.",
"expected": "allow"
},
{
"input": "Vervang JOUW_API_SLEUTEL door de sleutel van je account.",
"expected": "allow"
},
{
"input": "De documentatie staat op https://docs.voorbeeld.nl/api.",
"expected": "allow"
},
{
"input": "Commit a1b2c3d lost de inlogfout op.",
"expected": "allow"
},
{
"input": "Bestelling nr. 2026-10-458712 is verzonden.",
"expected": "allow"
},
{
"input": "Log in met je gewone account.",
"expected": "allow"
}
]
}Een tekst controleren (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|wachtwoord)\s*[:=]\s*[\"']?[^\s\"']{6,}",
}
PLACEHOLDERS = ("xxx", "...", "<", "your", "jouw_", "example_value")
def mask_secrets(text: str) -> tuple[str, bool]:
"""Vervangt geheimen door [type gemaskeerd]; geeft de tekst terug en True als er iets gemaskeerd is."""
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} gemaskeerd]"
text = re.sub(pattern, repl, text)
return text, found
Community
Nog geen reacties. Deel je ervaring, daar heeft de volgende iets aan.