Skip to main content

DSGVO-konformes Erkennen und Ersetzen von PII in LLM-Prompts

Project description

privacy-guard

PyPI Python License: MIT Tests PyPI Publish Docker Publish Docker Hub

DSGVO/GDPR-konforme PII-Anonymisierung für LLM-Workflows.

privacy-guard erkennt personenbezogene Daten zuverlässig in deutschem Text, ersetzt sie durch stabile Platzhalter und ermöglicht eine saubere Rückführung nach der Verarbeitung. Kein ML-Inference-Overhead zur Laufzeit für die meisten Detektoren, klare Ergebnisse, API-ready.

privacy-guard hero

Highlights

  • 🔒 Compliance-first: Schutz sensibler Daten vor externen LLMs
  • ⚡ Runtime-freundlich: Regex/Regel-Detektoren ohne schweren Inference-Stack
  • 🔁 Deterministisch: stabile Platzhalter plus verlustfreie Rückführung
  • 🐳 Deploy-ready: Python Package und FastAPI/Docker sofort nutzbar

Warum privacy-guard?

  • Schützt sensible Daten vor dem Versand an externe Modelle
  • Ersetzt PII durch deterministische Platzhalter wie [NAME_1], [IBAN_1]
  • Stellt Originalwerte mit ScanResult.restore() wieder her
  • Löst überlappende Treffer mit Prioritätslogik (z. B. SECRET > IBAN > SOCIAL_SECURITY > EMAIL > ...)
  • Unterstützt Python-Package und FastAPI/Docker-Betrieb

Erfasste PII-Typen

Typ Beispiel Methode
NAME Dr. Anna Schmidt spaCy NER (de_core_news_sm)
IBAN DE89 3704 0044 0532 0130 00 Regex + ISO-7064-Prüfziffer
CREDIT_CARD 4111 1111 1111 1111 Regex + Luhn-Algorithmus
PERSONAL_ID C22990047 Regex — Personalausweis & Reisepass (gleiches Format)
SOCIAL_SECURITY 12 345678 X 123 Regex — Rentenversicherungsnummer
TAX_ID 12 345 678 903 Regex + mod-11-Prüfziffer (§ 139b AO)
PHONE +49 89 12345678 Regex — DACH-Formate
EMAIL kontakt@example.de Regex
ADDRESS Hauptstraße 12, 79100 Freiburg Regex aus Daten-Dateien
SECRET AWS-Key, GitHub-PAT, … 100+ Musterregeln (TOML)
URL_SECRET ?token=abc123def456 Regex — Query-Parameter-Werte

Priorität bei überlappenden Treffern: SECRET = URL_SECRET > IBAN = CREDIT_CARD = SOCIAL_SECURITY > PERSONAL_ID = TAX_ID = EMAIL > PHONE > ADDRESS > NAME

Personen des öffentlichen Lebens werden per interner Whitelist (~1 000 Einträge) standardmäßig nicht maskiert.

Installation

Python Package

pip install privacy-guard-scanner

Für den Namensdetektor wird ein spaCy-Modell benötigt:

pip install "de_core_news_sm @ https://github.com/explosion/spacy-models/releases/download/de_core_news_sm-3.8.0/de_core_news_sm-3.8.0-py3-none-any.whl"
# oder:
python -m spacy download de_core_news_sm

API-Stack lokal

pip install -e ".[api]"
uvicorn api.main:app --reload --port 8000

Quickstart (Python)

from privacy_guard import PrivacyScanner

scanner = PrivacyScanner()

result = scanner.scan(
    "Bitte überweise 500 EUR an Hans Müller, "
    "IBAN DE89 3704 0044 0532 0130 00. "
    "Rückfragen an h.mueller@example.de oder +49 89 123456."
)

print(result.anonymised_text)
# Bitte überweise 500 EUR an [NAME_1], IBAN [IBAN_1]. Rückfragen an [EMAIL_1] oder [PHONE_1].

print(result.mapping)
# {'[NAME_1]': 'Hans Müller', '[IBAN_1]': 'DE89 3704 0044 0532 0130 00', ...}

llm_answer = "Vielen Dank, [NAME_1]. Die Daten zu [IBAN_1] sind verarbeitet."
print(result.restore(llm_answer))
# Vielen Dank, Hans Müller. Die Daten zu DE89 3704 0044 0532 0130 00 sind verarbeitet.

Scanner konfigurieren

from privacy_guard import PiiType, PrivacyScanner

scanner = PrivacyScanner(extra_whitelist_names=["Erika Musterfrau"])
scanner.disable_detector(PiiType.NAME)
scanner.enable_detector(PiiType.NAME)

result = scanner.scan("Kontakt: erika@example.de")

Nur bestimmte Findings auswerten:

from privacy_guard import PiiType

secrets = [f for f in result.findings if f.pii_type == PiiType.SECRET]
for finding in secrets:
    print(finding.rule_id, finding.text, finding.confidence)

Web-UI

Der API-Server enthält eine integrierte HTMX-Oberfläche — kein separater Prozess, keine CDN-Abhängigkeiten. img.png

uvicorn api.main:app --reload
# → http://localhost:8000

Login

Standardmäßig wird ein admin-Account mit Passwort admin angelegt (über UI_ADMIN_PASSWORD änderbar). Nach dem Login stehen drei Tabs zur Verfügung:

Tab Beschreibung
Live Test Text eingeben, Detektoren auswählen, Scan starten — Original und anonymisierten Text nebeneinander sehen
History Alle eigenen Scans (Admins sehen alle Nutzer); Klick auf eine Zeile zeigt Findings-Detail
Dashboard Gesamtstatistiken, PII-Typ-Balkendiagramm, Scans-pro-Tag-Liniendiagramm (Chart.js)

Admins sehen zusätzlich den Tab API Keys.

API-Key-Verwaltung (Admin)

Über den Tab 🔑 API Keys können beliebig viele API-Keys angelegt und gesperrt werden:

  1. Name eingeben → Key generieren
  2. Den vollständigen Key (pg_…) kopieren — er wird nur einmal angezeigt
  3. Gespeichert wird ausschließlich der SHA-256-Hash; der Prefix (pg_xxxxxxxxx…) bleibt sichtbar
  4. Keys können jederzeit einzeln gesperrt werden

Der über die Umgebungsvariable API_KEY gesetzte Key bleibt parallel gültig (Rückwärtskompatibilität).

REST API (Docker)

docker run -p 8000:8000 noxway/privacy-guard:latest

Alternativ via Compose:

docker compose up

Endpunkte

Methode Pfad Beschreibung
GET /health Liveness-Check
POST /scan Vollständiger Scan (Findings + Mapping + anonymisierter Text)
POST /anonymize Nur anonymisierten Text zurückgeben

Request-Body

{
  "text": "Hans Müller, IBAN DE89370400440532013000",
  "detectors": ["IBAN", "EMAIL"],
  "whitelist": ["Hans Müller"]
}

Beispiel mit curl

curl -X POST http://localhost:8000/scan \
  -H "Content-Type: application/json" \
  -d '{"text": "Kontakt: hans@example.de, IBAN DE89370400440532013000", "detectors": ["EMAIL", "IBAN"]}'

Mit API-Key-Authentifizierung:

curl -X POST http://localhost:8000/scan \
  -H "Content-Type: application/json" \
  -H "X-API-Key: pg_…" \
  -d '{"text": "hans@example.de"}'

Konfiguration

Variable Standard Bedeutung
API_KEY leer Wenn gesetzt, muss X-API-Key mitgesendet werden (Env-Var-Key oder DB-Key)
CORS_ORIGINS * Kommagetrennte Origins, z. B. https://app.example.com
UI_DB_PATH ui.db Pfad zur SQLite-Datenbank (Nutzer, Scans, API-Keys)
UI_ADMIN_PASSWORD admin Passwort des automatisch angelegten Admin-Accounts

Beispiel:

services:
  api:
    image: noxway/privacy-guard:latest
    ports:
      - "8000:8000"
    environment:
      API_KEY: my-secret-key
      CORS_ORIGINS: https://app.example.com
      UI_DB_PATH: /data/ui.db
      UI_ADMIN_PASSWORD: sicher123
    volumes:
      - ui_data:/data

volumes:
  ui_data:

Roadmap-Ideen

  • Verbesserte Entitäten-Erkennung für Adressen in DACH-Varianten
  • Optionales Audit-Logging für Compliance-Reports
  • Erweiterte Mehrsprachigkeit über Deutsch hinaus
  • Prüfziffernvalidierung für Personalausweis/Reisepass

Lizenz

MIT. Details in LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

privacy_guard_scanner-1.0.6.tar.gz (30.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

privacy_guard_scanner-1.0.6-py3-none-any.whl (38.0 kB view details)

Uploaded Python 3

File details

Details for the file privacy_guard_scanner-1.0.6.tar.gz.

File metadata

  • Download URL: privacy_guard_scanner-1.0.6.tar.gz
  • Upload date:
  • Size: 30.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for privacy_guard_scanner-1.0.6.tar.gz
Algorithm Hash digest
SHA256 df7ed49670cdf11c80eaacc682b5bf1ae4c34f36d300330b70055a4db191bbd3
MD5 3da3a576eb3b60fad60844ff0bb2d570
BLAKE2b-256 663538ab219bcafdfb64577c0abcfaab8e0c8499556a0e56721080c0c65afb40

See more details on using hashes here.

Provenance

The following attestation bundles were made for privacy_guard_scanner-1.0.6.tar.gz:

Publisher: release.yml on adrian-lorenz/privacy-guard

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file privacy_guard_scanner-1.0.6-py3-none-any.whl.

File metadata

File hashes

Hashes for privacy_guard_scanner-1.0.6-py3-none-any.whl
Algorithm Hash digest
SHA256 823930c74373aef27a49e7d75a1a7ca9742b46a41765413b5bfcd6dd57d5e229
MD5 e19a3d10aa4893abed78dc7cb06a55c9
BLAKE2b-256 5d1d34f2d875e01223cfad77f9f43ffa36412baebd7f7f875be310a45b74fd46

See more details on using hashes here.

Provenance

The following attestation bundles were made for privacy_guard_scanner-1.0.6-py3-none-any.whl:

Publisher: release.yml on adrian-lorenz/privacy-guard

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page