Optimierung, Tests und Sicherheit

Erkennung von personenbezogenen Daten und Geheimnissen in Prompts

Wie API-Schlüssel, Passwörter und personenbezogene Daten in LLM-Prompts gelangen, wie die Erkennung sensibler Informationen funktioniert und wie man schwärzt, bevor etwas gesendet wird.

Übersetzt aus dem englischen Original. Code, Prompts und Modellausgaben bleiben auf Englisch.

Jeder Prompt, der an ein gehostetes Modell gesendet wird, verlässt Ihre Umgebung. Enthält er einen API-Schlüssel, ein Passwort oder die personenbezogenen Daten eines Kunden, liegen diese Informationen nun in den Systemen eines anderen und möglicherweise in Logs auf beiden Seiten. Die Erkennung sensibler Informationen ist die Praxis, diesen Inhalt zu finden, bevor der Prompt gesendet wird.

Wie sensible Daten in Prompts gelangen

Selten absichtlich. Die üblichen Wege:

  • Eingefügte Logs und Stacktraces, die Tokens, Verbindungsstrings oder Sitzungs-Cookies enthalten.
  • Konfigurationsdateien, die zur Fehlersuche geteilt werden: .env, YAML, Terraform.
  • Code mit fest eingetragenen Zugangsdaten.
  • Kundendatensätze in Support-Tickets, E-Mails und Chat-Protokollen.
  • Abgerufene Dokumente, die mehr enthalten, als die Frage braucht.
  • Prompt-Dateien in einem Repository, in denen jemand mit einem echten Schlüssel getestet hat.
  • Werkzeugergebnisse in einer Agentenschleife, die ungefiltert an das Modell weitergegeben werden.

Zwei Kategorien, zwei Arten von Risiko

Geheimnisse gewähren Zugriff: API-Schlüssel, Tokens, Passwörter, private Schlüssel, Verbindungsstrings. Ein geleaktes Geheimnis kann sofort verwendet werden. Die Reaktion ist, es zu widerrufen und zu rotieren.

Personenbezogene Daten (PII) identifizieren Menschen: Namen, E-Mail-Adressen, Telefonnummern, Postadressen, Zahlungskartennummern, nationale Ausweisnummern. Sie zu senden kann gegen Ihre Datenschutzzusagen oder das Gesetz verstoßen, und sie lassen sich nicht rotieren.

Wie die Erkennung funktioniert

Detektoren kombinieren mehrere Methoden, weil jede blinde Flecken hat.

Bekannte Formate. Viele Anbieter stellen Schlüssel mit erkennbarem Präfix und erkennbarer Länge aus. Diese lassen sich mit hoher Sicherheit zuordnen.

Kontextmuster. Eine Zuweisung wie password = "..." oder api_key: ... kennzeichnet den Wert als Zugangsdaten, unabhängig vom Format.

Entropie. Zufällige Zeichenfolgen haben eine hohe Shannon-Entropie. Ein langer Wert mit hoher Entropie neben einem Wort wie „token“ oder „secret“ sind wahrscheinlich Zugangsdaten, selbst in einem unbekannten Format.

Strukturierte Bezeichner. E-Mail-Adressen, Telefon- und Kartennummern folgen Mustern. Kartennummern lassen sich mit einer Prüfsumme bestätigen.

Erkennung benannter Entitäten. Statistische Modelle finden Namen, Organisationen und Orte, die kein festes Muster haben. Mehr Abdeckung, mehr Fehlalarme, und es braucht ein Modell.

Der PromptFlowEngine-Prompt-Sicherheitsscanner nutzt die ersten vier. Er ist deterministisch und läuft lokal, sodass der auf Geheimnisse geprüfte Text für die Prüfung nirgendwohin gesendet wird.

Melden Sie Positionen, niemals Werte

Ein Detektor, der das gefundene Geheimnis ausgibt, hat eine zweite Kopie des Geheimnisses erzeugt, in einem Log oder einem Terminal. Ein wohlerzogener Scanner liefert nur die Kategorie und die Position zurück:

{
  "hasSensitiveData": true,
  "countsByCategory": { "api_key": 1, "email": 1 },
  "matches": [
    { "category": "api_key", "start": 118, "end": 164 },
    { "category": "email", "start": 176, "end": 196 }
  ]
}

Das ist die Form, die PromptFlowEngine in jeder Oberfläche zurückgibt. Ein durchgespieltes Beispiel finden Sie in der Regel für sensible Daten.

Schwärzung

Schwärzung ersetzt jeden erkannten Wert durch einen Platzhalter, der den Sinn des umgebenden Texts erhält.

Before: Connect with postgres://admin:hunter2@db.internal:5432/app
After:  Connect with [REDACTED_CONNECTION_STRING]

Typisierte Platzhalter wie [REDACTED_API_KEY] sind besser als eine Reihe von Sternchen, weil das Modell weiß, was für eine Art Ding dort stand, und darüber nachdenken kann („der Verbindungsstring wirkt fehlerhaft“), ohne es zu sehen.

Für personenbezogene Daten, auf die sich die Aufgabe beziehen muss, verwenden Sie innerhalb einer Anfrage konsistente Pseudonyme: Jedes Vorkommen einer E-Mail wird zu [EMAIL_1], die nächste Adresse zu [EMAIL_2]. Das Modell kann dann Personen auseinanderhalten, und Ihre Anwendung kann die Platzhalter nach der Antwort zurückabbilden.

Wo die Prüfung hingehört

Erkennen Sie so früh wie möglich und an mehr als einer Stelle.

Wo Was sie abfängt
Im Editor oder Chat-Feld Ein Einfügen, vor dem Senden
Im Anwendungscode, vor dem API-Aufruf Daten von Nutzern, Datensätzen und Abruf
Zwischen Agentenschritten Werkzeugergebnisse, die in den Kontext gelangen sollen
In der CI, auf Prompt-Dateien In ein Repository eingecheckte Zugangsdaten
Vor dem Logging Inhalt, der gespeichert werden soll

Die Chrome-Erweiterung warnt, solange ein Entwurf in ChatGPT, Claude oder Gemini ein Geheimnis enthält, und kann es auf Ihrem Gerät schwärzen. Die VS-Code-Erweiterung führt vor dem Senden eines Prompts an den Chat einen Datenschutzwächter aus, mit den Modi strikt, schwärzen und warnen. In der CI lässt das Prüf-Gate standardmäßig bei jedem kritischen Fund fehlschlagen, sodass ein eingecheckter Schlüssel den Build stoppt.

Richtlinienentscheidungen: blockieren, schwärzen oder warnen

  • Blockieren, wenn ein Geheimnis niemals gesendet werden darf. Am sichersten, am störendsten.
  • Schwärzen als Standard. Der Prompt geht ohne die sensiblen Werte durch.
  • Warnen, wenn ein Mensch entscheiden soll, zum Beispiel bei einem möglichen Fehlalarm im Code.

Was auch immer Sie wählen: Wenden Sie die Erkennung von Geheimnissen lokal an. Eine Prüfung, die den Text an einen entfernten Dienst sendet, um herauszufinden, ob es sicher ist, ihn zu senden, verfehlt ihren Zweck.

Grenzen, die Sie kennen sollten

  • Falsch-negative Ergebnisse. Ein Geheimnis in ungewöhnlichem Format oder personenbezogene Daten ohne Muster, etwa die Beschreibung einer Person, können durchrutschen. Die Erkennung senkt das Risiko; sie bescheinigt nicht, dass ein Prompt sauber ist.
  • Falsch-positive Ergebnisse. Hashes, UUIDs und Test-Fixtures können wie Geheimnisse aussehen. Setzen Sie bekannte sichere Werte auf eine Erlaubnisliste, statt die Prüfung zu deaktivieren.
  • Bilder und Dateien. Textscanner lesen keine Screenshots oder PDFs, wenn diese nicht zuvor umgewandelt werden.
  • Kontext. Ein Name ist in einem Zusammenhang öffentlich und in einem anderen vertraulich. Nur Ihre Richtlinie kann das entscheiden.

Über die Erkennung hinaus: Senden Sie weniger

Die zuverlässigste Kontrolle besteht darin, die Daten gar nicht erst einzubeziehen.

  • Übergeben Sie eine ID und lassen Sie ein Werkzeug den Datensatz nachschlagen, sodass das Modell nie Felder sieht, die es nicht braucht.
  • Entfernen Sie Felder, bevor Sie den Prompt aufbauen.
  • Behalten Sie Zugangsdaten in Ihrer Anwendung und geben Sie sie Werkzeugen direkt. Ein Modell braucht Ihren API-Schlüssel nie, um ein Werkzeug zu bitten, eine API aufzurufen.
  • Verwenden Sie Testdaten in Beispielen und Prompt-Dateien.

Wenn ein Geheimnis bereits gesendet wurde

  1. Widerrufen und rotieren Sie es sofort. Behandeln Sie es als kompromittiert.
  2. Prüfen Sie die Zugriffslogs auf Verwendung.
  3. Entfernen Sie es aus der Repository-Historie und den Prompt-Dateien.
  4. Fügen Sie eine Prüfung hinzu, damit derselbe Weg beim nächsten Mal abgefangen wird.

Das umgebende Bedrohungsmodell finden Sie unter Prompt-Sicherheit. Zu Angriffen, die versuchen, Daten abzugreifen, sobald sie im Kontext sind, siehe Prompt-Injection.