Initial: Privacy Gateway Projekt mit Team-Implementierung
This commit is contained in:
@@ -0,0 +1,161 @@
|
||||
# 🔐 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
|
||||
|
||||
```typescript
|
||||
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`
|
||||
```typescript
|
||||
{
|
||||
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`
|
||||
```typescript
|
||||
{
|
||||
success: boolean;
|
||||
reidentifiedText: string;
|
||||
replacementsMade: number;
|
||||
errors: string[];
|
||||
}
|
||||
```
|
||||
|
||||
### `createAnonymizer(config?)`
|
||||
|
||||
Erstellt eine konfigurierte Anonymizer-Instanz.
|
||||
|
||||
```typescript
|
||||
const anonymizer = createAnonymizer({
|
||||
ollamaUrl: 'http://localhost:11434',
|
||||
model: 'llama3.2',
|
||||
timeoutMs: 30000,
|
||||
maxRetries: 2,
|
||||
fallbackEnabled: true,
|
||||
});
|
||||
```
|
||||
|
||||
## Konfiguration
|
||||
|
||||
Umgebungsvariablen:
|
||||
```bash
|
||||
OLLAMA_URL=http://192.168.2.122:11434
|
||||
OLLAMA_MODEL=llama3.2
|
||||
OLLAMA_TIMEOUT=30000
|
||||
```
|
||||
|
||||
## Integration im Backend
|
||||
|
||||
```typescript
|
||||
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
|
||||
|
||||
```bash
|
||||
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
|
||||
Reference in New Issue
Block a user