Schutzregel DSGVO: Steuer-ID, Telefon und IBAN maskieren
DSGVO-Schutzregel: maskiert Steuer-ID (mit Prüfziffer), Telefonnummern +49, IBAN und private E-Mails in Antworten eines KI-Assistenten. 12 Tests.
Règles
Vor dem Versand alle Daten maskieren, die eine Person identifizieren oder erreichbar machen: - private E-Mail-Adressen (max.mustermann@…); - deutsche Telefonnummern, mit oder ohne +49; - deutsche IBAN; - Steuer-Identifikationsnummern (Prüfziffer wird geprüft). Durchlassen: allgemeine Adressen (info@, support@…), Firmennamen, Beträge, Datumsangaben, Bestellnummern.
Cas de test
| Entrée | Attendu |
|---|---|
| Schreiben Sie an max.mustermann@gmail.com für den Status. | Bloquer |
| Meine Handynummer ist 0151 2345 6789. | Bloquer |
| Rufen Sie mich unter +49 30 1234567 an. | Bloquer |
| Überweisung an DE89 3704 0044 0532 0130 00. | Bloquer |
| Meine Steuer-ID lautet 86095742719. | Bloquer |
| Rechnung bitte an anna.schmidt@firma-gmbh.de. | Bloquer |
| Schreiben Sie an support@contextetech.com bei Fragen. | Laisser passer |
| Ihre Bestellung Nr. 458712 wird morgen versendet. | Laisser passer |
| Der Betrag beträgt 1.250,00 € inkl. MwSt. | Laisser passer |
| Termin am 12.10.2026 um 14 Uhr. | Laisser passer |
| Die Müller Bau GmbH hat das Angebot angenommen. | Laisser passer |
| Hallo, wie kann ich Ihnen helfen? | Laisser passer |
Code
import re
MUSTER = {
"email": r"[\w.+-]+@[\w-]+\.[\w.-]+",
"telefon": r"(?:\+49[\s/-]?|\b0)(?:1[5-7]\d|[2-9]\d{1,3})[\s/-]?\d{3,4}[\s-]?\d{3,5}\b",
"iban": r"\bDE\d{2}(?:\s?\d{4}){4}\s?\d{2}\b",
"steuer_id": r"\b[1-9]\d{10}\b",
}
GENERISCH = ("info@", "kontakt@", "support@", "service@", "hallo@")
def steuer_id_gueltig(wert: str) -> bool:
"""Steuerliche Identifikationsnummer: Prüfziffer nach ISO 7064 (MOD 11, 10)."""
produkt = 10
for ziffer in wert[:10]:
summe = (int(ziffer) + produkt) % 10 or 10
produkt = (summe * 2) % 11
pruef = 11 - produkt
return (0 if pruef == 10 else pruef) == int(wert[10])
def maskieren(text: str) -> tuple[str, bool]:
"""Ersetzt personenbezogene Daten durch [<Typ> entfernt]; gibt den Text und True zurück, wenn etwas maskiert wurde."""
gefunden = False
for typ, muster in MUSTER.items():
def ersetzen(m):
nonlocal gefunden
wert = m.group(0)
if typ == "email" and wert.lower().startswith(GENERISCH):
return wert
if typ == "steuer_id" and not steuer_id_gueltig(wert):
return wert
gefunden = True
return f"[{typ} entfernt]"
text = re.sub(muster, ersetzen, text)
return text, gefundenCoût estimé
Tokens d'entrée par appel : ≈ 934
| Modèle | Par appel | Pour 1 000 appels |
|---|---|---|
| Mistral Large · Mistral AI | 0,00041 € | 0,41 € |
| DeepSeek Flash · DeepSeek | 0,00025 € | 0,25 € |
| DeepSeek V4 Pro · DeepSeek | 0,00109 € | 1,09 € |
| GPT-6 Luna · OpenAI | 0,00008 € | 0,08 € |
| GPT-6 Sol · OpenAI | 0,00165 € | 1,65 € |
| Claude Sonnet 5.5 · Anthropic | 0,00165 € | 1,65 € |
| Claude Opus 5.5 · Anthropic | 0,00329 € | 3,29 € |
| 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--personenbezogene-daten-maskieren-dsgvo
- Type
- Garde-fous
- Fichier
- personenbezogene-daten-maskieren-dsgvo.guardrail.json
- Format
- JSON (application/json)
- Taille
- 2 049 octets (2 Ko)
- Encodage
- UTF-8
- Tokens estimés
- ≈ 565
- Langue
- Allemand
- Licence
- MIT
- Usage commercial
- Autorisé
- Données personnelles
- Fictives (inventées)
- Version
- 1.0
- Publié le
- 3 octobre 2026 à 05:20
- Mis à jour le
- 3 octobre 2026 à 05:20
- Stockage
- en base
- Utilisations
- 0
- J'aime
- 0
personenbezogene-daten-maskieren-dsgvo.guardrail.json
{
"format": "contextetech/guardrail/v1",
"id": "contextetech/personenbezogene-daten-maskieren-dsgvo",
"description": "DSGVO-Schutzregel: maskiert Steuer-ID (mit Prüfziffer), Telefonnummern +49, IBAN und private E-Mails in Antworten eines KI-Assistenten. 12 Tests.",
"tags": [
"dsgvo",
"personenbezogene-daten",
"sicherheit"
],
"license": "MIT",
"language": "de",
"type": "pii",
"action": "mask",
"rules": "Vor dem Versand alle Daten maskieren, die eine Person identifizieren oder erreichbar machen:\n- private E-Mail-Adressen (max.mustermann@…);\n- deutsche Telefonnummern, mit oder ohne +49;\n- deutsche IBAN;\n- Steuer-Identifikationsnummern (Prüfziffer wird geprüft).\nDurchlassen: allgemeine Adressen (info@, support@…), Firmennamen, Beträge, Datumsangaben, Bestellnummern.",
"cases": [
{
"input": "Schreiben Sie an max.mustermann@gmail.com für den Status.",
"expected": "block"
},
{
"input": "Meine Handynummer ist 0151 2345 6789.",
"expected": "block"
},
{
"input": "Rufen Sie mich unter +49 30 1234567 an.",
"expected": "block"
},
{
"input": "Überweisung an DE89 3704 0044 0532 0130 00.",
"expected": "block"
},
{
"input": "Meine Steuer-ID lautet 86095742719.",
"expected": "block"
},
{
"input": "Rechnung bitte an anna.schmidt@firma-gmbh.de.",
"expected": "block"
},
{
"input": "Schreiben Sie an support@contextetech.com bei Fragen.",
"expected": "allow"
},
{
"input": "Ihre Bestellung Nr. 458712 wird morgen versendet.",
"expected": "allow"
},
{
"input": "Der Betrag beträgt 1.250,00 € inkl. MwSt.",
"expected": "allow"
},
{
"input": "Termin am 12.10.2026 um 14 Uhr.",
"expected": "allow"
},
{
"input": "Die Müller Bau GmbH hat das Angebot angenommen.",
"expected": "allow"
},
{
"input": "Hallo, wie kann ich Ihnen helfen?",
"expected": "allow"
}
]
}Vérifier un texte (Python)
import re
MUSTER = {
"email": r"[\w.+-]+@[\w-]+\.[\w.-]+",
"telefon": r"(?:\+49[\s/-]?|\b0)(?:1[5-7]\d|[2-9]\d{1,3})[\s/-]?\d{3,4}[\s-]?\d{3,5}\b",
"iban": r"\bDE\d{2}(?:\s?\d{4}){4}\s?\d{2}\b",
"steuer_id": r"\b[1-9]\d{10}\b",
}
GENERISCH = ("info@", "kontakt@", "support@", "service@", "hallo@")
def steuer_id_gueltig(wert: str) -> bool:
"""Steuerliche Identifikationsnummer: Prüfziffer nach ISO 7064 (MOD 11, 10)."""
produkt = 10
for ziffer in wert[:10]:
summe = (int(ziffer) + produkt) % 10 or 10
produkt = (summe * 2) % 11
pruef = 11 - produkt
return (0 if pruef == 10 else pruef) == int(wert[10])
def maskieren(text: str) -> tuple[str, bool]:
"""Ersetzt personenbezogene Daten durch [<Typ> entfernt]; gibt den Text und True zurück, wenn etwas maskiert wurde."""
gefunden = False
for typ, muster in MUSTER.items():
def ersetzen(m):
nonlocal gefunden
wert = m.group(0)
if typ == "email" and wert.lower().startswith(GENERISCH):
return wert
if typ == "steuer_id" and not steuer_id_gueltig(wert):
return wert
gefunden = True
return f"[{typ} entfernt]"
text = re.sub(muster, ersetzen, text)
return text, gefunden
Communauté
Pas encore de commentaire. Partagez votre retour, il aidera les suivants.