Files
privacy-gateway/anonymizer

🔐 Privacy Gateway Anonymizer

PII-Erkennungs- und Anonymisierungs-Service für das Privacy Gateway. Nutzt lokale LLMs (Ollama) zur Erkennung persönlicher Daten mit Pattern-basiertem Fallback.

Features

  • 🤖 LLM-basierte PII-Erkennung via Ollama
  • 🛡️ 10 PII-Typen erkannt: Namen, Adressen, E-Mails, Telefonnummern, IBANs, etc.
  • 🔄 Re-Identifizierung für nachgelagerte Prozesse
  • Pattern-Fallback bei LLM-Ausfall
  • 📊 Sensitivitäts-Bewertung (low/medium/high/critical)
  • 💾 Mapping-Serialisierung für Persistenz

Schnellstart

import { anonymize, reIdentify } from './index.js';

// Anonymisieren
const result = await anonymize(
  'Hallo Max Mustermann, kontaktiere mich unter max@beispiel.de'
);

console.log(result.anonymizedText);
// "Hallo [NAME_1], kontaktiere mich unter [EMAIL_1]"

// Re-Identifizieren
const restored = reIdentify(result.anonymizedText, result.mapping);
console.log(restored.reidentifiedText);
// "Hallo Max Mustermann, kontaktiere mich unter max@beispiel.de"

Unterstützte PII-Typen

Typ Beschreibung Beispiel Sensitivität
name_person Personenname Max Mustermann 🔴 high
name_company Firmenname Musterfirma GmbH 🟡 medium
address Vollständige Adresse Musterstraße 1, 12345 Berlin 🔴 high
email E-Mail-Adresse max@beispiel.de 🔴 high
phone Telefonnummer (DE) +49 170 12345678 🟡 medium
birthdate Geburtsdatum 15.03.1985 🔴 high
account_number Kontonummer 1234567890 🔴 critical
iban IBAN DE89 3704... 🔴 critical
employee_id Personalnummer EMP-12345 🟡 medium
credit_card Kreditkartennummer 4111 1111... 🔴 critical

API-Referenz

anonymize(text, config?)

Anonymisiert einen Text durch Erkennung und Ersetzung von PII.

Parameter:

  • text (string): Zu anonymisierender Text
  • config (optional): Konfigurationsobjekt

Rückgabe: AnonymizeResult

{
  success: boolean;
  anonymizedText: string;
  mapping: ReverseMapping;
  sensitivityLevel: 'low' | 'medium' | 'high' | 'critical';
  piiCount: number;
  processingTimeMs: number;
  error?: string;
  usedFallback?: boolean;
}

reIdentify(anonymizedText, mapping, options?)

Stellt einen anonymisierten Text wieder her.

Parameter:

  • anonymizedText (string): Anonymisierter Text mit Platzhaltern
  • mapping (ReverseMapping): Mapping von Platzhalter zu Originalwert
  • options (optional): Optionen für die Re-Identifizierung

Rückgabe: ReidentifyResult

{
  success: boolean;
  reidentifiedText: string;
  replacementsMade: number;
  errors: string[];
}

createAnonymizer(config?)

Erstellt eine konfigurierte Anonymizer-Instanz.

const anonymizer = createAnonymizer({
  ollamaUrl: 'http://localhost:11434',
  model: 'llama3.2',
  timeoutMs: 30000,
  maxRetries: 2,
  fallbackEnabled: true,
});

Konfiguration

Umgebungsvariablen:

OLLAMA_URL=http://192.168.2.122:11434
OLLAMA_MODEL=llama3.2
OLLAMA_TIMEOUT=30000

Integration im Backend

import { getAnonymizer, maskForLog } from '@privacy-gateway/anonymizer';

const anonymizer = getAnonymizer();

// Vor dem Senden an externe KI
const { anonymizedText, mapping, sensitivityLevel } = await anonymizer.anonymize(userInput);

// Log mit maskierten Werten
console.log(`Sensitivität: ${sensitivityLevel}, PII: ${piiCount}`);

// Nach Antwort der KI
const restored = anonymizer.reIdentify(aiResponse, mapping);

Tests

npm test

Projektstruktur

anonymizer/
├── src/
│   ├── index.ts              # Haupt-Export
│   ├── anonymizer.ts         # Kern-Logik
│   ├── reverser.ts           # Re-Identifizierung
│   ├── pii-types.ts          # Typ-Definitionen
│   ├── prompts/
│   │   └── pii-detection.ts  # LLM-Prompts
│   ├── utils/
│   │   └── text.ts           # Hilfsfunktionen
│   └── test/
│       └── test-cases.ts     # Testfälle
├── package.json
├── tsconfig.json
├── Dockerfile
└── README.md

Lizenz

MIT